2013-05-31 6 views
5

Ich bin neu in Open Cv, ich möchte die beiden Bilder src und dst Bild zu transformieren. Ich verwende cv::estimateRigidTransform(), um die Transformationsmatrix zu berechnen, und danach cv::warpAffine(), um von dst in src zu transformieren. Wenn ich das neue transformierte Bild mit dem src-Bild vergleiche, ist es fast gleich (transformiert), aber wenn ich die ABS-Differenz des neuen transformierten Bildes und des src-Bildes erhalte, gibt es viele Unterschiede. Was soll ich tun? Mein DST-Bild hat auch einen Rotations- und Translationsfaktor. hier ist mein CodeOpencv Transforming Image

cv::Mat transformMat = cv::estimateRigidTransform(src, dst, true); 
cv::Mat output; 
cv::Size dsize = leftImageMat.size(); //This specifies the output image size--change needed 
cv::warpAffine(src, output, transformMat, dsize); 

Src Bild

enter image description here

Zielbild

enter image description here

Ausgabebild

enter image description here

absolute Differenz Bild

enter image description here

Dank

+0

Vor allem, was genau wollen Sie erreichen? Natürlich, wenn einige allgemeine Transformation, die ABS-Diff wird nicht Null sein. Selbst eine Rotationsänderung von 1 Grad wird aufgrund der Pixelinterpolation große Änderungen verursachen. – jnovacho

+0

Hallo, jnovacho, ich möchte die Bilder mit Opencv korrigieren – Mudasar

+0

Ich sehe immer noch nicht das Problem. Dein Code scheint mir gut zu sein. Können Sie einige Screenshots zur Verfügung stellen - Quell- und Zielbild und auch Ausgabebild. – jnovacho

Antwort

4

Sie haben einige falsche Vorstellungen über den Prozess. Die Methode cv :: estimateRigidTransform nimmt als Eingabe zwei Sätze von entsprechenden Punkten. Und dann löst man einen Satz von Gleichungen, um die Transformationsmatrix zu finden. Die Ausgabe der Transformation vergleicht src Punkte mit dst Punkten (genau oder genau, wenn eine exakte Übereinstimmung nicht möglich ist - zum Beispiel float Koordinaten).

Wenn Sie bei zwei Bildern scheduleRigidTransform anwenden, sucht OpenCV zuerst nach passenden Paaren von Punkten mit einer internen Methode (siehe opencv docs).

cv :: warpAffine wandelt dann das src-Bild entsprechend der gegebenen Transformationsmatrix in dst um. Aber jede (fast jede) Transformation ist Verlustoperation. Der Algorithmus muss einige Daten schätzen, da sie nicht verfügbar sind. Dieser Vorgang wird als Interpolation bezeichnet. Anhand bekannter Informationen berechnen Sie den unbekannten Wert. Einige Informationen zur Bildskalierung finden Sie unter wiki. Die gleichen Regeln gelten für andere Transformationen - Rotation, Skew, Perspektive ... Dies gilt offensichtlich nicht für die Übersetzung.

Angesichts Ihrer Testbilder würde ich vermuten, dass OpenCV den Lampenschirm als Referenz nimmt. Aus dem Unterschied ist klar, dass der Lampenschirm am besten transformiert ist. Standardmäßig verwendet OpenCV lineare Interpolation für das Warping als schnellste Methode. Aber Sie können mehr Fortschritte Methode für bessere Ergebnisse setzen - wieder konsultieren opencv docs.

Fazit: Das Ergebnis, das Sie erhalten, ist ziemlich gut, wenn Sie daran denken, es ist das Ergebnis des automatisierten Prozesses. Wenn Sie bessere Ergebnisse erzielen möchten, müssen Sie eine andere Methode zum Auswählen der entsprechenden Punkte finden. Oder verwenden Sie eine bessere Interpolationsmethode. Wie auch immer, nach der Transformation wird das Diff nicht 0 sein. Es ist praktisch unmöglich, dies zu erreichen, da die Bitmap ein diskretes Raster von Pixeln ist, so dass es immer einige Lücken geben wird, die geschätzt werden müssen.

+0

Ok Danke :) für die Erklärung – Mudasar

+0

Hallo Jnovacho, können Sie mir sagen, wie man die Rotation zu zentrieren, bevor Sie den Warp affine, tatsächlich ist es von der oberen linken Ecke, während in Stereobildern die meiste Zeit die Rotation dreht ist von der Mitte. Danke – Mudasar

+1

Hallo, gibt es einen Haken. Alle Umwandlungen beziehen sich auf den Ursprung [0,0]. Der Trick besteht also darin, das gewünschte Zentrum in den Ursprung zu übersetzen, die Drehung auszuführen und zurück zu übersetzen. Einige Informationen über Matrixtransformationen finden Sie hier http://www.willamette.edu/~gorr/classes/GeneralGraphics/Transforms/transforms2d.htm Aber ich glaube nicht, dass dies in OpenCV funktionieren würde, da Sie die Daten verloren hätten negative Koordinaten Außerdem glaube ich nicht, dass du das wirklich brauchst. Die Funktionen befassen sich intern mit diesem Problem, sie transformieren das Bild so, dass die entsprechenden Punkte übereinstimmen. – jnovacho