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.
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
Hallo, jnovacho, ich möchte die Bilder mit Opencv korrigieren – Mudasar
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