Opencv match image de contour
j'aimerais savoir quelle serait la meilleure stratégie pour comparer un groupe de contours, en fait ce sont des contours résultant d'une détection de contours astucieux, à partir de deux images, afin de savoir quelle paire se ressemble le plus.
j'ai cette image:
http://i55.tinypic.com/10fe1y8.jpg
et je voudrais savoir comment je peux calculer lequel de ces deux correspond le mieux à c':
http://i56.tinypic.com/zmxd13.jpg
(il doit être l'un sur la droite)
y a-t-il de toute façon pour comparer les contours dans leur ensemble? Je peux facilement tourner les images mais je ne sais pas quelles fonctions utiliser pour calculer que l'image de référence sur la droite est la meilleure ajustement.
voici ce que j'ai déjà essayé avec opencv:
fonction matchShapes-j'ai essayé cette fonction en utilisant 2 images Gray scales et j'obtiens toujours le même résultat dans chaque image de comparaison et la valeur semble fausse puisqu'elle est 0,0002.
donc ce que j'ai réalisé à propos de matchShapes, mais je ne suis pas sûr que ce soit la bonne hypothèse, c'est que la fonction fonctionne avec des paires de contours et pas des images complètes. Maintenant c'est un problème parce que même si j'ai les contours des images que je veux comparer, ils sont des centaines et je ne sais pas lesquelles devraient être "jumelées".
Donc j'ai aussi essayé de comparer tous les contours de la première image contre les deux autres avec un itération mais je pourrais comparer, par exemple, le contour du 5 par rapport au contour du cercle des deux images de référence et non le contour du 2.
également essayé cv simple:: comparer la fonction et matchTemplate, aucun avec succès.
1 réponses
eh Bien, pour cela, vous avez deux options en fonction de la façon robuste vous avez besoin de votre approche.
Solutions simples (avec hypothèses):
pour ces méthodes, je suppose que les images que vous avez fournies sont celles avec lesquelles vous travaillez (i.e., les objets sont déjà segmentés et approximativement à la même échelle. Aussi, vous aurez besoin de corriger la rotation (au moins dans une grossière). Vous pourriez faire quelque chose comme tourner itérativement l'image de comparaison tous les 10, 30, 60, ou 90 degrés, ou n'importe quelle grossièreté que vous sentez vous pouvez vous en tirer.
Par exemple,
for(degrees = 10; degrees < 360; degrees += 10)
coinRot = rotate(compareCoin, degrees)
// you could also try Cosine Similarity, or even matchedTemplate here.
metric = SAD(coinRot, targetCoin)
if(metric > bestMetric)
bestMetric = metric
coinRotation = degrees
- somme des différences absolues (SAD): cela vous permettra de comparer rapidement les images Une fois que vous aurez déterminé un angle de rotation approximatif.
- Cosinus Similar: cela fonctionne un peu différemment en traitant l'image comme un vecteur 1D, puis calcule l'angle de la grande dimension entre les deux vecteurs. Le meilleur le match le plus l'angle sera.
solutions complexes (peut-être plus robustes):
ces solutions seront plus complexes à mettre en œuvre, mais donneront probablement des classifications plus robustes.
- Haussdorf Distance:réponse vous donnera une introduction sur l'utilisation de cette méthode. Cette solution nécessitera probablement aussi la correction de la rotation le travail correctement.
- Fourier-Mellin Transform: cette méthode est une extension de la corrélation de Phase, qui peut extraire la rotation, l'échelle, et la traduction (RST) transformer entre deux images.
- détection et Extraction des caractéristiques: cette méthode consiste à détecter les caractéristiques "robustes" (c.-à-d. invariantes de l'échelle et/ou de la rotation) dans l'image et à les comparer à un ensemble de caractéristiques cibles avec RANSAC, LMedS, ou des moindres carrés simples. OpenCV a quelques échantillons utilisant cette technique en matcher_simple.rpc et matching_to_many_images.rpc. NOTE: avec cette méthode, vous ne voudrez probablement pas binariser l'image, donc il y a plus de fonctions détectables disponibles.