2016-06-07 15 views
1

Ich habe eine Linie in Weltkoordinaten und projiziere sie auf ein Bild (wie in dieser Frage math.stackexchange beschrieben). Dies führt zu einer einfachen Liniengleichung im Bildraum, so dass ich sie leicht mit OpenCV innerhalb eines Bildes drucken kann.Verzerren Sie eine gerade Linie über Fischaugenverzerrungsfunktion und zeichnen Sie sie korrekt in das Bild

Jetzt möchte ich die Linie in ein Fisheye-Kamerabild projizieren. Da ich eine entsprechende nichtlineare Verzerrungsfunktion habe, kann ich Punkte leicht verzerren. Der naive Weg ist nun, jeden Punkt von der generierten Linie über diese Funktion zu verzerren. Aber das würde zu mehreren Liniensegmenten und unscharfen Pixeln führen (die normalerweise zu der verzerrten Linie gehören würden).

Ich frage mich, was könnte ein cleverer Weg, um eine korrekte verzerrte Linie zu bekommen. Vielleicht ist es auch notwendig, die Linienprojektion anders zu handhaben? Ich könnte die Straight-Linie öfter probieren (d. H. Mit Subpixel-Koordinaten), aber ich denke, das garantiert mir keine korrekte Lösung.

EDIT:

My Verzerrungsfunktion ist eine einfache Polynom

r(a) = k1*a+k2*a^2+k3*a^3+k4*a^4 

wo a ist, den Winkel des unverzerrten einfallenden Strahl auf die optische Achse und r ist der Radius, der einem Pixel im verzerrten Bild . Sie können mehr darüber lesen here.

+0

Bitte senden (oder Punkt) die Gleichungen des Linsenverzerrung Modell, das Sie verwenden möchten. –

+0

@FrancescoCallari: Ich habe die Informationen in meinem ursprünglichen Beitrag hinzugefügt. –

Antwort

1

Die einfache Lösung ist in der Tat, Ihre Zeilenauflösung zu erhöhen. Wenn Sie mehr Pixel hinzufügen (Subpixel sind besser), erhalten Sie nach der Verzerrung ein besser aussehendes Bild.

Ich denke, der richtige Weg ist Rückwärts-Mapping. Finde die Abbildung von jedem Pixel (Quadrat, Integer) in dem verzerrten Bild in das Pixel (viereckig, real) in dem unverzerrten Bild. Dadurch wird sichergestellt, dass Sie keine Löcher in Ihrer verzerrten Linie haben.

enter image description here

+0

Ich habe bereits eine Nachschlagetabelle mit der entsprechenden Rückwärtszuordnung. Da ich eine Liniengleichung im unverzerrten Bild habe, könnte ich die Linie im verzerrten Bild berechnen, wie Sie gesagt haben. Das heißt, für eine Zeile muss ich jedes Pixel im verzerrten Bild testen, wenn die Liniengleichung gilt. Oder gibt es einen Trick, um diesen Vorgang zu beschleunigen? –

+0

@ Vaniax. Erstens ist es nicht immer einfach, das Mapping umzukehren. In normalen Kameras ist die Abbildung von unverzerrt zu verzerrt leicht, aber die andere Art beinhaltet iterative Lösung (x und y sind gekoppelt). Zum Glück für Sie ist das Modell, das Sie verwenden, nicht umkehrbar, daher sollte es keine Genauigkeitsprobleme geben. Zweitens nehme ich bereits an, dass Sie ein Pixelbild im unverzerrten Bild erstellt haben, ich spreche nicht über die ursprüngliche Liniengleichung. Warum sind Sie so besorgt über die Geschwindigkeit? Der Hauptfaktor ist die Interpolation, die Sie ausführen werden, um den Pixelwert zu erhalten. –

Verwandte Themen