2013-04-11 7 views
9

Ich entwickle eine Anwendung, in der ich SIFT + RANSAC und Homography benutze, um ein Objekt zu finden (OpenCV C++, Java). Das Problem, mit dem ich konfrontiert bin, ist, dass RANSAC, wo es viele Ausreißer gibt, schlecht abschneidet.SIFT Übereinstimmungen und Anerkennung?

Aus diesem Grund möchte ich versuchen, was der Autor von SIFT sagte, ziemlich gut zu sein: Voting.

ich gelesen habe, dass wir in einem 4-Dimension Merkmalsraum, in dem die vier Dimensionen stimmen sollten:

  • Ort [x, y] (jemand sagt traslation)
  • Maßstab
  • Orientierung

Während mit opencv ist einfach, das Spiel scale und orientation mit bekommen:

cv::Keypoints.octave 
cv::Keypoints.angle 

Ich habe schwer zu verstehen, wie ich den Standort berechnen kann.

Ich habe ein interesting slide wo mit nur one match wir sind in der Lage zu zeichnen einen Begrenzungsrahmen gefunden:

Aber ich weiß nicht bekommen, wie ich die Zeichen-Box mit nur einem Spiel ziehen konnte. Irgendeine Hilfe?

Antwort

5

Sie suchen nach dem größten Satz übereinstimmender Merkmale, die zu einer geometrischen Transformation von Bild 1 nach Bild 2 passen. In diesem Fall ist es die Ähnlichkeitstransformation mit 4 Parametern: Translation (dx, dy), Skalierungsänderung ds und Rotation d_theta.

Sagen wir, Sie zu Funktionen angepasst haben: f1 von Bild 1 und f2 von Bild 2. Es sei (x1,y1) die Lage von f1 in Bild 1 sei s1 seine Skala, und sei theta1 Orientierung es sein. Ähnlich haben Sie (x2,y2), s2 und theta2 für f2.

Die Übersetzung zwischen zwei Funktionen ist (dx,dy) = (x2-x1, y2-y1).

Der Maßstabswechsel zwischen zwei Funktionen ist ds = s2/s1.

Die Drehung zwischen zwei Funktionen ist d_theta = theta2 - theta1.

So dx, dy, ds und d_theta sind die Abmessungen Ihres Raumes Hough. Jeder Bin entspricht einer Ähnlichkeitstransformation.

Sobald Sie Hough voting durchgeführt haben und die maximale Bin gefunden haben, gibt Ihnen diese Bin eine Transformation von Bild 1 nach Bild 2. Sie können die Begrenzungsbox von Bild 1 verwenden und sie mit dieser Transformation transformieren: Wenden Sie die entsprechende Translation, Drehung und Skalierung auf die Ecken des Bildes an. In der Regel packen Sie die Parameter in eine Transformationsmatrix und verwenden homogene Koordinaten. Dadurch erhalten Sie die Begrenzungsbox in Bild 2, die dem von Ihnen erkannten Objekt entspricht.

+0

Ich habe die Antwort bearbeitet. – Dima

+1

Mit einer Übereinstimmung brauchen Sie die Hough-Transformation nicht. Sie nehmen den Unterschied in x und y (Translation), den Unterschied in der Orientierung (Rotation) und das Verhältnis der Skalen (Skala). Dann legst du diese in eine Matrix. – Dima

2

Um Dima zu vervollständigen, muss man hinzufügen, dass der 4D Hough Raum in eine (möglicherweise kleine) Anzahl von 4D Boxen quantisiert wird, wobei jede Box der durch ihr Zentrum gegebenen Ähnlichkeit entspricht.

Fügen Sie dann für jede mögliche Ähnlichkeit, die durch einen vorläufigen Abgleich von Merkmalen erhalten wird, 1 in das entsprechende Feld (oder Zelle) im 4D-Raum ein. Die Ausgabeähnlichkeit wird durch die Zelle mit den mehr Stimmen gegeben.

Um die Transformation von 1 Übereinstimmung zu berechnen, verwenden Sie einfach Dimas Formeln in seiner Antwort. Bei einigen Paaren von Übereinstimmungen müssen Sie möglicherweise eine Anpassung nach der Methode der kleinsten Quadrate verwenden.

Schließlich kann die Transformation mit der Funktion cv::warpPerspective() angewendet werden, wobei die dritte Zeile der perspektivischen Matrix auf [0,0,1] gesetzt ist.

+0

Dies erklärt nicht, wie man eine Bounding Box mit nur einer einzigen Übereinstimmung zeichnet – dynamic

+0

Die Bounding Box wird gezeichnet, indem die endgültige Ähnlichkeit (erhalten von 1 Übereinstimmung oder von Hough Voting) zu den blauen und gelben Kästchen auf dem Modellbild angewendet wird in dem neuen Bild. – sansuiso

+0

Können Sie ein Beispiel zur Berechnung der endgültigen Ähnlichkeitsmatrix veröffentlichen (nur eine Übereinstimmung berücksichtigen)? – dynamic

2

Wenn Sie die Hough-Transformation verwenden, erstellen Sie eine Signatur, die die Verschiebungsvektoren jedes Features aus dem Vorlagenschwerpunkt speichert (entweder (w/2,h/2) oder mit Hilfe von zentralen Momenten).

z. Für 10 SIFT-Merkmale, die auf der Schablone gefunden wurden, ist ihre relative Position gemäß dem Schwerpunkt der Schablone eine vector<{a,b}>. Jetzt suchen wir in einem Abfragebild nach diesem Objekt: Jede SIFT-Funktion im Abfragebild stimmt mit einer der 10 der Vorlage überein und gibt eine Stimme für den entsprechenden Schwerpunkt aus.

votemap(feature.x - a*, feature.y - b*)+=1 wobei a, b diesem bestimmten Merkmalsvektor entspricht.

Wenn einige dieser Funktionen am gleichen Punkt erfolgreich ausgeführt werden (Clustering ist erforderlich), haben Sie eine Objektinstanz gefunden.

enter image description here

Unterschrift und Abstimmung sind Reverse-Verfahren. Nehmen wir an, V=(-20,-10). Während der Suche im neuen Bild, wenn die zwei Übereinstimmungen gefunden werden, erkennen wir deren Ausrichtung und Größe und geben eine entsprechende Stimme ab. Z.B. Für den rechten Feldschwerpunkt wird V'=(+20*0.5*cos(-10),+10*0.5*sin(-10)) von der SIFT-Funktion entfernt sein, da es in halber Größe und um -10 Grad gedreht ist.

+0

Was meinst du "ein Spiel"? Was ist die Natur der übereinstimmenden Funktion? Ein Punkt (x, y) oder ein Bereich (x, y, a, b, Theta) wie die gelbe Box in Ihren Beispielen? – William

+0

Dann müssen Sie den SIFT ** Descriptor ** in die Signatur einfügen und aus dem DescriptorMatcher die Rotation und Skalierung für die übereinstimmenden Patches extrahieren. – William

Verwandte Themen