Como estimar a oitava e o tamanho dos recursos visuais posicionados nos cantos de Harris

9

Atualmente, estou trabalhando e comparando o desempenho de vários detectores de recursos fornecidos pelo OpenCV como base para a correspondência visual de recursos.

Eu estou usando descritores SIFT . Consegui uma correspondência satisfatória (após rejeitar correspondências incorretas) ao detectar os recursos MSER e DoG (SIFT) .

Atualmente, estou testando meu código com o GFTT (Bons recursos para rastrear - cantos de Harris) para obter uma comparação e também porque na aplicação final, um conjunto de recursos do GFTT estará disponível no processo de rastreamento de recursos visuais.

Estou usando o cv::FeatureDetector::detect(...)que me fornece um std::vector<cv::KeyPoint>preenchido com os recursos / pontos-chave / regiões de interesse detectados . A estrutura cv::KeyPointcontém informações básicas sobre a localização do recurso, bem como informações sobre sizee octaveem que o ponto-chave foi detectado.

Meus primeiros resultados com o GFTT foram terríveis até comparar os parâmetros sizee típicos octaveem diferentes tipos de recursos:

  • MSER define o tamanho (entre 10 e 40 px) e deixa a oitava em 0
  • DoG (SIFT) define o tamanho e a oitava ( proporção tamanho / oitava entre 20 e 40)
  • GFTT os parâmetros são sempre : tamanho = 3 , oitava = 0

Presumo que isso ocorra porque o objetivo principal dos recursos GFTT não era para ser usado na correspondência, mas apenas no rastreamento. Isso explica a baixa qualidade dos resultados da correspondência, uma vez que os descritores extraídos desses recursos minúsculos deixam de ser discriminatórios e invariantes para muitas coisas , incluindo pequenas mudanças de 1 pixel.

Se eu definir manualmente a sizede GFTT de 10-12 , eu obter bons resultados, muito semelhantes ao usar MSER ou cão (SIFT) .

Minha pergunta é: existe uma maneira melhor de determinar quanto aumentar o size(e / ou octave) do que apenas ir-com-10-ver-se-funciona ? Quero evitar a codificação do sizeaumento, se possível, e determiná-lo programaticamente, mas a codificação está correta , desde que eu tenha argumentos sólidos para fazer backup das minhas escolhas do novo algoritmosize / sizeaumentar / sizeestimar .

Penélope
fonte
11
Ei, Penelope: confira este link, esse cara já fez um bom trabalho. [ Computer-vision-talks.com/2011/08/…
@Sistu ei, isso parece uma comparação geral muito boa de descritores em um caso geral e com um objeto plano, mas estou trabalhando em tipos específicos de imagens e preciso fazer meu próprio teste. Além disso, a pergunta era muito mais específica do que "preciso de materiais de referência comparando o desempenho de vários tipos de descritores". É um bom link, porém, vai dar uma olhada.
Penelope

Respostas:

4

Não tenho certeza de que haja realmente uma boa resposta à sua pergunta precisa: o espaço de escala do SIFT e do SURF foi realmente desenvolvido para estimar automaticamente o "bom" tamanho relevante da vizinhança em torno de um ponto-chave em forma de esquina (que são as boas características rastrear são).

Agora, respostas mais positivas seriam:

  • crie um banco de dados de pontos-chave e boas correspondências (por exemplo, usando padrões de calibração quadrados) e crie uma avaliação de desempenho automatizada nesse banco de dados para encontrar o tamanho correto. Essa tarefa pode realmente ser automatizada (consulte o trabalho de Mikolajczyk e Schmid sobre a avaliação de correspondência de pontos)

  • incorpore seus bons recursos em uma pirâmide de imagens para também ter algum tipo de escala associada a eles. Você pode procurar referências em pontos de interesse FAST e Harris em várias escalas, que fazem algo muito semelhante a este procedimento.

Para encontrar heuristicamente o tamanho máximo do bloco, você pode calcular estimativas de suas imagens com um desfoque de caixa (que é mais ou menos o que o operador blockSize faz) e ver quando o canto desaparece. Observe, no entanto, que mais desfoque afasta o canto da sua verdadeira localização.

Se você está realmente procurando alguma solução rápida e suja, tente tamanhos entre 5x5 e 11x11 (tamanhos típicos usados ​​na correspondência de blocos estéreo). Se você estiver procurando por um critério intelectualmente satisfatório, tente maximizar a probabilidade de uma boa correspondência de dois pontos de recurso abaixo do seu nível de ruído.

sansuiso
fonte
Eu estava procurando por uma solução um pouco mais rápida e suja do que o que você propõe. Além disso, só posso determinar se uma partida é boa ou ruim depois que meus pontos-chave são extraídos e combinados com alguma coisa. Mesmo que eu os combine de forma totalmente aleatória, recebo boas combinações - então sua primeira sugestão não é tão útil. Quanto à segunda parte, mais rápida e suja: eu sei que não há parâmetro perfeito, mas como eu disse, aumentar o tamanho para 12 ajudou - a qualidade era comparável à correspondência SIFT e MSER. Eu só tenho nenhum argumento algum para escolher 12 ao longo de um 100 ou mais de 34 ...
penelope
0

Para ajudar a determinar os melhores parâmetros para os detectores, o OpenCV possui o AjusterAdapter para esse fim. Eu nunca o usei, mas provavelmente é a maneira padrão de determinar programaticamente os parâmetros. Lembre-se também de que, embora os Keypoints tenham várias propriedades, nem todos fazem sentido para todos os algoritmos. Como a estrutura Keypoint é usada para algoritmos diferentes, ela possui todos esses campos, mas às vezes eles não são usados, é por isso que você obtém essas oitavas = 0; IMO.

Rui Marques
fonte
Sei que alguns tipos de recursos às vezes não são o melhor para algum objetivo, mas trabalhos recentes tentam abordagens em que usam mais de um tipo de v.features / regiões de interesse e obtêm melhores resultados com a combinação do que com qualquer tipo único por si só (posso adicionar links para obras, se você estiver interessado). Além disso, o que estou fazendo é pelo menos uma parte da pesquisa; portanto, tentar e avaliar os resultados alcançados com diferentes tipos de pontos-chave é o que devo fazer, mesmo que alguns desses resultados não sejam tão bons quanto o estado da arte. arte. Vou dar uma olhada no AdjusterAdapter, obrigado.
Penelope
Eu apenas olhei através da função que a interface fornece. Ele só pode aumentar ou diminuir o número de recursos que o detector detecta. Além disso, não tenho problemas com os recursos detectados. Gostaria apenas como uma forma de ajustar seu tamanho para que eles pudessem ser melhor utilizado na correspondência (aumentando o tamanho para 10 faz isso, mas eu não tenho nenhuma argumentação concreta (o suficiente) para que escolha)
penelope