1

透視行列から回転角度を検出するにはどうすればよいですか?

私はこのコードを書きましたが、結果の角度は 40 を超えません ...

Mat mmat;
mmat.create(3,3,CV_32FC1);
mmat=getPerspectiveTransform(templPoints,imgPoints);
cout<< mmat<<endl<<endl;
float angle=acos(mmat.at<double>(0,0));
angle=(angle*180)/3.14;
cout<<"angle is"<<angle<<endl;
4

2 に答える 2

4

getPerspectiveTransform は、次のように分解できるホモグラフィ行列を返します。

[R11,R12,T1]

[R21,R22,T2]

[ P 、 P 、 1]

R は回転行列を表し、T は平行移動を表し、P は透視ワープを表します。

回転行列が表すものに関する詳細情報:

http://en.wikipedia.org/wiki/Rotation_matrix

http://mathworld.wolfram.com/RotationMatrix.html

于 2012-06-10T15:18:18.277 に答える
2

プロセスは次のとおりです。列ベクトル [ x1, x2, x3, 1]' によって同次座標で表される 3D 点 X を考えてみましょう (ここでは、転置を示すためにプライム記号 "'" を使用します)。次に、(透視) カメラの X のイメージである 2D ポイント u = [u1, u2, 1]' を考えます。次に、カメラの投影は、次のような 3x4 の投影行列 P で表されます。

u = P * X .

ここで、「*」は行ごとの積を意味します: u1 = P11*x1 + P12*x2 + P13*x3 + P14 など。

行列 P は、2 つの行列の積に分解できます。

P = K * Q

ここで、K は 3x3 上対角行列です。

K = [ fx s  cx
      0  fy cy
      0  0  1 ]

はカメラを表し、Q は 3x4 行列です。

Q = [R | t]

ここで、R はカメラの 3x3 回転行列、t は 3x1 並進ベクトルです。

プロジェクト行列 P が与えられた場合、K、R、および t を復元する手順は次のとおりです。

  1. Pの " RQ 分解" を計算します
  2. Q から R を抽出します (左端の 3 列を読み取るだけです)。
于 2012-06-11T01:46:45.437 に答える