私は、自分のウェブカメラを使用して、既知のグローバルポジションを持つ4つの基準点の画像からグローバルな姿勢推定値を取得しようとしています。カメラ姿勢推定(OpenCV PnP)
私は多くのstackexchangeの質問といくつかの論文をチェックしましたが、正しい解決策を得ることができません。私が出す位置番号は繰り返し可能ですが、決してカメラの動きに線形に比例しません。私はC++ OpenCV 2.1を使用しています。
At this link is pictured下記の私の座標系およびテストデータ。
% Input to solvePnP():
imagePoints = [ 481, 831; % [x, y] format
520, 504;
1114, 828;
1106, 507]
objectPoints = [0.11, 1.15, 0; % [x, y, z] format
0.11, 1.37, 0;
0.40, 1.15, 0;
0.40, 1.37, 0]
% camera intrinsics for Logitech C910
cameraMat = [1913.71011, 0.00000, 1311.03556;
0.00000, 1909.60756, 953.81594;
0.00000, 0.00000, 1.00000]
distCoeffs = [0, 0, 0, 0, 0]
% output of solvePnP():
tVec = [-0.3515;
0.8928;
0.1997]
rVec = [2.5279;
-0.09793;
0.2050]
% using Rodrigues to convert back to rotation matrix:
rMat = [0.9853, -0.1159, 0.1248;
-0.0242, -0.8206, -0.5708;
0.1686, 0.5594, -0.8114]
これまでのところ、は、誰もがこれらの数字に何かを見ることができますか?誰かがそれらを例えばMatLABでチェックするならば、私はそれを感謝するでしょう(上のコードはm-ファイルフレンドリーです)。
この時点から、rMatとtVecからグローバルポーズを取得する方法はわかりません。私はRMATとtVecからポーズを取得するには、this questionに読んだものから、 は単純です:
position = transpose(rMat) * tVec % matrix multiplication
は、しかし、私はそれが簡単ではありません読んだ他のソースから疑います。
実際の座標でのカメラの位置を取得するには、何が必要ですか? 私は、これは実装上の問題(ただしほとんどの場合、理論上の問題)である場合、私はすべてのアイデアがあまりにも歓迎されているものの、この質問に答えるためにOpenCVのに成功しsolvePnP機能を使用している誰かのために希望が不明だと!
ありがとうございます。
あなたがtVecを反転するのを忘れました。ですから、これを行う正しい方法は-transpose(rMat)* tVec – Vlad