Ich habe Autopositionen in verschiedenen Frames aus dem Video aufgenommen . Angenommen, der Schwerpunkt des Autos (egleftes Seitenauto, das in den Bildern auf uns zukommt ) im Video-Frame1 ist P (x1, y1) und Q (x2, y2) im Video-Frame4.
Ist es möglich, P- und Q-Punkte in 3D darzustellen? damit ich den korrekten Pixelabstand d (PQ) berechnen und schließlich den tatsächlichen Abstand berechnen kann
Hinweis: Sie können davon ausgehen, dass die Kamera stationär ist und sich in einer Höhe von 10 m über dem Boden befindet. Sie können auch geeignete Daten annehmen, wenn Sie möchten. Sie können auch auf die nächste Abbildung verweisen.
Antworten:
[BEARBEITET] So wird's gemacht.
Schritte: 1. Isolieren Sie das Straßenteilerteil.
Ermitteln Sie dann mithilfe von Houghlines die längsten Zeilen im Bild. Finden Sie die Extrempunkte heraus, die die Bildgrenze überschreiten. Sie haben die vierseitigen Punkte. Ich habe diesen Teil übersprungen, indem ich sie manuell ausgewählt habe. In meinem Fall beträgt die Straßenbreite oben im Bild 10 und unten 60.
Für das Ziel müssen wir nun ein Bild erstellen, damit das Teilerviereck eine einheitliche Breite von 60 hat. Daher speichern wir in einem anderen Array neue Punkte, die dieselben unteren Punkte haben. Die oberen Punkte werden jedoch geändert, da sie ein Rechteck mit der gleichen Höhe wie das Bild bilden (oder größer, Sie können anpassen, wie es Ihnen passt, nachdem Sie es einmal ausgeführt und die Ergebnisse gesehen haben), aber Breite 60. Denken Sie daran, wir transformieren unser Bild so, dass der Teiler in diesen rechteckigen Bereich passt. Das Bild ändert sich automatisch.
Jetzt mit
Mat TransformMat = getPerspectiveTransform(ipPts, opPts);
von opencv auf Anfangs- und Zielviereckspunkten erhalten wir eine Transformationsmatrix, die wir auf unser Testbild anwenden.
warpPerspective(ipImg, opImg, TransformMat, ipImg.size());
Sie werden sehen, dass viel Fläche zugeschnitten ist, um der Ausgabe in InputImage Size zu entsprechen. Sie werden jedoch feststellen, dass das Bild wie erwartet transformiert wird, um einen parallelen Teiler zu erhalten. Wenn Sie einige Übersetzungen und Dinge ausführen und ein größeres Ausgabebild aufnehmen, erhalten Sie dies. Wir können niemals ein perfekt verpacktes Ausgabebild erhalten, da seine Größe sehr groß sein kann. Aber wir werden eine Einschränkung erreichen, die unsere Aufgabe erfüllen wird. Hier ist das letzte Bild:
quelle
Dies sieht aus wie eine Art Raytracing- Problem. Wenn Sie die Position und Ausrichtung Ihrer Kamera kennen, sollten Sie in der Lage sein, die 3x4-Projektionsmatrix und ihre Umkehrung zu berechnen .
Dies sollte es Ihnen ermöglichen, von Bildpunkten in 3D-Position (auf der Straße) zu konvertieren. Diese Diskussion http://opencv-users.1802565.n2.nabble.com/2D-to-3D-projection-with-given-plane-td7272428.html enthält möglicherweise weitere nützliche Informationen.
Wie für die Anwendung in Matlab. Es gibt eine affine3d, mit der Sie die Transformation speichern können. Es kann auch nützliche Dinge für Projektionen / Raytracing im Dateiaustausch geben, wie z. B. http://www.mathworks.com/matlabcentral/fileexchange/25974-raytracer, aber ich habe nicht im Detail gesucht, um herauszufinden, was für was relevant ist Sie wollen.
quelle
Wenn Sie Ihre Kamera kalibrieren und einige Referenzpunkte auf der Straßenoberfläche erkennen können, können Sie 3D-Koordinaten der Bildpunkte auf der Straße abrufen. Dies setzt voraus, dass sich die Straße in einem Flugzeug befindet. Mit anderen Worten, wenn Sie ein Auto erkennen können, können Sie die 3D-Koordinaten der Unterseite des Autos berechnen. Sehen Sie sich dieses Beispiel in MATLAB mit der Computer Vision System Toolbox an.
quelle