2

我正在使用 StereoBM 使用 OpenCV 2.4.3 计算立体视差图,每次运行时我似乎都会得到不同的视差图。视觉上不明显,但有几个像素是不同的,随机的。

我尝试将视差图保存到 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