Ich arbeite in OpenCV, aber ich denke nicht, dass es eine Funktion dafür gibt. Ich kann eine Funktion finden, um affine Transformationen zu finden, aber affine Transformationen beinhalten Skalierung, und ich möchte nur Rotation + Translation berücksichtigen.
Stellen Sie sich vor, ich habe zwei Sätze von Punkten in 2D - nehmen wir an, jeder Satz hat genau 50 Punkte.
z. setze A = {x1, y1, x2, y2, ..., x50, y50}
setze B = {x1 ', y1', x2 ', y2', ..., x50 ', y50'}
Ich möchte die Rotations- und Translationskombination finden, die dem Mapping-Satz A am nächsten kommt. Ich denke, ich würde "am nächsten" definieren, da der durchschnittliche Abstand zwischen Punkten in A und entsprechenden Punkten in BIE minimiert wird zwischen (x1, y1) und (x1 ', y1') usw.
Ich denke, ich könnte alle möglichen Übersetzungen und Rotationen mit Brute-Force-Tests testen, aber das wäre äußerst ineffizient. Kennt jemand einen einfacheren Weg?
Danke!
Dieses Problem hat eine sehr elegante Lösung hinsichtlich der Singulärwertzerlegung der Abstandsmatrix (Abstände zwischen Punktpaaren). Der Name ist das orthogonale Procrustes-Problem , nach der griechischen Legende von einem Kerl, der Reisenden ein Bett angeboten hat, das zu jedem passt .
Die Lösung kommt von der Suche nach der nächsten orthogonalen Matrix zu einer gegebenen (nicht notwendigerweise orthogonalen) Matrix.
Wie ich es in Excel machen würde, mache ich ein paar Spalten, die die Punkte darstellen.
Zellen, die die Rotation / Translation eines Satzes darstellen (es ist nicht notwendig, beide zu rotieren und zu übersetzen).
Dann rotiert / übersetzte Spalten, die diese gleichen Punkte repräsentieren.
Dann eine weitere Spalte für den Abstand zwischen den Punkten der gedrehten / übersetzten Punkte.
Dann eine Zelle der Summe der Abstände zwischen den Punkten.
Verwenden Sie schließlich Solver, um die Rotations- und Translationszellen zu optimieren.
Wenn Sie eine Rotation korrigieren, können Sie eine Antwort mit ternärer Suche erhalten. Führen Sie die Suche in x aus und für jedes getestete x führen Sie es in y aus, um den besten Wert zu erhalten. Dies wird Ihnen die richtige Antwort geben, da die Funktion (Summe der entsprechenden Abstände) konvex ist (dies kann bewiesen werden durch Beobachtung, dass die Einschränkung der Funktion auf irgendeine Linie eine eindimensionale konvexe Funktion ist; und die letzte ist eine Standardtatsache: die Summe mehrerer konvexer Funktionen ist konvex). Anstelle von roher Gewalt über den Winkel kann ich eine solche Methode basierend auf der ternären Suche vorschlagen. Wählen Sie einen nicht sehr großen Schritt S. Berechnen Sie die Zielfunktion für jeden Winkel in (0, S, 2S, ...). Dann, wenn S klein genug ist, können wir einige der Segmente (iS, (i + 1) S) aus der Betrachtung ausschließen. Nämlich solche mit relativ großen Funktionswerten mit Winkeln iS und (i + 1) S. Wenn es sorgfältig implementiert wird, kann es eine Antwort geben und es schneller als rohe Gewalt tun.
Tags und Links math opencv geometry rotation translation