カメラのキャリブレーションに使用されるOpenCV のさまざまな座標のパラメーター化に問題があります。問題は、画像の歪みの式に関する 3 つの異なる情報源が、関係するパラメーターと式の 3 つの異なる説明を明らかに提供していることです。
(1) 著書 「Learning OpenCV…」で、Bradski と Kaehler はレンズの歪みについて次のように書いています (page 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 ],
ここで、r = sqrt( x^2 + y^2 ) です。
仮定すると、(x, y) は、座標 (X, Y, Z) を持つワールド ポイント オブジェクトに対応する、補正されていないキャプチャ イメージ内のピクセルの座標であり、カメラ フレームが参照されます。
xcorrected = fx * ( X / Z ) + cx and ycorrected = fy * ( Y / Z ) + cy,
ここで、fx、fy、cx、および cy は、カメラの内部パラメーターです。したがって、キャプチャされた画像から (x, y) を取得すると、上記の最初の 2 つの補正式を適用することで、キャプチャされた世界のシーンの歪みのない画像を生成するための目的の座標 ( xcorrected, ycorrected ) を取得できます。
でも...
(2) カメラのキャリブレーションと 3D 再構築セクションの下にある OpenCV 2.0 C リファレンス エントリを見ると、複雑さが生じます。比較を容易にするために、#1 と同様に、すべてのワールド ポイント (X、Y、Z) 座標がカメラの参照フレームに対して表されることから始めます。したがって、変換行列 [ R | t ] は関係ありません。
C リファレンスでは、次のように表現されています。
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' ],
ここで、r' = sqrt( x'^2 + y'^2 )、そして最後に
u = fx * x'' + cx,
v = fy * y'' + cy.
ご覧のとおり、これらの式は #1 で示したものと同等ではありません。その結果、修正された座標の 2 つのセット ( xcorrected, ycorrected ) と ( u, v ) は同じではありません。なぜ矛盾?最初のセットは、そこにあるすべての x と y に物理的な意味を付けることができるため、より理にかなっているように思えますが、カメラの焦点が合っている場合、x' = X / Z および y' = Y / Z には物理的な意味がありません。 length は正確に 1 ではありません。さらに、(X、Y、Z) がわからないため、x' と y' を計算することはできません。
(3) 残念ながら、Intel の Open Source Computer Vision Library Reference Manual のセクション Lens Distortion (page 6-4) の記述を参照すると、事態はさらに暗くなります。
「( u, v ) を真のピクセル画像座標、つまり理想的な投影の座標とし、( u ̃, v ̃ ) を対応する実際の観測 (歪んだ) 画像座標とします。同様に、( x, y ) は理想的です (歪み-free) と ( x ̃, y ̃ ) は、実際の (歪んだ) 画像の物理座標です. 2 つの拡張項を考慮すると、次のようになります:
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 ) ],
ここで、r = sqrt( x^2 + y^2 ) です。...
「u ̃ = cx + fx * u および v ̃ = cy + fy * v であるため、結果のシステムは次のように書き換えることができます。
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 ) ]
後者の関係は、カメラからの画像の歪みを解消するために使用されます。」
さて、x ̃ と y ̃ を含む式は、この文書の上部にある xcorrected と ycorrected を含む 2 つの式と一致しているように見えます。ただし、与えられた説明によると、x ̃ と y ̃ は修正された座標を参照しません。座標 ( x ̃, y ̃ ) と ( u ̃, v ̃ ) の意味の違い、さらに言えば ( x, y ) と ( u, v ) のペアの違いがわかりません。それらの説明から、それらの唯一の違いは、( x ̃, y ̃ ) と ( x, y ) が「物理的」座標を参照し、( u ̃, v ̃ ) と ( u, v ) がそうではないことです。この違いは一体何なのでしょうか? それらはすべて物理座標ではありませんか?道に迷いました!
ご意見ありがとうございます。