2016-10-01 24 views
0

カメラのキャリブレーションに関する問題に取り組んでいます。下の画像では、X軸を左に、Y軸を右に、Z軸を上にしてワールド座標系を考えます。 3つの平面に均等に分布する15点(x、y、z)を選択します。グリッド線の間隔は1インチです。また、15ピクセル(u、v)のMATLAB座標も取得します。目的は、均質な線形最小二乗を使用して3x4カメラマトリックス(M)を取得し、Mを使用してワールドポイント(x、y、z)を画像(u '、v')に投影することです。しかし、私が得ている座標(u '、v')は実際の座標(u、v)に比べて非常に小さいようです。 RMS誤差が大きすぎるため、投影された点は実際の点の近くの画像にマップされません。それをMATLAB座標に変換するために必要なスケーリングがありますか?私はMATLABが比較的新しいので、あまりよく書かれていない私のコードも含めています。 Grid imageカメラのキャリブレーション:3Dから2Dへのポイントマッピング

P=[];% 2nx12 matrix - 30x12 matrix 
for i=1:15 %compute P 
    world_row = world_coords(i,:); % 3d homogeneous coordinates (x,y,z,1) 
    zeroelem = repelem(0,4); 
    image_coord = image_coords(i,:); 
    img_u = image_coord(1); 
    prod = -img_u*world_row; 
    row1 = [world_row,zeroelem,prod]; 
    zeroelem = repelem(0,3); 
    img_v = image_coord(2); 
    prod = -img_v*world_row; 
    row2 = [0,world_row,zeroelem,prod]; 
    P=[P;row1;row2]; 
    end 
var1 = P'*P; 
[V,D] = eig(var1');//compute eigen vector corresponding to least eigen value 
m = V(:,1); //unit vector of norm 1 
M = reshape(m,3,4); //camera matrix of 3x4 size 
%get projected points 
proj = M*world_coords'; 
U = proj (1,:); 
V = proj (2,:); 
W = proj (3,:); 
for i=1:15 
    U(i) = U(i)/W(i); 
    V(i) = V(i)/W(i); 
end 
final = [U;V];//(u',v') 

15 points across the 3 planes

私も、私が選択した15点を持つ画像を含むています。 P1(u、v)=(286,260)とP1(x、y、z)=(4,0,3)とする。このために得られた(u '、v')Iは低い値を有する。私が間違っていることを誰かが指摘できますか?

答えて

0

私の間違ったカメラマトリックスを私に与えてくれたのは、私の愚かなエラーでした。私は点Pの世界座標を誤って((1,0,1)の代わりに(7,0,1))書き留めました。これは、均質な線形最小二乗によって解かれる方程式を形成するために使用される、間違って形成された30×12行列を導いた。私は、このミスを修正した後、低いRMS誤差で3D点を投影する較正行列を得ました。 enter image description here

関連する問題