Problemas de desempenho usando o detector / descritor BRISK OpenCV

Estou com um problema de desempenho ao usar o BRISK para detecção e descrição de recursos no OpenCV.

Basicamente, tento combinar todos os descritores que recebo desta imagem:

contra todos os descritores que recebo de um banco de dados de imagens usando o matcher baseado em flann com o algoritmo LSH e BRISK para detecção e descrição de recursos.

Meu banco de dados de imagens é composto por 242 imagens. Nestas 242 imagens, há três imagens correspondentes a cada objeto capturado separadamente na consulta de imagem "complexa" acima.

Aqui estão os parâmetros usados para a detecção do BRISK (parâmetros opencv padrão): Limite: 30, Oitavas: 4, Escala de padrão: 1,0.

Após a correspondência de flann usando a melhor técnica de correspondência (cada descritor na consulta de imagem é associado à vizinhança mais próxima no conjunto de descritores de banco de dados), meu algoritmo exibe a lista de imagens de banco de dados classificadas por porcentagem de correspondência. Aqui estão os quatro primeiros resultados:

Imagem correspondente ao parafuso no banco de dados: 4 correspondências / 15 pontos-chave detectados => Porcentagem correspondente:26,7%.A imagem correspondente à garrafa no banco de dados tem 4 correspondências / 15 pontos-chave detectados => Porcentagem correspondente:26,7%.A imagem correspondente ao parafuso no banco de dados tem 10 correspondências / 59 pontos-chave detectados => Porcentagem correspondente:16,9%.Imagem correspondente a um objeto que não está presente na consulta de imagem: 1 correspondência / 16 pontos-chave detectados => Porcentagem correspondente:16,7%.

Comparei esses resultados usando ORB como detecção e descrição de recursos. Aqui estão os parâmetros utilizados: Número de recursos: 2000, Fator de escala: 1,2, Número de níveis da pirâmide: 8.

Aqui estão os resultados que eu recebo:

Imagem correspondente ao parafuso no banco de dados: 576 correspondências / 752 pontos-chave detectados => Porcentagem correspondente:76,6%.A imagem correspondente à garrafa no banco de dados tem 111 correspondências / 189 pontos-chave detectados => Porcentagem correspondente:58,7%.A imagem correspondente à caneta no banco de dados possui 124 correspondências / 293 pontos-chave detectados => Porcentagem correspondente:42,3%.Imagem correspondente a um objeto que não está presente na consulta de imagem: 2 correspondências / 66 pontos-chave detectados => Porcentagem correspondente:3%

Como você pode ver, os resultados são muito melhores com o ORB. Primeiro, há mais pontos-chave detectados em cada imagem no banco de dados e a porcentagem de correspondência é significativamente melhor para os bons objetos. Além disso, a diferença entre a porcentagem de correspondência para os objetos bons e a porcentagem de correspondência para os objetos errados é mais significativa.

Estou me perguntando por que o detector BRISK detecta muito menos pontos-chave que o detector ORB. Fiz testes diferentes para descobrir como eu poderia detectar mais pontos-chave com o detector BRISK (diminua o limite, diminua o número da oitava). Eu posso realmente detectar um pouco mais de pontos-chave, mas a diferença com o detector ORB ainda é realmente importante. Você tem alguma idéia de por que o detector BRISK tem esse comportamento?

Minha versão do OpenCV é 2.4.8, mas tentei a parte de detecção do BRISK com a versão 2.4.4 e 2.4.9, de acordo com estas instruções:

http://code.opencv.org/issues/2491 eO detector de recursos BRISK detecta zero pontos-chave sem melhorias.

Também tentei combinar o detector ORB com a descrição do BRISK. Os resultados correspondentes são melhores do que com o primeiro método (BRISK completo), mas piores que o segundo (ORB completo):

Imagem correspondente ao parafuso no banco de dados: 529 correspondências / 708 pontos-chave detectados => Porcentagem correspondente:74,7%.A imagem correspondente à garrafa no banco de dados possui 69 correspondências / 134 pontos-chave detectados => Porcentagem correspondente:51,5%.A imagem correspondente à caneta no banco de dados corresponde a 93/247 pontos-chave detectados => Porcentagem correspondente:37,6%.Imagem correspondente a um objeto que não está presente na consulta de imagem: 5 correspondências / 50 pontos-chave detectados => Porcentagem correspondente:10%.

Observe que o número de pontos-chave detectados em cada imagem não é o mesmo no método 2 e no método 3. Na verdade, quando executo esse código em uma imagem de teste (aqui a imagem do parafuso):

// BRISK parameters
int Threshl=30;
int Octaves=4;
float PatternScales=1.0f;

// ORB parameters
int nFeatures=2000;
float scaleFactor=1.2f;
int nLevels=8;


BRISK  BRISKD(Threshl, Octaves, PatternScales);
ORB ORBD(nFeatures, scaleFactor, nLevels);

vector<KeyPoint> kpts;
Mat descriptors;

Mat img = cv::imread("Path to the bolt image", IMREAD_GRAYSCALE );
ORBD.detect(img,kpts); // Number of keypoints detected = 752
BRISKD.compute(img, kpts, descriptors); // Number of descriptors = 708

O BRISK parece não calcular todos os pontos-chave detectados nos descritores (752 pontos-chave detectados pelo detector ORB => 708 descritores computados pelo descritor BRISK).

No entanto, mesmo que todos os pontos-chave detectados pelo ORB não sejam computados nos descritores do BRISK. Parece com esses resultados que o BRISK não é melhor para descrever um ponto-chave que o ORB? Corrija-me se estiver errado, mas tenho certeza de que deve ser o contrário ...

Se vocês tiverem algum elemento que possa me ajudar a entender meus resultados ou se já tiverem tido alguns problemas com o BRISK no OpenCV, por favor me avise. Qualquer ajuda seria muito apreciada :).

questionAnswers(1)

yourAnswerToTheQuestion