12 Stimmen

Warum gibt es 3 sich widersprechende OpenCV-Kamerakalibrierungsformeln?

Ich habe ein Problem mit OpenCVs verschiedene Parametrisierungen von Koordinaten, die für die Kamerakalibrierung verwendet werden. Das Problem besteht darin, dass drei verschiedene Informationsquellen über Bildverzerrungsformeln offenbar drei nicht äquivalente Beschreibungen der beteiligten Parameter und Gleichungen liefern:

(1) In ihrem Buch "OpenCV lernen " Bradski und Kaehler schreiben zur Objektivverzeichnung (Seite 376):

xcorrected = x * ( 1 + k1 * r^2 + k2 * r^4  + k3 * r^6 ) + [ 2 * p1 * x * y + p2 * ( r^2 + 2 * x^2 ) ],

ycorrected = y * ( 1 + k1 * r^2 + k2 * r^4  + k3 * r^6 ) + [ p1 * ( r^2 + 2 * y^2 ) + 2 * p2 * x * y ],

wobei r = sqrt( x^2 + y^2 ).

Vermutlich sind (x, y) die Koordinaten von Pixeln in dem unkorrigierten aufgenommenen Bild, die Weltpunktobjekten mit den Koordinaten (X, Y, Z) entsprechen, die auf das Kamerabild bezogen sind und für die

xcorrected = fx * ( X / Z ) + cx    and     ycorrected = fy * ( Y / Z ) + cy,

wobei fx, fy, cx und cy die der Kamera innewohnenden Parameter sind. Wenn wir also (x, y) aus einem aufgenommenen Bild haben, können wir die gewünschten Koordinaten (xkorrigiert, ykorrigiert) erhalten, um ein unverzerrtes Bild der aufgenommenen Szene zu erzeugen, indem wir die ersten beiden Korrekturausdrücke anwenden.

Aber...

(2) Die Komplikation entsteht, wenn wir uns den Eintrag OpenCV 2.0 C Reference im Abschnitt Kamerakalibrierung und 3D-Rekonstruktion ansehen. Der Einfachheit halber beginnen wir damit, dass alle Weltpunktkoordinaten (X, Y, Z) in Bezug auf den Referenzrahmen der Kamera ausgedrückt werden, genau wie in #1. Folglich ist die Transformationsmatrix [ R | t ] nicht von Belang.

In der C-Referenz heißt es, dass:

x' = X / Z,

y' = Y / Z,

x'' = x' * ( 1 + k1 * r'^2 + k2 * r'^4  + k3 * r'^6 ) + [ 2 * p1 * x' * y' + p2 * ( r'^2 + 2 * x'^2 ) ],

y'' = y' *  ( 1 + k1 * r'^2 + k2 * r'^4  + k3 * r'^6 ) + [ p1 * ( r'^2 + 2 * y'^2 )  + 2 * p2 * x' * y' ],

wobei r' = sqrt( x'^2 + y'^2 ) ist, und schließlich, dass

u = fx * x'' + cx,

v = fy * y'' + cy.

Wie man sieht, sind diese Ausdrücke nicht äquivalent zu denen in Nr. 1, was zur Folge hat, dass die beiden Sätze korrigierter Koordinaten ( xckorrigiert, ykorrigiert ) und ( u, v ) nicht gleich sind. Warum dieser Widerspruch? Mir scheint, dass der erste Satz mehr Sinn macht, da ich jedem einzelnen x und y darin eine physikalische Bedeutung beimessen kann, während ich keine physikalische Bedeutung in x' = X / Z und y' = Y / Z finde, wenn die Brennweite der Kamera nicht genau 1 ist. Außerdem kann man x' und y' nicht berechnen, da wir (X, Y, Z) nicht kennen.

(3) Leider werden die Dinge noch undurchsichtiger, wenn wir uns auf die Angaben im Abschnitt Lens Distortion (Seite 6-4) des Open Source Computer Vision Library Reference Manual von Intel beziehen, wo es unter anderem heißt:

"Seien ( u, v ) echte Pixelbildkoordinaten, d. h. Koordinaten mit idealer Projektion, und ( u , v ) die entsprechenden realen beobachteten (verzerrten) Bildkoordinaten. Analog dazu sind ( x, y ) ideale (verzerrungsfreie) und ( x , y ) reale (verzerrte) physikalische Bildkoordinaten. Berücksichtigt man zwei Expansionsterme, so ergibt sich folgendes:

x   =  x * ( 1 +  k1 * r^2 + k2 * r^4 ) + [ 2 p1 * x * y + p2 * ( r^2 + 2 * x^2 ) ] 

y   =  y * ( 1 +  k1 * r^2 + k2 * r^4 ] + [ 2 p2 * x * y + p2 * ( r^2 + 2 * y^2 ) ],

wobei r = sqrt( x^2 + y^2 ). ...

"Da u = cx + fx * u und v = cy + fy * v , kann das resultierende System wie folgt umgeschrieben werden:

u   = u + ( u – cx ) * [ k1 * r^2 + k2 * r^4 + 2 * p1 * y + p2 * ( r^2 / x + 2 * x ) ]

v   = v + ( v – cy ) * [ k1 * r^2 + k2 * r^4 + 2 * p2 * x + p1 * ( r^2 / y + 2 * y ) ]

Letztere Beziehungen werden genutzt, um die Bilder der Kamera zu entzerren.

Es hat den Anschein, dass die Ausdrücke für x und y mit den beiden Ausdrücken für xckorrigiert und ykorrigiert übereinstimmen, die oben in diesem Text stehen. Allerdings beziehen sich x und y nicht auf korrigierte Koordinaten, wie es in der Beschreibung heißt. Ich verstehe den Unterschied zwischen der Bedeutung der Koordinaten ( x , y ) und ( u , v ) nicht, und auch nicht zwischen den Paaren ( x, y ) und ( u, v ). Aus ihren Beschreibungen geht hervor, dass ihr einziger Unterschied darin besteht, dass ( x , y ) und ( x, y ) sich auf "physikalische" Koordinaten beziehen, während ( u , v ) und ( u, v ) dies nicht tun. Was hat es mit dieser Unterscheidung auf sich? Sind das nicht alles physikalische Koordinaten? Ich bin ratlos!

Danke für jeden Beitrag!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X