3D から 2D への投影マトリックス
-
02-07-2019 - |
質問
3D 空間内に正確な位置がわかっている 3 つの点があります。それらが次のようなものであると仮定します。 (x0,y0,z0)
, (x1,y1,z1)
そして (x2,y2,z2)
.
また、これらの 3 点を見ているカメラがあり、カメラのビュー平面上のこれら 3 点の 2D 位置がわかっています。たとえば (x0,y0,z0)
になるだろう (x0',y0')
, 、 そして (x1,y1,z1)
になるだろう (x1',y1')
そして (x2,y2,z2)
になるだろう (x2',y2')
カメラの視点から。
これらの 3D 点をカメラ ビュー平面上の 2D 点に投影する投影行列を見つける最も簡単な方法は何ですか。カメラの位置については何もわかりません。
解決
これにより、3 つの変数にそれぞれ 3 つの方程式が含まれる 2 つのセットが得られます。
a*x0+b*y0+c*z0 = x0'
a*x1+b*y1+c*z1 = x1'
a*x2+b*y2+c*z2 = x2'
d*x0+e*y0+f*z0 = y0'
d*x1+e*y1+f*z1 = y1'
d*x2+e*y2+f*z2 = y2'
状況に応じて連立方程式を解く最も簡単な方法を使用してください (これらを「手動」で解くことも難しくありません)。この場合、変換行列は ((a,b,c)(d,e,f)) になります。
...
実際には、これは過度に単純化されており、カメラが 3D 座標系の原点に向けられており、遠近感がないことを前提としています。
遠近感を考慮すると、変換行列は次のように機能します。
( a, b, c, d ) ( xt )
( x, y, z, 1 ) ( e, f, g, h ) = ( yt )
( i, j, k, l ) ( zt )
( xv, yv ) = ( xc+s*xt/zt, yc+s*yt/zt ) if md < zt;
しかし、4x3 行列は 12 自由度よりも制約が高くなります。
a*a+b*b+c*c = e*e+f*f+g*g = i*i+j*j+k*k = 1
a*a+e*e+i*i = b*b+f*f+j*j = c*c+g*g+k*k = 1
したがって、カメラの位置と角度の 6 つの変数をカバーする 8 つの方程式を取得するには、おそらく 4 つの点が必要であり、「中心」座標 (xc,yc) を削除できるため、2D ビュー ポイントのスケーリング用にさらに 1 つ必要です。 )。
したがって、4 つの点があり、2 次元の視点をディスプレイの中心を基準に変換すると、13 の変数で 14 の連立方程式を取得して解くことができます。
残念ながら、方程式のうち 6 つは一次方程式ではありません。幸いなことに、これらの方程式のすべての変数は -1 から 1 までの値に制限されているため、方程式を解くことはおそらくまだ可能です。
他のヒント
カメラには (少なくとも) 7 の自由度があります。位置に 3、方向に 3、FOV に 1 です。私が間違っていたら誰かが訂正してくれると思いますが、完全な解決には 3 つのポイントだけでは十分ではないようです。
この問題の一般的な解決策については、Graphics Gems II の「View Correlation」を参照してください。
あなたが探しているのは、ポーズ推定アルゴリズムと呼ばれるものです。OpenCV での POSIT 実装を見てください。 http://opencv.willowgarage.com/documentation/c/calib3d_camera_calibration_and_3d_reconstruction.html#posit
4 つ以上の点が必要ですが、それらの点は同じ平面上にない場合があります。
この実装のチュートリアルは次のとおりです。http://opencv.willowgarage.com/wiki/Posit
ただし、気をつけてください:このチュートリアルでは正方形のビューポートが使用されるため、すべてのビュー座標は -1,-1 ~ 1,1 の範囲内になります。このため、これらはカメラ座標系 (アスペクト比補正前) にあるはずだと思われます。これは当てはまらないため、たとえばビューポートを使用する場合は、アスペクト比が 4:3 の場合、入力座標は -1.3333,-1 ~ 1.3333,1 の範囲内である必要があります。
ちなみに、ポイントがあれば、 しなければならない 同じ平面上にある場合は、OpenCV の CameraCalibration アルゴリズムを確認することもできますが、これはセットアップがより複雑で、入力としてより多くのポイントが必要になります。ただし、カメラの歪み情報や固有パラメータも得られます。
決定的な解決策を見つけるのに十分な情報がないと思います。カメラの位置やビュー平面を知らなくても、この問題を解決できる行列は無数にあります。