1

私はカメラとそのK行列(キャリブレーション行列)を持っており、平面の画像も持っています。4つのコーナーの実際のポイントと対応するピクセルを知っています。z = 0の場合のH行列の計算方法を知っています(Hは画像と実平面の間のホモグラフィ行列です)。そして今、私は回転行列と変換ベクトルを使って平面の実際の点(3D点)を取得しようとしています:セクション3-3.3のRaulRojasによるオーバーヘッドビデオカメラのキャリブレーション。私のコードは次のとおりです。

ImagePointsScreen=[16,8,1;505,55,1;505,248,1;44,301,1;];

screenImage=imread( 'screen.jpg');
RealPointsMirror=[0,0,1;9,0,1;9,6,1;0,6,1]; %Mirror
RealPointsScreen=[0,0,1;47.5,0,1;47.5,20,1;0,20,1];%Screen
imagesc(screenImage);
hold on
for i=1:4
    drawBubble(ImagePointsScreen(i,1),ImagePointsScreen(i,2),1,'g',int2str(i),'r')
end

Points3DScreen=Get3DpointSurface(RealPointsScreen,ImagePointsScreen,'Screen');

figure
hold on
plot3(Points3DScreen(:,1),Points3DScreen(:,2),Points3DScreen(:,3));
for i=1:4
    drawBubble(Points3DScreen(i,1),Points3DScreen(i,2),1,'g',int2str(i),'r')
end



function [ Points3D ] = Get3DpointSurface( RealPoints,ImagePoints,name)
M=zeros(8,9);

for i=1:4

M((i*2)-1,1:3)=-RealPoints(i,:);
M((i*2)-1,7:9)=RealPoints(i,:)*ImagePoints(i,1);
M(i*2,4:6)=-RealPoints(i,:);
M(i*2,7:9)=RealPoints(i,:)*ImagePoints(i,2);   

end

[U S V] = svd(M);
X = V(:,end);
H(1,:)=X(1:3,1)';
H(2,:)=X(4:6,1)';
H(3,:)=X(7:9,1)';
K=[680.561906875074,0,360.536967117290;0,682.250270165388,249.568615725655;0,0,1;];

newRO=pinv(K)*H;
h1=newRO(1:3,1);
h2=newRO(1:3,2);

scaleFactor=(norm(h1)+norm(h2))/2;
newRO=newRO./scaleFactor;
r1=newRO(1:3,1);
r2=newRO(1:3,2);
r3=cross(r1,r2);
r3=r3/norm(r3);

R=[r1,r2,r3];

RInv=pinv(R);
O=-RInv*newRO(1:3,3);
M=K*[R,-R*O];
for i=1:4
   res=pinv(M)* [ImagePoints(i,1),ImagePoints(i,2),1]';
   res=res';
   res=res*(1/res(1,4));
   Points3D(i,:)=res';

end
Points3D(i+1,:)=Points3D(1,:);  %just add the first point to the end of the array for draw square

end

私の結果は: ここに画像の説明を入力してください

今私は2つの問題があります:

1.ポイント1は(0,0,0)にあり、これは実際の場所ではありません

2.ポイントが逆さまになっている

私は何をしているのですか?

4

2 に答える 2

0

ホモグラフィは通常、2つの位置/回転での平面の変換です。平面のカメラ座標での位置は、通常、ポーズまたは外部パラメータと呼ばれます

opencvには、Ransacを使用して既知の平面の位置を推定するsolvePnP()関数があります。

ps。申し訳ありませんが、同等のmatlabはわかりませんが、BouguetのサイトにはopenCV3D関数のmatlabバージョンがあります。

于 2012-08-26T23:06:44.433 に答える
0

論文で答えを見つけました: セクション 3 - 3.3 の Raul Rojas によるオーバーヘッド ビデオ カメラのキャリブレーション。

始めに: H=K^-1*H 画像内の 4 つの点と、それらの既知の世界座標が与えられると、行列 H は倍率 まで復元できます。回転行列 R の最初の 2 列は、変換行列の最初の 2 列でなければならないことがわかっています。行列 H の 3 つの列を h1、h2、および h3 で表すことにします。スケーリング係数により、xr1 = h1 および xr2 = h2 となります。= 1 の場合、x= |h1|/|r1| = |h1| x = |h2|/|r2| = |h2|。したがって、係数を計算し、復元された行列 H からそれを削除できます。H'= H/x と設定するだけです。このようにして、回転行列 R の最初の 2 列を復元します。R の 3 番目の列は、回転行列の列は、他の 2 つの列の外積 (適切なプラスまたはマイナス記号を掛けたもの) です。特に r3 = r1 × r2 したがって、H から回転行列 R を復元できます。並進ベクトル (フィールド座標でのカメラの位置) も復元できます。h'3 = −R^t したがって、カメラのピンホール t の位置ベクトルは t = −R^-1 h3 で与えられます。

于 2012-09-01T21:30:15.993 に答える