Eine Punktwolke wird mit einer einheitlichen Zufallsfunktion für erzeugt (x,y,z)
. Wie in der folgenden Abbildung gezeigt, wird eine flache Schnittebene ( Profil ) untersucht, die einem Zielprofil, dh in der linken unteren Ecke, als das beste (auch wenn nicht das exakte) Profil entspricht. Also die Frage ist:
1- Wie ein solches Spiel gegebener finden
target 2D point map
durchpoint cloud
Berücksichtigung der folgenden Hinweise / Bedingungen?
2- Was sind dann die Koordinaten / Orientierungen / Ähnlichkeitsgrade usw.?
Anmerkung 1: Das interessierende Profil kann sich an einer beliebigen Stelle mit Drehung entlang der Achsen befinden und je nach Position und Ausrichtung auch eine andere Form aufweisen, z. B. ein Dreieck, ein Rechteck oder ein Viereck. In der folgenden Demonstration wird nur ein einfaches Rechteck gezeigt.
Hinweis 2: Ein Toleranzwert kann als Abstand der Punkte vom Profil betrachtet werden. Um dies für die folgende Abbildung zu demonstrieren, sei eine Toleranz von 0.01
mal der kleinsten Abmessung (~1)
so angenommen tol=0.01
. Wenn wir also den Rest entfernen und alle verbleibenden Punkte auf die Ebene des untersuchten Profils projizieren, können wir die Ähnlichkeit mit dem Zielprofil überprüfen.
Hinweis 3: Ein verwandtes Thema finden Sie unter Punktmustererkennung .
Python
+MatPlotLib
, um meine Nachforschungen anzustellen und die Grafiken usw. zu generieren.P:{x,y,z}
. Sie sind in der Tat dimensionslose Punkte. Mit einer gewissen Annäherung könnten sie jedoch als 3D-Arrays zu einer Ein-Pixel-Dimension diskretisiert werden. Sie können auch andere Attribute (wie Gewichte usw.) über Koordinaten einbeziehen.Antworten:
Dies ist immer sehr rechenintensiv, insbesondere wenn Sie bis zu 2000 Punkte verarbeiten möchten. Ich bin mir sicher, dass es bereits hochoptimierte Lösungen für diese Art des Mustervergleichs gibt, aber Sie müssen erst herausfinden, wie es heißt, um sie zu finden.
Da es sich nicht um ein Bild, sondern um eine Punktwolke (spärliche Daten) handelt, trifft meine Kreuzkorrelationsmethode nicht wirklich zu (und wäre rechnerisch noch schlimmer). So etwas wie RANSAC findet wahrscheinlich schnell eine Übereinstimmung, aber ich weiß nicht viel darüber.
Mein Lösungsversuch:
Annahmen:
Sie sollten also in der Lage sein, viele Abkürzungen zu verwenden, indem Sie Dinge disqualifizieren und die Rechenzeit verkürzen. Zusamenfassend:
Genauer:
Welche Konfiguration den kleinsten Fehlerquadrat für alle anderen Punkte aufweist, ist die beste Übereinstimmung
Da wir mit 3 Testpunkten für den nächsten Nachbarn arbeiten, können übereinstimmende Zielpunkte vereinfacht werden, indem überprüft wird, ob sie sich innerhalb eines bestimmten Radius befinden. Wenn wir zum Beispiel aus (0, 0) nach einem Radius von 1 suchen, können wir (2, 0) basierend auf x1 - x2 disqualifizieren, ohne den tatsächlichen euklidischen Abstand zu berechnen, um ihn etwas zu beschleunigen. Dies setzt voraus, dass die Subtraktion schneller ist als die Multiplikation. Es gibt auch optimierte Suchen, die auf einem willkürlicheren festen Radius basieren .
Da Sie diese ohnehin alle berechnen müssen, unabhängig davon, ob Sie Übereinstimmungen finden oder nicht, und da Sie sich für diesen Schritt nur um die nächsten Nachbarn kümmern, ist es wahrscheinlich besser, diese Werte mit einem optimierten Algorithmus vorab zu berechnen, wenn Sie über den Speicher verfügen . So etwas wie eine Delaunay- oder Pitteway-Triangulation , bei der jeder Punkt im Ziel mit den nächsten Nachbarn verbunden ist. Speichern Sie diese in einer Tabelle und suchen Sie sie für jeden Punkt, wenn Sie versuchen, das Quellendreieck an eines der Zieldreiecke anzupassen.
Es sind viele Berechnungen erforderlich, aber es sollte relativ schnell gehen, da nur die Daten verarbeitet werden, die dünn sind, anstatt viele bedeutungslose Nullen miteinander zu multiplizieren, wie dies bei einer Kreuzkorrelation von Volumendaten der Fall wäre. Dieselbe Idee würde für den 2D-Fall funktionieren, wenn Sie zuerst die Mittelpunkteder Punkte fanden und sie als Satz von Koordinaten speicherten.
quelle
Fortran
Zahlen über500
Punkten unmöglich sein wird, Erfahrungen mit dem PC zu sammeln.Ich würde @ mirror2image description zu der alternativen Lösung neben RANSAC hinzufügen. Sie können den ICP-Algorithmus (iterativer nächster Punkt) in Betracht ziehen. Eine Beschreibung finden Sie hier !
Ich denke, die nächste Herausforderung bei der Verwendung dieses ICP besteht darin, Ihre eigene Kostenfunktion und die Startposition der Zielebene in Bezug auf die 3D-Wolkenpunktdaten zu definieren. Ein praktischer Ansatz besteht darin, während der Iteration ein zufälliges Rauschen in die Daten einzufügen, um eine Konvergenz mit den falschen Minima zu vermeiden. Dies ist der heuristische Teil, den Sie vermutlich entwerfen müssen.
Aktualisieren:
Die Schritte in vereinfachter Form sind:
Wiederholen Sie die Schritte 1-4.
Es gibt eine Bibliothek, die Sie hier ansehen können ! (Ich habe es noch nicht ausprobiert), es gibt einen Abschnitt im Registrierungsteil (einschließlich anderer Methoden).
quelle