Correspondência de contornos - localização do deslocamento de contornos

16

Encontrei contornos em duas imagens com o mesmo objeto e quero encontrar o deslocamento e a rotação desse objeto. Eu tentei com caixas delimitadoras giradas desses contornos e, em seguida, seus ângulos e pontos centrais, mas as rotações das caixas delimitadoras não informam corretamente a rotação do contorno, porque é o mesmo para os ângulos a + 0, a + 90, a + 180 etc. graus. Existe outra maneira boa de encontrar rotação e deslocamento de contornos? Talvez algum uso de casco convexo, defeitos de convexidade? Eu li no Learning OpenCv sobre correspondência de contornos, mas isso não ajudou. Alguém poderia dar um exemplo?

Exemplos:

1 2 3 4

Eu quero detectar, por exemplo, quadrado rosa e, no segundo caso, caneta. Outros exemplos podem ser quadrados com alguns buracos, estrelas etc. Como eu disse, quero fazer alguma coisa uniwersal. Todas as sugestões são apreciadas porque eu quero testar o maior número possível de métodos.

Krzych
fonte
A imagem ajudaria aqui
mirror2image
Eu quero fazer alguma função universal. Então, como imagem de teste pode ser qualquer coisa. Elemento em forma simples como retângulo, ou um pouco mais complexo.
krzych
2
Bem, você não pode ajustar um método único para todos os casos. O método prático depende da faixa de contraste, estimativa de ruído, fundo e forma - é suavidade, topologia, etc. É por isso que a imagem ajudaria.
mirror2image

Respostas:

4

Você precisa se preocupar com a diferença de escala entre os contornos? Caso contrário, você pode simplesmente encontrar o centróide de cada contorno e calcular o deslocamento subtraindo um do outro. Depois, você pode calcular os eixos principais dos contornos e encontrar o ângulo de rotação entre eles.

Se a escala estiver envolvida, você poderá calcular o fator de escala utilizando a razão dos eixos principais correspondentes.

Dima
fonte
Sim, a escala também pode ser diferente. Pensei também em algo semelhante às cadeias de homens livres da opencv, criando cadeias de homens livres de cada contorno e depois comparando-as e tentando encontrar uma tradução de alguma maneira, mas não consigo descobrir um bom algoritmo para isso.
krzych
É o mesmo que criar uma caixa delimitadora girada mínima e fazer sua rotação e deslocamento. Tentei essa abordagem e os resultados são insatisfatórios. Então, acho que esse método não é bom.
krzych
Você pode ser mais específico sobre por que isso não funcionou? Os contornos são relacionados apenas por translação, rotação e redimensionamento ou podem ser deformados de outras maneiras? Algumas fotos realmente ajudariam. Se você precisar manipular transformações não afins ou ruído aleatório, tente o contexto da forma. Deixe-me saber, eu posso apontar alguns documentos.
Dima
Eles são relacionados apenas por translação, rotação e escala, as deformações são conectadas à detecção de contorno pouco diferente em fotos diferentes. Contexto de forma? Você poderia expandir isso?
krzych
1
@kzych Parece que seu maior problema aqui seria ruído na detecção de borda. Como você encontra a caixa girada mínima? Ainda não estou claro por que isso não funciona direito. O contexto da forma é uma maneira de representar um contorno. Os detalhes estão aqui: en.wikipedia.org/wiki/Shape_context
Dima
2

Se você não precisar se preocupar com escala ou códigos de cadeia de distorções projetivas, pode ajudar aqui. Se você tiver códigos de cadeia com aproximadamente a mesma forma e a mesma escala, poderá encontrar a tradução com correlação de fase FFT unidimensional http://en.wikipedia.org/wiki/Phase_correlation

Se você precisar levar em consideração a distorção projetiva, considere também a possibilidade de usar pontos de recurso (como cantos) em vez de contornos.

mirror2image
fonte
Algum conselho sobre como criar um bom código de cadeia? Mayby algo do OpenCv (tanto quanto eu sei que só tem cadeias freeman)? Por enquanto, estou construindo códigos de cadeia usando cada ponto de contorno e calculando o ângulo para o eixo x dos pontos vizinhos, mas talvez haja alguma idéia melhor? Se você tiver alguma referência a algum bom artigo sobre correntes, seria bem-vindo.
krzych
2

Na pergunta que você diz

Como eu disse, quero fazer alguma coisa uniwersal

mas receio que seja muito difícil encontrar uma solução "universal" para o problema.

Você pode comprar um software localizador de padrões comercial disponível e integrá-lo ao seu aplicativo, geralmente eles apresentam um desempenho muito bom para uma ampla variedade de aplicativos. Apenas para se ter uma ideia, este é o manual de referência para esse produto http://www.lmi3d.com/sites/default/files/support/4.2.0.70-hexsight_user_guide.pdf

Além disso, você pode desenvolver uma solução ad hoc para um caso específico (por exemplo, a caneta na sua imagem).

Caso contrário, você poderá estudar muito o problema, partindo dos fundamentos muito básicos enraizados na geometria computacional ( http://www.cs.sunysb.edu/~algorith/files/shape-similarity.shtml ), onde seus "contornos" são chamados "polígono", lendo coisas como:

M. de Berg, O. Devillers, M. Kreveld, O. Schwarzkopf e M. Teillaud. Calculando a sobreposição máxima de dois polígonos convexos em traduções. Teórico Computer Science, 31: 613-628, 1998.

e

H. Ahn, O. Cheong, C. Park, C. Shin e A. Vigneron. Maximizando a sobreposição de dois conjuntos convexos planares sob movimentos rígidos. Geometria Computacional: Teoria e Aplicações, 37: 3–15, 2007.

e terminando com "Reconhecimento hierárquico em tempo real de objetos compostos em imagens", de Markus Ulrich, que colabora com o MVTec , outra empresa de software que vende ferramentas de software de reconhecimento de objetos.

Alessandro Jacopson
fonte