少し問題があります。カメラと深度情報を使用して、各フレームの 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 つの変換行列が得られます...
これが正しいと仮定すると、各タイムステップにこの変換行列がある場合、どのように軌道を再計算しますか?
なぜそれがそんなに悪いのか、誰かヒントやアイデアはありますか?