OpenCV extrinsische Kamera von der feature-Punkte
Wie Kriege ich die rotationsmatrix, die übersetzung der Vektor-und vielleicht einige Skalierungsfaktoren der einzelnen Kamera mit OpenCV, wenn ich Bilder von einem Objekt aus der Sicht jeder dieser Kameras? Für jedes Bild habe ich die Bild-Koordinaten von mehreren feature-Punkte. Nicht alle feature-Punkte werden sichtbar in alle Bilder.
Ich möchte die Karte die berechneten 3D-Koordinaten des feature-Punkte des Objekts zu einem etwas anderen Objekt ausrichten, die die Form der das zweite Objekt das erste Objekt.
Ich habe gehört es ist möglich mit cv::calibrateCamera(...)
aber ich kann Sie nicht so Recht durch...
Hat jemand Erfahrungen mit dieser Art von problem?
InformationsquelleAutor der Frage Martin Hennig | 2011-11-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
War ich konfrontiert mit dem gleichen problem wie du, in OpenCV. Ich hatte eine stereo image pair-Mädchen und ich wollte, berechnete die externen Parameter der Kameras und die Welt-Koordinaten aller beobachteten Punkte. Dieses problem wurde hier behandelt:
Berthold K. P. Horn. Die Relative Orientierung revisited. Berthold K. P. Horn. Artificial Intelligence Laboratory, Massachusetts Institute of Technology, 545 Technology ...
http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.64.4700
Aber ich war nicht in der Lage zu finden, eine geeignete Implementierung für dieses problem (vielleicht findest du eins). Wegen zeitlicher Einschränkungen habe ich keine Zeit, das alles zu verstehen, die Mathematik in das Papier und setzen Sie um mich, so kam ich mit einem quick-und-dirty-Lösung, die für mich funktioniert. Ich werde erklären, was ich getan habe, um es zu lösen:
Angenommen, wir haben zwei Kameras, wobei die erste Kamera hat externe Parameter RT = Matx::Auge(). Jetzt vermuten über die die rotation R der zweiten Kamera. Für jedes paar Bild Punkte beobachtet, die in beiden Bildern berechnen wir die Richtungen Ihrer entsprechenden Strahlen in Welt-Koordinaten und speichern Sie in einem 2d-array dirs (EDIT: Die internen Parameter der Kamera sind davon ausgegangen, dass bekannt ist). Wir können dies, da wir davon ausgehen, dass wir wissen, dass Sie die Ausrichtung jeder Kamera. Jetzt bauen wir einen überdeterminierten lineares system AC = 0wo C ist das Zentrum der zweiten Kamera. Ich biete Ihnen mit der Funktion zur Berechnung:
Dann ruft cv::SVD::solveZ(A) geben Sie die least-squares Lösung von norm 1 in diesem system. Auf diese Weise erhalten Sie die rotation und translation von der zweiten Kamera. Da ich jedoch gerade eine Vermutung über die rotation der zweiten Kamera, ich mache mehrere Vermutungen über seine rotation (parametrisiert mit einem 3x1-Vektor omega, von dem ich die Berechnung der rotationsmatrix mittels cv::Rodrigues) und dann habe ich noch etwas verfeinern denke, durch die Lösung des Systems AC = 0 repetedly in einem Levenberg-Marquardt-Optimierer mit numerischer Jacobi. Es funktioniert für mich, aber es ist ein bisschen schmutzig, so dass Sie, wenn Sie Zeit haben, empfehle ich Ihnen, das umzusetzen, was erklärt wird in dem Papier.
EDIT:
Hier ist die routine in der Levenberg-Marquardt-Optimierer für die Bewertung der Vektor der Rückstände:
Durch die Art und Weise, suchte ich ein wenig im internet und fand einige andere code, der nützlich sein könnte für die Berechnung der relativen Orientierung zwischen den Kameras. Ich habe nicht versucht, irgendwelche code noch, aber es scheint nützlich:
http://www9.in.tum.de/praktika/ppbv.WS02/doc/html/reference/cpp/toc_tools_stereo.html
http://lear.inrialpes.fr/people/triggs/src/
http://www.maths.lth.se/vision/downloads/
InformationsquelleAutor der Antwort Rulle
Sind diese statischen Kameras, die Sie Kalibrieren möchten für die künftige Nutzung als stereo-paar? In diesem Fall würden Sie wollen, um die cv::stereoCalibrate() Funktion. OpenCV enthält einige Beispiel-code, eine von denen ist stereo_calib.cpp die möglicherweise Untersuchung Wert.
InformationsquelleAutor der Antwort Chris