opencv で必須の行列法を使用して、あるカメラポーズの R と t を別のカメラポーズと比較して取得しようとしています。私が従っている手順は次のとおりです。
- SIFT を使用して特徴をマークする
- FLANN マッチングを使用した特徴のマッチング
- 基本行列を計算します。
- 基本行列を計算する
- SVD を実行して U、W、Vt を取得する
- 正規化/均質化されたポイントがカメラの前にあるかどうかに応じて、R と t のどの組み合わせが正しいかを確認します。
簡単なチェックのために、これを画像ペアでテストしましたが、同じ画像を2回使用しました(カメラも画像ポイントも移動していないため)。したがって、平行移動ベクトルはnullで、回転は同一である必要があります. しかし、プログラムの出力は間違っています。
The fundamental matrix is
[[ 3.59955121e-17 -5.77350269e-01 2.88675135e-01]
[ 5.77350269e-01 5.55111512e-17 2.88675135e-01]
[ -2.88675135e-01 -2.88675135e-01 0.00000000e+00]]
Fundamental matrix error check: 0.000000
The essential matrix is
[[ 4.51463713e-10 -7.25229650e+06 -2.37367600e+06]
[ 7.25229650e+06 6.98357978e-10 4.27847619e+06]
[ 2.37367600e+06 -4.27847619e+06 -1.33013600e-10]]
Translation matrix is
[-0.48905495 -0.2713251 0.82898007]
Rotation matrix is
[[ 0.52165052 -0.26538577 0.8108336 ]
[-0.26538577 0.85276538 0.4498462 ]
[ 0.8108336 0.4498462 -0.3744159 ]]
Roll: -26.965168, Pitch: 129.775110, Yaw: -54.179055
また、このコードを 1 組のカメラで使用し、X 方向に特定の距離だけ移動させました。しかし、この手法を使用して取得したオイラー角と平行移動 (ここでは、1 つではなく 2 つのカメラ行列を考慮しています) はまだ間違っています。平行移動ベクトルは、X と Z の両方で移動したことを示しており、回転マトリックスは正確ではありません。ここで何がうまくいかないのか混乱しています。どんな提案でも非常に役に立ちます。ありがとうございました!
編集:私のコードはここで見ることができます