2016-09-08 8 views
0

から座標を取得、それの中画像座標。私は変換行列と回転行列を得ることができます。今、私は(x、y、z)座標をどのように得ることができますか?OpenCVの - 3Dは、私はたくさんの人が同様の質問をすることを見たが、私はまさに私がマーカーを持っていると私は(x、y)を取得する私の問題</p> <p>への答えと一致しないことができ、2D

(誰かが私の問題を解決する方法やリダイレクトする方法について私にアドバイスできれば幸いです)

編集:私はマーカ座標を取得アルヴァ・ライブラリを使用し、私もそれを得るのポーズをすることができます(私も回転行列3x3のを持っているので、翻訳マトリックスの3×4または4×4)

EDIT 2:私は検索しましたさらに私は回転行列と平行移動行列を取得する方法を研究しています。私は入力引数に依存して2つの行列を得ることができると訴えました。 |

  • 4x4の
    のために:しかし、私は、引数3x3の行列として設定した場合、私は唯一の回転行列を持つことになりますが、私はそこに3×4または4×4行列を置けば私が取得しますr0 r1 r2 t1 |
    | r3 r4 r5 t2 |
    | r6 r7 r8 t3 |
    | 0 0 0 1 |

  • (3x4)
    | r0 r1 r2 t1 |
    | r3 r4 r5 t2 |
    | r6 r7 r8 t3 |

+0

solvePnPからのオブジェクトポイントに、回転と平行移動の合成変換を乗算してください。 – Micka

+0

わかりましたが、私は確信しています。私はsolvePnPを使用しません。私は他のライブラリを使って(x、y)を得る。私は画像座標(ピクセル)で(x、y)座標を持っています。次に、逆回転行列でこの点を掛ける必要があります。それから、R^-1 * tを引く必要があります。私がよく考えると、元の座標は同次座標でなければなりませんか?私は正しい? –

+0

ポイントを変換しないで、オブジェクトの基本3Dポイント(重心など)を変換します。たぶん私たちはさまざまなことについて話しています。あなたの質問にあなたが何を持っているのか、どのような回転と平行移動を意味し、どのように計算したのでしょうか? – Micka

答えて

4

を使用すると、画像平面上のピクセル単位で画像点があるとすべてのcv::Vec2d imagePoint(u, v);

まず、カメラ座標系でこの点を変換すべきです。カメラの組み込み関数のパラメータ(カメラ行列とレンズ歪み係数)が既知であると仮定すると、あなたの観察imagePointの理想(u', v')座標を計算することができる:

u'' = (u - cx)/fx 
v'' = (v - cy)/fy 
(u', v') = undistort(u'', v'', distCoeffs) 

cxcyを主点の座標がされています通常はイメージセンターの周りにあり、さらにfxfyはピクセル単位の焦点距離です(カメラマトリックスから取得できます)。 distCoeffsには半径方向/接線方向の歪み係数が含まれています。これもまたcv::calibrateCamera(...)の結果です。 cv::undistortPoints(...)がないか、既定RPパラメータを持つ関数を呼び出すことによってこれを行いますので、

とにかく、あなたは、手動で(u', v')を計算するべきではありません。

カメラ座標系におけるimagePointのポイントは以下の通りです:

cv::Mat camToWorld = cv::Mat::eye(4, 4, CV_64FC1); 
// Fill camToWorld with [R^T|-R^T*t] 
// ... 

cameraPt.push_back(1.0); 
cv::Mat worldPt = camToWorld * cameraPt; 
:この時点で

std::vector<cv::Vec2d> imagePts; 
std::vector<cv::Vec2d> idealPts; 
imagePts.push_back(imagePoint); 

cv::undistortPoints(imagePts, idealPts, cameraMatrix, distCoeffs); 

const double lambda = 1.0; 
cv::Mat cameraPt(3, 1, CV_64F); 
cameraPt.at<double>(0) = idealPts[0][0] * lambda; 
cameraPt.at<double>(1) = idealPts[1][1] * lambda; 
cameraPt.at<double>(2) = lambda; 

、あなたはワールド座標系でcameraPtを表現するためにワールド変換行列にカメラを必要とします

これまでのところ、worldPtは、imagePointに対応するワールド座標系のレイを定義しています。つまり、線/線の各点は同じimagePointに投影することができるので、同じimagePointに属する世界の点数は無限にあります。しかし、例えば、Möller-Trumbore ray-triangle intersectionアルゴリズムでは、世界の平面上の1つの3D点を決定することができます。

+0

線の方程式のworldPt係数はありますか?私が正しく理解しているかどうかはわかりません。たとえば、z = 0の平面の3Dポイントは何ですか? – harsh

関連する問題