KITTI データセットのステレオ カメラ ペアを使用して、カメラの軌跡を推定しようとしています。プログラムはある時点で cv::SolvePNP() を使用し、最初の 1500 フレームでは非常に良い結果を返しますが、その後は完全に暴走します。
これが私が現在行っていることです:
- 2 つのフレームをロードし、それらを P および Q と呼びます (1 つのフレームは、ステレオ ペアからの左右の画像です)
- SIFT/SURF/ORB を使用して機能を取得する (それらすべてを試した)
- P の特徴に一致し、P.left と Q.left の間で一致します
- 一致に基づいて、一致に存在しないキーポイントを除外します。
- フレーム P 上のポイントを三角測量します (KITTI データセットによって提供されたカメラ マトリックスが既にあることに注意してください)。
- 同種からポイントを変換します
スパイシーな部分が来ました。標準の cv::solvePNP からより良い rvec と tvec を取得するために、solvePNP を利用する独自の RANSAC を実装しようとしています (cv::solvePNPRansac を使用してみましたが、問題なく動作しましたが、開始したことに注意してください)。しばらくすると失敗します)。したがって、Ransac プロセスは次のようになります。
7.1 3D 空間 (P 上の三角点) と対応する Q.left 上のキーポイントをランダム化します
7.2 それらの N ポイント (N は私の RANSAC パラメータ) を cv::SolvePNP() に入れ、2 つのフレーム間でどれだけカメラが移動したかを取得します (私の dist Coefs はゼロ行列であることに注意してください)。 cv::Rodrigues() を使用して Matrix に変換します
7.3 これらのベクトルを連結する
7.4 次の式を使用して、すべての三角点 (solvePNP で使用される点だけでなく) を 2D 画像に投影しようとします。
https://i.imgur.com/aMlZw9z.png
(左側で 1 を取得しないことに注意してください。代わりに、いくつかの x、y、z 値を取得するため、x と y を z で除算します)。
7.5 P.left の投影点とキーポイントの違いを見つけました
7.6 現在、私の RANSAC には、外れ値をフィルター処理し、RANSAC の次の繰り返しで使用しないようにするために使用するしきい値があります。
7.7 新しい (フィルタリングされた) ポイントでプロセスを K 回繰り返します (K は RANSAC パラメータでもあります)
現在、これは 80% のフレームで機能しますが、しばらくすると、solvePNP が受け取るポイントが少なすぎるために失敗します。これは、投影されたポイントが実際には距離のしきい値を超えていないために発生します。だから問題は前のフレームからの rvec と tvec にあります。
コードのどの部分を表示する必要があるのか 本当にわからないので、リクエストして書きます。
rvec と tvec で小さなエラーが発生すると予想していましたが、エラーが大きすぎます。