数週間前、単純なブロック マッチング ステレオ アルゴリズムを実装しましたが、結果は良くありませんでした。そこで、より良いアルゴリズムを見つけるためにインターネットを検索しました。そこで、Heiko Hirschmueller が発行したセミ グローバル マッチング (SGM)を見つけました。処理時間に関しては、最高の結果の 1 つが得られます。
ここでわかるように、アルゴリズムを実装したところ、(単純なブロック マッチングと比較して) 非常に良い結果が得られました。
計算された視差値を使用して 2D ポイントを 3D に再投影し、次の結果を得ました。
SGM の最後に、各ピクセルの総コストを含む配列があります。格差は、コスト値が最も低いインデックスに相当します。
問題は、最小値を検索しても離散値しか返されないことです。これにより、ポイント クラウドに個別のレイヤーが作成されます。言い換えると、丸い表面は多くのレイヤーにカットされます (点群を参照)。
Heiko は彼の論文で、多項式関数をコスト配列に当てはめ、最低点を視差として取得することで、サブピクセル精度を簡単に取得できると述べました。
問題はステレオ ビジョンに限定されないため、言い換えると、タスクは次のようになります。
- given : 多項式関数を表す値の配列。
- want : 多項式関数の最低点。
これを行う方法がわかりません。画像内のすべてのピクセルに対してこのコードを実行する必要があるため、高速なアルゴリズムが必要です
例: 500x500 ピクセルにそれぞれ 60 ~ 200 のコストがかかる => アルゴリズムは 15000000 ~ 50000000 回実行する必要があります!!)。
リアルタイムのソリューションは必要ありません。私の現在の SGM 実装 (L2R と R2L のマッチング、cuda またはマルチスレッドはまだありません) は、500x500 ピクセルの画像を処理するのに約 20 秒かかります;)。
私は図書館を求めません!私は独自の独立したコンピューター ビジョン ライブラリを実装しようとしています :)。
ご協力ありがとうございました!
敬具 アンドレアス