我正在使用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中的错误还是我做错了什么? 我也尝试写出输入图像,每次都是相同的。只是差异图正在发生变化。