6

私は KITTI データ セットに取り組んでおり、2 つの画像を取得し、視差を見つけて 3D ポイント クラウドを取得しています。私が直面している問題は、適切な視差マップを取得できないことです。ほとんどの視差値は 0.1 未満です。視差値は 0 から 1 の間です (スケーリングする必要がありますか)。私のステレオのパラメータは以下のとおりです

cv::StereoBM sbm;
    sbm.state->SADWindowSize = 9;
    sbm.state->numberOfDisparities = 112;
    sbm.state->preFilterSize = 5;
    sbm.state->preFilterCap = 1;
    sbm.state->minDisparity = 0;
    sbm.state->textureThreshold = 5;
    sbm.state->uniquenessRatio = 5;
    sbm.state->speckleWindowSize = 0;
    sbm.state->speckleRange = 20;
    sbm.state->disp12MaxDiff = 64;
sbm(leftimage, rightimage,disp);
    normalize(disp, disp8, 0.1, 255, CV_MINMAX, CV_8U);

右の画像 左画像 視差マップ

4

1 に答える 1

17

あなたが持っている視差マップは、ブロックマッチングに適しています。

ブロック マッチングは、視差マップを取得する最も基本的な方法です。これは、ブルート フォース検索 (opencv からのモジュロ フィルタリング) を介して視差推定値を計算するローカル メソッドです。したがって、その出力は精度が制限され、通常はノイズが多くなります。

他の人が述べたように、ウィンドウ サイズを調整して結果をわずかに改善できますが、これによって視差が大幅に改善されるわけではありません。

KITTI ベンチマークでのステレオ評価を見て、必要に応じてより正確なアルゴリズムを選択してください。OpenCV には、より滑らかな視差を生成する SGM が実装されています。視差マップの望ましい品質は、アプリケーションによって異なります。場合によっては、ブロック マッチングで十分です。他の人にとっては、そうではないかもしれません。

視差の定義は、左の画像のピクセルと右の画像の対応するピクセルの x 座標の差です。つまり、視差の単位は「ピクセル」です。

大きな視差は、より近いオブジェクトを意味します。表示用に画像を拡大縮小すると、視差が大きいほど明るく表示されます。たとえば、道路上の標識はカメラに近く、道路上で遠く離れたピクセルよりも明るく見えます。

視差値は0と1の間にあるとは想定されていません。表示用に画像をuint8としてスケーリングしていますが、これは表示には問題ありませんが、実際の測定に視差を使用するのには適していません。

OpenCV では、デフォルトの動作は、サブピクセル シフトに 16 を掛けて得られる符号付き短整数として視差マップを生成することです。真の視差値を取得するには、opencv の出力を 16 で除算し、float に変換します。

次のようなことができます。

cv::Mat<float> true_dmap = disp * (1.0 / 16.0f);

また

disp.convertTo(true_dmap, CV_32F, 1.0/16.0, 0.0);

または、 reprojectImageTo3Dを呼び出して、推定された視差マップとステレオ キャリブレーションが与えられた点群を取得できます。

imshow を介して true_map を表示しようとすると、意味のあるものが表示されないことに注意してください。

幸運を、

于 2015-03-24T23:42:59.857 に答える