カメラのキャリブレーションに関する問題に取り組んでいます。下の画像では、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が比較的新しいので、あまりよく書かれていない私のコードも含めています。 カメラのキャリブレーション: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点を持つ画像を含むています。 P1(u、v)=(286,260)とP1(x、y、z)=(4,0,3)とする。このために得られた(u '、v')Iは低い値を有する。私が間違っていることを誰かが指摘できますか?