web-dev-qa-db-fra.com

Forme OPENCV correspondant entre deux formes similaires

J'essaie de faire correspondre une forme légèrement irrégulière à une base de données de formes. Par exemple, ici le contour que j'essaie de faire correspondre:

enter image description here

Pour plus d'informations, il s'agit d'un contour d'un connecteur HDMI, représenté comme un contour. Il est légèrement rugueux car cela a été pris avec un téléphone tout en maintenant le HDMI.

Ceci est ma base de données de connecteurs:

HDMI: enter image description here

DVI: enter image description here

5pindin : enter image description here

DB25: enter image description here

Celles-ci sont beaucoup plus claires car elles sont des contours recueillis à partir d'images de connecteurs d'Internet.

Pour ce que j'ai essayé:

cv2.matchshapes ()

Comme ce sont tous des contours, j'ai essayé directement les comparer à l'aide de la méthode MatchShapes () et n'a pas réussi à produire de bons résultats. Les similitudes entre le contour irrégulier et ma base de données ont été:

HDMI: 0.90

DB25: 0.84

5 broches DIN: 0.5

DVI: 0.21

Étant donné que les contours sont plus similaires, plus près de 0, le résultat du match est, l'algorithme a complètement échoué. J'ai essayé les autres méthodes de correspondance en changeant le troisième paramètre et en restant échoué.

ORBE:

Être semblable à Tamift, j'ai essayé le correspondant à KeyPoint. En moyenne la distance entre les différentes correspondances de ma base de données (après avoir trouvé les 15% des matchs):

mean([m.distance for m in matches])

Les distances sont venues comme suit:

Cinq broches DIN: 7.6

DB25: 11.7

DVI: 12.1

HDMI: 19.6

Comme cela classait un cercle comme la forme la plus comme mon contour, cela a également échoué.

Voici les points de clé correspondants de Orb de la machine à sous HDMI actuelle vs mon exemple de logement HDMI pour plus d'informations: enter image description here

Y a-t-il des idées/autres algorithmes que je devrais essayer? Ou est un CNN mon seul choix (que je préfère éviter car je n'ai pas la quantité appropriée de données).

6
Cyon

La réponse courte pour cet ensemble d'images est utilisée MatchShapes OpenCV Méthode I2 et recodez les Matchshapes de la méthode avec un "EPS" plus petit. double eps = 1.e-20; est plus que suffisamment petit.

Je suis un mentor de l'équipe de robotique de lycée et je pensais que les Matchshapes d'Opencv n'étaient que ce dont nous avions besoin d'améliorer la vision du robot (échelle, la traduction et la rotation invariante et facile à utiliser pour les élèves à utiliser dans le code OPENCV existant). Je suis tombé sur cet article quelques heures dans mes recherches et c'était horrible! Comment Matchshapes pourraient-ils jamais fonctionner pour nous avoir donné ces résultats? J'étais incrédule à propos de ces mauvais résultats.

J'ai codé mes propres matchshapes (In Java - c'est ce que les étudiants souhaitaient utiliser) pour voir quel est l'effet de la modification de l'EPS (la petite valeur qui protège apparemment la fonction Log10 de zéro et empêche De grandes divergences en les appelant un match parfait - le contraire de ce que c'est vraiment; Je n'ai pas pu trouver la base de la valeur). J'ai changé des matchshapes EPS en 1.E-20 du numéro de l'OpenCV 1.E-5 et obtenu bons résultats mais toujours le processus est déconcertant.

C'est merveilleux mais effrayant qui compte tenu de la bonne réponse, nous pouvons contenir un processus pour l'obtenir. L'image ci-jointe a toutes les 3 méthodes des comparaisons et des méthodes 2 et 3 du HU font un bon travail.

Mon processus a été sauvegardé les images ci-dessus, convertissez en binaire 1 canal, dilate 1, Erode 1, FindCountours, MatchShapes avec EPS = 1.E-20.

Method 2,Target HDMI with itself = 0., HDMI=1.15, DVI=11.48, DB25=27.37, DIN=74.82
Method 3,Target HDMI with itself = 0. ,HDMI=0.34, DVI= 0.48, DB25= 2.33, DIN= 3.29

Comparaisons contours et moments HU - Matchshapes 3 Méthodes

J'ai poursuivi mes recherches naïves (peu de fond de statistiques) et j'ai trouvé diverses autres moyens de faire des normalisations et des comparaisons. Je ne pouvais pas comprendre les détails du coefficient de corrélation Pearson et d'autres méthodes de co-variance et peut-être qu'ils ne sont pas appropriés. J'ai testé deux autres méthodes de normalisation et une autre méthode de correspondance.

OpenCV est normalisé avec la fonction Log10 pour les trois de ses calculs correspondants.

J'ai essayé de normaliser chaque paire de moments Hu avec le rapport à la valeur maximale de chaque paire Max (AI, BI) et j'ai essayé de normaliser chaque paire à une longueur de vecteur de 1 (diviser par SQRT de la somme des carrés).

J'ai utilisé ces deux nouvelles normalisations avant de calculer l'angle entre les moteurs 7-Dimension Hu Moments à l'aide de la méthode de la coine Theta et avant de calculer la somme des différences de paires d'éléments similaires à la méthode OpenCV I2.

Mes quatre nouvelles concoctions ont bien fonctionné mais n'ont rien contribué au-delà de l'OPENCV I2 avec des EPS "corrigés", à l'exception de la gamme de valeurs étaient plus petites et toujours commandées.

Notez que la méthode I3 n'est pas symétrique - échangeant la commande d'argumentation des matchshapes modifie les résultats. Pour cet ensemble d'images, mettez les moments "inconnus" comme premier argument et comparez avec la liste des formes connues comme deuxième argument pour les meilleurs résultats. L'inverse autour de modifier les résultats de la "mauvaise" réponse!

Le nombre 7 des méthodes correspondantes que j'ai tentées est simplement co-accessoire au nombre de moments de Hu - 7.

Description des indices correspondants pour les 7 calculs différents

|Id|normalization            |matching index computation       |best value|
|--|-------------------------|---------------------------------|----------|
|I1|OpenCV log               |sum element pair reciprocals diff|0|
|I2|OpenCV log               |sum element pair diff            |0|
|I3|OpenCV log               |maximum fraction to A diff       |0|
|T4|ratio to element pair max|vectors cosine angle             |1|
|T5|unit vector              |vectors cosine angle             |1|
|T6|ratio to element pair max|sum element pair diff            |0|
|T7|unit vector              |sum element pair diff            |0|

Résultats des indices correspondants pour 7 calculs différents pour chacune des 5 images

|               |  I1 |  I2 |  I3 |  T4 |  T5 |  T6 |  T7 |
|---------------|-----|-----|-----|-----|-----|-----|-----|     
|HDMI 0         | 1.13| 1.15| 0.34| 0.93| 0.92| 2.02| 1.72|
|DB25 1         | 1.37|27.37| 2.33| 0.36| 0.32| 5.79| 5.69|
|DVI 2          | 0.36|11.48| 0.48| 0.53| 0.43| 5.06| 5.02|
|DIN5 3         | 1.94|74.82| 3.29| 0.38| 0.34| 6.39| 6.34|
|unknown(HDMI) 4| 0.00| 0.00| 0.00| 1.00| 1.00| 0.00| 0.00|(this image matches itself)

[Création d'OPENCV Numéro 16997 pour remédier à cette faiblesse dans les matchshapes.]

2
Tommy131313