ウェブカメラを使用して、既知のグローバル位置を持つ 4 つのフィデューシャルの画像からグローバル ポーズ推定値を取得しようとしています。
多くのstackexchangeの質問といくつかの論文をチェックしましたが、正しい解決策が得られないようです. 私が得た位置番号は再現可能ですが、カメラの動きに直線的に比例するものではありません。参考までに、C++ OpenCV 2.1 を使用しています。
このリンクには、私の座標系と以下で使用されるテスト データが描かれています。
% 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 からポーズを取得するには、次のようにします。
position = transpose(rMat) * tVec % matrix multiplication
しかし、私が読んだ他の情報源から、それはそれほど単純ではないと思われます。
実世界の座標でカメラの位置を取得するには、何をする必要がありますか? これが実装の問題かどうかはわかりませんが (理論上の問題である可能性が最も高い)、OpenCV で solvePnP 関数をうまく使用したことがある人にこの質問に答えてもらいたいと思いますが、アイデアも大歓迎です!
どうぞよろしくお願いいたします。