5

プロジェクトでは、既知のオブジェクトに対するカメラの実際の位置と向きを計算する必要があります。写真のセットがあり、それぞれが異なる視点からチェス盤を表示しています。CalibrateCamera と solvePnP を使用して、2D でポイントを再投影して、AR のものを取得できます。だから私の状況はそのようなものです:

  • 固有パラメータが知られている

  • 歪み係数は既知です

  • 平行移動ベクトルと回転ベクトルは、写真ごとにわかっています。

カメラの位置を計算する方法がわかりません。私の推測は次のとおりです。

  • 平行移動ベクトルを反転します。(=t')

  • 回転ベクトルを度(ラジアンのように見える)に変換し、逆にする

  • 回転ベクトルにロドリゲスを使用

  • RotationMatrix * t' を計算します

しかし、結果はどういうわけか完全にずれています...基本的に、ワールド座標の各ピクセルのレイを計算したいと思います。私の問題についてさらに情報が必要な場合は、すぐにお答えいたします。

わからない...どういうわけか、光線はまだオフになっています。これは私のコードです:

Mat image1CamPos = tvecs[0].clone(); //From calibrateCamera
Mat rot = rvecs[0].clone(); //From calibrateCamera
Rodrigues(rot, rot);
rot = rot.t();

//Position of Camera
Mat pos = rot * image1CamPos;

//Ray-Normal (( (double)mk[i][k].x) are known image-points)
float x = (( (double)mk[i][0].x) / fx) - (cx / fx);
float y = (( (double)mk[i][0].y) / fy) - (cy / fy);
float z = 1;
float mag = sqrt(x*x + y*y + z*z);
x /= mag;
y /= mag;
z /= mag;

Mat unit(3, 1, CV_64F);
unit.at<double>(0, 0) = x;
unit.at<double>(1, 0) = y;
unit.at<double>(2, 0) = z;

//Rotation of Ray
Mat rot = stof1 * unit;

しかし、これをプロットすると、光線はオフになります:/

4

1 に答える 1

8

カメラに対するオブジェクトの平行移動 t (3x1 ベクトル) と回転 R (3x3 行列) は、オブジェクトからカメラ空間への座標変換に等しく、次の式で与えられます。

v' = R * v  + t

回転行列の反転は単純に転置されます。

R^-1 = R^T

これを知っていれば、変換 (最初の式) を v に簡単に解決できます。

v = R^T * v' - R^T * t

これは、カメラからオブジェクト空間への変換、つまり、オブジェクトに対するカメラの位置 (回転 =R^Tおよび平行移動 = -R^T * t) です。

これから 4x4 の同次変換行列を簡単に取得できます。

T = ( R^T  -R^T * t )
    (  0       1    )

カメラ座標に点がある場合は、それをオブジェクト座標に変換できます。

p' = T * (x, y, z, 1)^T

したがって、座標 (a,b) のピクセルから光線を投影したい場合 (おそらく、画像の中心、つまり によって報告される主点CalibrateCameraを (0,0) として定義する必要があります) - - そのピクセルを とするP = (a,b)^T。カメラ空間での 3D 座標はP_3D = (a,b,0)^T. 100 ピクセルの光線を正の z 方向、つまり点に投影してみましょうQ_3D = (a,b,100)^T。必要なのは、変換行列 T を使用して両方の 3D 座標をオブジェクト座標系に変換することだけで、オブジェクト空間内の両方の点の間に線を引くことができるはずです。ただし、単位を混同しないように注意してください。CalibrateCamera はピクセル値を報告しますが、オブジェクトの座標系は cm や mm などで定義されている場合があります。

于 2012-12-19T17:23:44.387 に答える