2

OpenCV で StereoBM を使用して、画像のペアから視差マップを抽出しようとしています。以下の視差マップの質の悪さを無視すると、パラメーター ndisparities に対応する左側に多数の黒い列があることがわかります。ndisparities は、StereoBM がどれだけ「遠く」離れて対応を検索できるかを伝えるだけだと思いました。この動作の原因は何ですか? 結果の深度マップの幅を制限しているように見えますが、その理由はわかりません。

視差マップ

ここにステレオ ペアが表示され、下に私のコードが表示されます。ご指摘ありがとうございます。

Mat Limg = imread("left.jpg", CV_LOAD_IMAGE_GRAYSCALE);
Mat Rimg = imread("right.jpg", CV_LOAD_IMAGE_GRAYSCALE);

Mat disp(Limg.size(), CV_16SC1), disp8U;
int ndisparities = 512;
StereoBM SBM(StereoBM::BASIC_PRESET, ndisparities , 11);
SBM(Limg, Rimg, disp, CV_16S);

double minVal, maxVal;
minMaxLoc( disp, &minVal, &maxVal );
disp.convertTo( disp8U, CV_8UC1, 255/(maxVal - minVal));
imshow("disparity", disp8U)
4

1 に答える 1

9

視差マップは、左右の画像内の対応する点のペア間の縦方向 (エピポーラ) オフセットを定量化します。

原則として、

 disparity := x_l - x_r

ここでx_l、 とx_rは、空間内の特定の点の 2 台のカメラの焦点面への投影です。(大きな視差は、カメラに近いピクセルを特徴付けることに注意してください。[A])


パラメータは、予想されるndisparities最大視差を定量化します (最小視差を無視できると仮定します)。

それndisparitiesがあなたの最大の格差であると仮定しているので、それは当てはまります

    x_l - x_r < ndisparities,

すなわち

    x_r > x_l - ndisparities 

したがって、左の画像の最初の列にある任意のピクセルの右の画像との対応を探すのは意味ndisparitiesがありません。

ある意味では、右側のカメラndisparitiesのビュー コーンは、左側のカメラのビュー コーンの右側の列から始まります。


修正:

視差マップの左側にある 黒い列を減らしたい場合は、より低い値を想定できる必要がありますndisparities

最も近いオブジェクトのカメラからの距離 ([A] から) に依存するためndisparities 、カメラをオブジェクトからさらに離すか、カメラを互いに近づけます。

あなたの非常に具体的なケースでは、大きな格差があります(stereoBMの多くの作業)!! 前景の「x」記号は、画像のスケールに匹敵する視差を示しています!! カメラをもっと遠くに置く必要があると思います。

于 2013-04-05T12:31:32.263 に答える