2

OpenCV 2.4.3 を使用して StereoBM を使用してステレオ視差マップを計算していますが、実行するたびに異なる視差マップを取得しているようです。視覚的には目立ちませんが、いくつかのピクセルがランダムに異なります。

視差マップを YML ファイルに保存しようとしましたが、WinMerge を使用してそれらを比較すると、いくつかのピクセルの値が -16 であることがわかりました。他の実行では視差値が生成されました。これも簡単に再現できます。

このスニペットは、私が何をしているかを示しています:

//initialize bm
StereoBM bm(StereoBM::BASIC_PRESET, 128, 7); bm.state->preFilterType = CV_STEREO_BM_XSOBEL;
bm.state->preFilterCap = 63;
bm.state->SADWindowSize = 7;
bm.state->minDisparity = 0;
bm.state->numberOfDisparities = 96;
bm.state->textureThreshold = 3;
bm.state->uniquenessRatio = 3;
bm.state->speckleWindowSize = 20;
bm.state->speckleRange = 32;
bm.state->disp12MaxDiff = 1;

// Get rectified images
videoOut[MASTER] = Mat(frameHeight, frameWidth, CV_8UC3, static_cast(frameBuf[MASTER]));
videoOut[SLAVE] = Mat(frameHeight, frameWidth, CV_8UC3, static_cast(frameBuf[SLAVE]));

// grayscale conversion
cvtColor(videoOut[MASTER], frame[MASTER], CV_RGB2GRAY);
cvtColor(videoOut[SLAVE], frame[SLAVE], CV_RGB2GRAY);

// Subsample
resize(frame[MASTER], frame[MASTER], cv::Size(), 0.5, 0.5, cv::INTER_LINEAR);
resize(frame[SLAVE], frame[SLAVE], cv::Size(), 0.5, 0.5, cv::INTER_LINEAR);

// stereo computation
Mat disp = cv::Mat(frame[MASTER].rows, frame[MASTER].cols, CV_16S);
bm(frame[MASTER], frame[SLAVE], disp);

// write to file
FileStorage f1;
f1.open("data.yml", FileStorage::WRITE);
f1 << "disp" << disp;

これは OpenCV のバグですか、それとも何か間違っていますか? 入力画像も書き出してみましたが、毎回同じです。変化しているのは視差マップだけです。

4

0 に答える 0