Contours Matching - Finden der Konturenverschiebung

16

Ich habe auf zwei Bildern mit demselben Objekt Konturen gefunden und möchte die Verschiebung und Drehung dieses Objekts feststellen. Ich habe es mit gedrehten Begrenzungsrahmen dieser Konturen und ihren Winkeln und Mittelpunkten versucht, aber Drehungen der Begrenzungsrahmen geben keine Auskunft über die korrekte Konturrotation, da dies auch für die Winkel a + 0, a + 90, a + 180 usw. gilt. grad. Ist es eine andere gute Möglichkeit, die Rotation und Verschiebung von Konturen zu finden? Möglicherweise etwas Gebrauch der konvexen Hülle, Konvexitätsdefekte? Ich habe in Learning OpenCv über das Anpassen von Konturen gelesen, aber es hat nicht geholfen. Könnte jemand ein Beispiel geben?

Beispiele:

1 2 3 4

Ich möchte zum Beispiel ein rosa Quadrat und im zweiten Fall einen Stift erkennen. Andere Beispiele könnten Quadrate mit einigen Löchern, Sternen usw. sein. Vorschläge sind willkommen, da ich so viele Methoden wie möglich testen möchte.

krzych
quelle
Bild würde hier helfen
mirror2image
Ich möchte eine universelle Funktion machen. Also als Testbild kann man alles machen. Einfaches Formelement als Rechteck oder etwas komplexeres Formelement.
Krzych
2
Nun, Sie können nicht für alle Fälle eine einzige Methode anwenden. Die praktische Methode hängt vom Kontrastumfang, der Rauschschätzung, dem Hintergrund und der Form selbst ab - es geht um Glätte, Topologie usw. Deshalb würde das Bild helfen.
mirror2image

Antworten:

4

Müssen Sie sich um einen Unterschied im Maßstab zwischen den Konturen sorgen? Wenn nicht, können Sie einfach den Schwerpunkt jeder Kontur finden und die Verschiebung berechnen, indem Sie einen von den anderen subtrahieren. Dann können Sie die Hauptachsen der Konturen berechnen und den Drehwinkel zwischen ihnen ermitteln.

Wenn es sich um eine Skalierung handelt, können Sie den Skalierungsfaktor berechnen, indem Sie das Verhältnis der entsprechenden Hauptachsen verwenden.

Dima
quelle
Ja Maßstab kann auch abweichen. Ich dachte auch an etwas Ähnliches wie Freeman-Ketten von opencv, indem ich Freeman-Ketten von jeder Kontur herstellte und sie dann verglich und versuchte, auf irgendeine Weise eine Übersetzung zu finden, aber ich kann keinen guten Algorithmus dafür finden.
Krzych
Es ist dasselbe wie das Erstellen eines minimalen gedrehten Begrenzungsrahmens und das Aufnehmen seiner Drehung und Verschiebung. Versuchte diesen Ansatz und die Ergebnisse sind unbefriedigend. Ich denke, diese Methode ist überhaupt nicht gut.
Krzych
Können Sie genauer sagen, warum das nicht funktioniert hat? Sind Konturen nur durch Verschiebung, Drehung und Skalierung verbunden oder können sie auf andere Weise deformiert werden? Einige Bilder würden wirklich helfen. Wenn Sie nicht affine Transformationen oder zufälliges Rauschen verarbeiten müssen, können Sie den Formkontext ausprobieren. Lassen Sie mich wissen, ich kann Sie auf einige Papiere verweisen.
Dima
Sie sind nur durch Verschiebung, Drehung und Skalierung miteinander verbunden, Verformungen sind mit einer geringfügig unterschiedlichen Konturerfassung auf verschiedenen Fotos verbunden. Kontext gestalten? Könnten Sie dies erweitern?
Krzych
1
@kzych Es sieht so aus, als ob Ihr größtes Problem hier Rauschen in der Kantenerkennung wäre. Wie findet man die minimal gedrehte Box? Mir ist immer noch nicht klar, warum das nicht richtig funktioniert. Formkontext ist eine Möglichkeit, eine Kontur darzustellen. Die Details sind hier: en.wikipedia.org/wiki/Shape_context
Dima
2

Wenn Sie sich keine Gedanken über Skalierung oder projektive Verzerrungen machen müssen, können Kettencodes hier Abhilfe schaffen. Wenn Sie Kettencodes mit ungefähr der gleichen Form und dem gleichen Maßstab haben, können Sie eine Übersetzung mit eindimensionaler FFT-Phasenkorrelation finden: http://en.wikipedia.org/wiki/Phase_correlation

Wenn Sie projektive Verzerrungen berücksichtigen müssen, können Sie auch Feature-Punkte (wie Ecken) anstelle von Konturen verwenden.

mirror2image
quelle
Irgendwelche Ratschläge, wie man einen guten Kettencode erstellt? Vielleicht etwas von OpenCv (soweit ich weiß, hat es nur Freeman-Ketten)? Im Moment erstelle ich Kettencodes mit jedem Konturpunkt und berechne den Winkel zur x-Achse der Nachbarpunkte, aber vielleicht gibt es eine bessere Idee? Wenn Sie sich auf gute Artikel über Ketten beziehen, wären wir Ihnen dankbar.
Krzych
2

In der Frage sagst du

Wie gesagt, ich möchte etwas einzigartiges machen

aber ich fürchte, es ist ziemlich schwierig, eine "universelle" Lösung für das Problem zu finden.

Sie können eine im Handel erhältliche Pattern-Locator-Software kaufen und in Ihre Anwendung integrieren. In der Regel funktionieren sie für eine Vielzahl von Anwendungen recht gut. Nur um Ihnen eine Idee zu geben, dies ist das Referenzhandbuch für ein solches Produkt http://www.lmi3d.com/sites/default/files/support/4.2.0.70-hexsight_user_guide.pdf

Sie können auch eine Ad-hoc-Lösung für einen bestimmten Fall entwickeln (z. B. für den Stift in Ihrem Bild).

Andernfalls können Sie das Problem gründlich untersuchen, ausgehend von den grundlegenden Grundlagen der Berechnungsgeometrie ( http://www.cs.sunysb.edu/~algorith/files/shape-similarity.shtml ), wo Ihre "Konturen" genannt werden "polygon", liest Sachen wie:

M. de Berg, O. Devillers, M. Kreveld, O. Schwarzkopf und M. Teillaud. Berechnen der maximalen Überlappung von zwei konvexen Polygonen unter Übersetzungen. Theoretical Computer Science, 31: 613–628, 1998.

und

H. Ahn, O. Cheong, C. Park, C. Shin und A. Vigneron. Maximierung der Überlappung von zwei planaren konvexen Mengen unter starren Bewegungen. Computational Geometry: Theory and Applications, 37: 3–15, 2007.

und endend mit "Hierarchische Echtzeiterkennung zusammengesetzter Objekte in Bildern" von Markus Ulrich, der mit MVTec zusammenarbeitet , einem anderen Softwarehaus, das Objekterkennungssoftware-Tools verkauft.

Alessandro Jacopson
quelle