12

カメラのキャリブレーションに使用される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 ) がそうではないことです。この違いは一体何なのでしょうか? それらはすべて物理座標ではありませんか?道に迷いました!

ご意見ありがとうございます。

4

1 に答える 1

3

カメラキャリブレーションの公式は1つだけではなく、すべて有効です。最初の定数にはr^2、r ^ 4、r ^ 6の定数K1、K2、K3が含まれ、他の2つにはr^2とr^4の定数しか含まれていないことに注意してください。それは、それらがすべて近似モデルであるためです。最初のものは、より多くのパラメーターを持っているため、より正確になる可能性があります。

あなたが見るときはいつでも:

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

rは通常、中心からの半径を意味するため、x =(x座標ピクセル)-(カメラの中心(ピクセル単位))と仮定するのがおそらく安全です。

ちなみに何をしようとしていますか?カメラのパラメータを推定するか、レンズの歪みを補正するか、またはその両方を行いますか?

于 2010-06-24T01:24:43.107 に答える