2016-07-26 3 views
0

現在、OpenCvに基づくStructure from Motionプログラムの問題に直面しています。 私はそれが何をしているのか、それが何をすべきかを描こうとします。Motion Reprojection発行のOpenCV構造

このプログラムは、古典的な「動きからの構造」方法にあります。

基本的な考え方は、一対の画像を取得し、そのキーポイントを検出し、それらのキーポイントの記述子を計算することです。次に、結果が良好であることを保証するために、いくつかのテストでキーポイントのマッチングが行われます。その部分は完全に機能します。

これが完了すると、基本行列、必須行列、必須行列のSVD分解、カメラ行列計算、最後に三角測量が実行されます。

画像のペアの結果は、3Dビューアに描画するポイントを与える3D座標のセットです。これはペアで完璧に動作します。

実際には、ここに私の問題があります:画像のペアのための、3Dポイント座標は、画像ペアの最初の画像の座標系で計算され、参照画像とみなされます。プログラムの目的である2つ以上の画像を扱う場合、一番最初の画像の座標系で計算された3D点を再投影して、一貫した結果を得る必要があります。

私の質問はカメラ関連のシステムで与えられた3D点座標を他のカメラ関連システムに再投影するにはどうすればいいですか?カメラ行列は?

私の考えは3D点の座標を取得し、前に各カメラの行列の逆数を乗算することでした。

Iは、明確:

(Iそうで1-2/2-3/3-4と同様に働いているので、したがって、画像の第3の対)Iは、第3及び第4の画像に取り組んでいますと仮定。

私は3番目の画像の座標系で私の3Dポイント座標を取得しました。最初の画像座標系で正しく再投影するにはどうすればいいですか?

Iは、以下を行っているであろう:

を3Dポイントを取得3に画像2のためのカメラ行列の逆行列を適用し、行列を調整し、その後2に画像1用のカメラ行列の逆を適用します。 それは正しいですか?

これらのカメラ行列は非正方行列なので、逆行列はできません。

私はきっとどこかで勘違いしていて、誰かが私を啓発することができれば、私は感謝される、私は、これは相対的な簡単なものであるかなり確信しているが、私は明らかに何かが足りないのです...読書のための

おかげで多くのことを:)

答えて

0

私たちはあなたがPと呼ばれる3 * 4の外的パラメータマトリックスを持っているとしましょう。 OpenCV documentationの表記と一致させるには、これは[R|t]です。

この行列Pには、ワールド空間座標からカメラ空間座標への投影が記述されています。ドキュメントを引用するには:

この行列が正方形でない理由は疑問です。これは、OpenCVの通常のコンテキストでは、同次座標が出力として期待していないからです。したがって、正方形にするには、(0,0,0,1)を含む4番目の行を追加します。この新しい正方行列Qとしましょう。

あなたがカメラの各ペアに対して1つのこのようなマトリックスを持っている、それはあなたがカメラk+1とカメラkの座標空間からの投影を説明した画像{k,k+1}のペアごとに1つのQk行列を持っています。これらの行列は、同次座標の等値線を記述するため、逆転可能です。その後、Q1の逆数を、カメラ1とカメラ3の座標空間から行くだけで、あなたのポイントにQ2の逆を適用するには

+0

ありがとう、私の考えを完全に確認しました! 私は感謝していますが、今、私は新しい問題に直面していますinvert(): '/home/qmenard/opencv-2.4.13/modules/core/src/matmul.cpp:711:error: (-215)type == B.type()&&(type == CV_32FC1 || type == CV_64FC1 || type == CV_32FC2 || type == CV_64FC2)function gemmの 以下の2つの行列をチェックしました。この関数invertの入力はCV_64FC1と同じ型です。私は何か間違っているのですか? – Dysth

+0

これが役に立ちそうなら、私の行列は次のとおりです: 'cv :: Mat CamInvert(4,4、CV_64FC1); 反転(CamList.at(I)、CamInvert); ' でCamList.at(I)ここである: ' [-197.3552389929644、166.1774976638282、1108.008261559664、-1130.615560427775。 918.5296345054174,250.7737479920311,346.9785115089624、-210.7512327961316; 0.3043008159201136、-0.6127706945732454,0.7293237205127607、-0.4769956380539712; 0、0、0、1] ' – Dysth

+0

反転を使用する場合、2番目の行列' dst'を定義する必要はありません。空のMatを渡すだけで(おそらく問題は解決しません)。 CamListで行列を定義するコードをいくつか表示できますか? @Dysth – Sunreef

関連する問題