0

opencv で必須の行列法を使用して、あるカメラポーズの R と t を別のカメラポーズと比較して取得しようとしています。私が従っている手順は次のとおりです。

  1. SIFT を使用して特徴をマークする
  2. FLANN マッチングを使用した特徴のマッチング
  3. 基本行列を計算します。
  4. 基本行列を計算する
  5. SVD を実行して U、W、Vt を取得する
  6. 正規化/均質化されたポイントがカメラの前にあるかどうかに応じて、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 の両方で移動したことを示しており、回転マトリックスは正確ではありません。ここで何がうまくいかないのか混乱しています。どんな提案でも非常に役に立ちます。ありがとうございました!

編集:私のコードはここで見ることができます

4

1 に答える 1