4

少し問題があります。カメラと深度情報を使用して、各フレームの 3 次元ポイントのセットを抽出するプログラムを作成しました。ポイントはカメラ座標系にあります。つまり、原点はカメラの中心にあり、x は水平距離、y は垂直距離、z はカメラからの距離 (光軸に沿った距離) です。すべてメートル単位です。つまり、点 (2,-1,5) は右 2 メートル、下 1 メートル、カメラの光軸に沿って 5 メートルになります。

t-1各時間枠でこれらの点を計算し、 のどの点が のどの 3D 点に属しているかを知っているように、対応も知っていtます。

私の目標は、ワールド座標系の各時間フレームでカメラの動きを計算することです (z は高さを表します)。カメラの軌跡を視覚化するために、相対運動だけでなく、開始位置から始まる絶対運動も計算したいと思います。


これは、カメラ座標の点の現在 (左) と以前の 3D 位置 (右) を含む 1 つのフレームのデータ セットの例です。

-0.174004 0.242901 3.672510 | -0.089167 0.246231 3.646694 
-0.265066 -0.079420 3.668801 | -0.182261 -0.075341 3.634996 
0.092708 0.459499 3.673029 | 0.179553 0.459284 3.636645 
0.593070 0.056592 3.542869 | 0.675082 0.051625 3.509424 
0.676054 0.517077 3.585216 | 0.763378 0.511976 3.555986 
0.555625 -0.350790 3.496224 | 0.633524 -0.354710 3.465260 
1.189281 0.953641 3.556284 | 1.274754 0.938846 3.504309 
0.489797 -0.933973 3.435228 | 0.561585 -0.935864 3.404614 

可能であれば OpenCV を使用したいのでestimateAffine3D()、OpenCV 2.3 で関数を見つけました。この関数は、2 つの 3D ポイント入力ベクトルを取り、RANSAC を使用してそれらの間のアフィン変換を計算します。

出力として、3x4 変換マトリックスを取得します。

RANSAC パラメータを設定して計算をより正確にしようとしましたが、多くの場合、変換行列は非常に大きな並進運動を示します。サンプル データでわかるように、動きは通常非常に小さいです。

それで、誰か私が試すことができる別のアイデアを持っているかどうか尋ねたかったのですか? OpenCV はこれに対する他のソリューションを提供していますか?

また、各時間枠でカメラの相対的な動きがある場合、それを世界座標に変換するにはどうすればよいですか? また、ポイント (0,0,0) から始まる絶対位置を取得するにはどうすればよいので、各時間フレームのカメラ位置 (および方向) を取得できますか?

どなたかアドバイスいただけると助かります!

ありがとうございました!

更新 1:

@Michael Kupchickの良い答えの後、OpenCVのestimateAffine3D()関数がどれだけうまく機能するかを確認しようとしました。そこで、回転ではなく平行移動のみを行う 6 つのポイント ペアの小さなテスト セットを 2 つ作成し、結果の変換行列を調べました。

テストセット 1:

1.5 2.1 6.7 | 0.5 1.1 5.7
6.7 4.5 12.4 | 5.7 3.5 11.4
3.5 3.2 1.2 | 2.5 2.2 0.2
-10.2 5.5 5.5 | -11.2 4.5 4.5
-7.2 -2.2 6.5 | -8.2 -3.2 5.5
-2.2 -7.3 19.2 | -3.2 -8.3 18.2

変換マトリックス:

1           -1.0573e-16  -6.4096e-17  1
-1.3633e-16 1            2.59504e-16  1
3.20342e-09 1.14395e-09  1            1

テストセット 2:

1.5 2.1 0 | 0.5 1.1 0
6.7 4.5 0 | 5.7 3.5 0
3.5 3.2 0 | 2.5 2.2 0
-10.2 5.5 0 | -11.2 4.5 0
-7.2 -2.2 0 | -8.2 -3.2 0
-2.2 -7.3 0 | -3.2 -8.3 0

変換マトリックス:

1             4.4442e-17  0   1
-2.69695e-17  1           0   1
0             0           0   0

--> これにより、一見正しく見える 2 つの変換行列が得られます...

これが正しいと仮定すると、各タイムステップにこの変換行列がある場合、どのように軌道を再計算しますか?

なぜそれがそんなに悪いのか、誰かヒントやアイデアはありますか?

4

1 に答える 1

3

この問題は、画像処理よりもはるかに 3D に関連しています。

あなたがやろうとしているのは、既知の 3D を登録することです。すべてのフレームに同じ 3D ポイント -> カメラ関係が​​あるため、登録から計算された変換はカメラの動きの変換になります。

これを解決するには、PCL を使用できます。これは、3D 関連タスクの opencv の姉妹プロジェクトです。 http://www.pointclouds.org/documentation/tutorials/template_alignment.php#template-alignment これは、点群の配置に関する優れたチュートリアルです。

基本的には次のようになります。

シーケンシャル フレームの各ペアについて、3D ポイントの対応がわかっているため、で実装されている SVD メソッドを使用できます。

http://docs.pointclouds.org/trunk/classpcl_1_1registration_1_1_transformation_estimation_s_v_d.html

少なくとも 3 つの対応する点が必要です。

チュートリアルに従うか、独自の ransac アルゴリズムを実装できます。これにより、変換の大まかな推定のみが得られます (ノイズが大きすぎない場合は非常に適切です)。正確な変換を取得するには、前のステップで計算された推定変換を使用して ICP アルゴリズムを適用する必要があります。ICP については、次のように説明されています。

http://www.pointclouds.org/documentation/tutorials/iterative_closest_point.php#iterative-closest-point

これらの 2 つの手順により、フレーム間の変換を正確に推定できます。

したがって、ペアごとの登録を段階的に行う必要があります。フレームの最初のペアを登録すると、最初のフレームから 2 番目の 1->2 への変換が取得されます。2 番目を 3 番目 (2->3) に登録し、1->2 変換を 2->3 に追加します。このようにして、最初のフレームが原点であるグローバル座標系で変換を取得します。

于 2012-02-28T23:59:26.693 に答える