[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: