2016-02-02 17 views
5

私は現在、ステレオカメラの設定をしています。私は両方のカメラを較正し、両方のカメラのための固有のマトリックスK1K2を持っています。Essential Matrixからの回転と変換が正しくありません

K1 = [2297.311,  0,  319.498; 
     0,  2297.313,  239.499; 
     0,    0,  1]; 

K2 = [2297.304,  0,  319.508; 
     0,  2297.301,  239.514; 
     0,    0,  1]; 

私はまた、OpenCVのからfindFundamentalMat()を使用して、2台のカメラ間の基本的な行列Fを決定しました。私は対応する点の対x1x2(ピクセル座標)を使用してEpipolar制約をテストしました。これは0に非常に近いです。 Fから

F = [5.672563368940768e-10, 6.265600996978877e-06, -0.00150188302445251; 
    6.766518121363063e-06, 4.758206104804563e-08, 0.05516598334827842; 
    -0.001627120880791009, -0.05934224611334332, 1]; 

x1 = 133,75  
x2 = 124.661,67.6607 

transpose(x2)*F*x1 = -0.0020 

私はE = K2'*F*K1として基本行列Eを得ることができています。私はEを分解し、K1に関してK2の回転と変換の4つの可能性を得るためにMATLAB SVD関数を使用します。

E = transpose(K2)*F*K1; 
svd(E); 

[U,S,V] = svd(E); 

diag_110 = [1 0 0; 0 1 0; 0 0 0]; 
newE = U*diag_110*transpose(V); 
[U,S,V] = svd(newE); //Perform second decompose to get S=diag(1,1,0) 

W = [0 -1 0; 1 0 0; 0 0 1]; 

R1 = U*W*transpose(V); 
R2 = U*transpose(W)*transpose(V); 
t1 = U(:,3); //norm = 1 
t2 = -U(:,3); //norm = 1 

のはK1が、我々はすべての測定を行う対象の座標フレームとして使用されているとしましょう。したがって、K1の中心はC1 = (0,0,0)にあります。これで、今、正しい回転Rと翻訳tようC2 = R*(0,0,0)+t(すなわちK2の中心がK1の中心に対して測定された)

を適用するのは、私の対応ペアx1x2を使用していると言うようにすることが可能なはずです。両方のカメラの各ピクセルの長さを知っていて、真性行列から焦点距離を知っているので、以下のように同じ点で交差する両方のカメラの2つのベクトルv1v2を判別できるはずです。

pixel_length = 7.4e-6; //in meters 
focal_length = 17e-3; //in meters 

dx1 = (133-319.5)*pixel_length; //x-distance from principal point of 640*480 image 
dy1 = (75-239.5) *pixel_length; //y-distance from principal point of 640*480 image 
v1 = [dx1 dy1 focal_length] - (0,0,0); //vector found using camera center and corresponding image point on the image plane 

dx2 = (124.661-319.5)*pixel_length; //same idea 
dy2 = (67.6607-239.5)*pixel_length; //same idea 
v2 = R * ([dx2 dy2 focal_length] - (0,0,0)) + t; //apply R and t to measure v2 with respect to K1 frame 
このベクターで

パラメトリック形式で線方程式を知って、我々は、システムを解くためにMATLABにおける左側の分割機能を介して2つのスカラー量Sとtを三角測量し、解決するために、2つの行を同一視することができ方程式の

C1 + s*v1 = C2 + t*v2 
C1-C2 = tranpose([v2 v1])*transpose([s t]) //solve Ax = B form system to find s and t 
s

t我々はバックライン式に差し込むことによって三角点を見つけることができます決定。しかし、ポイントが両方のカメラの前にあり、両方のカメラが先を向いている単一のRt解決策が見つからないので、私のプロセスは成功していません。

パイプラインや思考プロセスに問題がありますか?個々のピクセルレイを得ることは可能ですか?

答えて

1

基本行列をRtに分解すると、4種類の解が得られます。そのうちの3つはカメラの1つまたは両方の背後にあるポイントを投影し、そのうちの1つは正しい。いくつかのサンプルポイントを三角測量することで、どちらが正しいかをテストする必要があります。

MATLABのComputer Vision System Toolboxには、cameraPoseと呼ばれる機能があります。

0

C1-C2 = transpose([v2 -v1] * transpose([t s])である必要があります。これは機能します。

関連する問題