首先,我是一个不会说英语的韩国人。
因为我缺乏英语技能而使用谷歌的翻译,
请事先确认
我想通过opencv获得差异。
我使用了" findChessboardCorners"前任任务的功能。
我们使用以下坐标值校准立体相机。
完成屏幕校正后,看到视差后,它看起来只有噪音。
为什么?
// this function is get diparity
int getDisparity(Mat leftImg, Mat rightImg)
{
// value null check
if (leftImg.empty() || rightImg.empty()) {
return -1;
}
int SADWindowSize, numberOfDisparities;
//bool no_display;
//float scale;
// default variable
numberOfDisparities = 16;//16;// 192;
SADWindowSize = 3;//3;// 64;
Ptr<StereoSGBM> sgbm = StereoSGBM::create(0, numberOfDisparities, SADWindowSize);
Mat img1 = leftImg;
Mat img2 = rightImg;
// get view size
Size img_size = img1.size();
numberOfDisparities = numberOfDisparities > 0 ? numberOfDisparities : ((img_size.width / 8) + 15) & -16;
// set sgbm parameters
sgbm->setPreFilterCap(63);
int sgbmWinSize = SADWindowSize > 0 ? SADWindowSize : 3;
sgbm->setBlockSize(sgbmWinSize);
int cn = img1.channels();
sgbm->setP1(8 * cn*sgbmWinSize*sgbmWinSize);
sgbm->setP2(32 * cn*sgbmWinSize*sgbmWinSize);
sgbm->setMinDisparity(0);
sgbm->setNumDisparities(numberOfDisparities);
sgbm->setUniquenessRatio(10);
sgbm->setSpeckleWindowSize(100);
sgbm->setSpeckleRange(32);
sgbm->setDisp12MaxDiff(1);
sgbm->setMode(StereoSGBM::MODE_SGBM);
Mat disp, disp8;
// Disparity
sgbm->compute(img1, img2, disp);
// convert type
disp.convertTo(disp8, CV_8U, 255 / (numberOfDisparities*16.));
// show
namedWindow("left image", 1);
imshow("left image", img1);
namedWindow("right image", 1);
imshow("right image", img2);
cv::cvtColor(disp8, disparityMap, cv::COLOR_GRAY2BGR);
// disparity show
namedWindow("disparity", 0);
imshow("disparity", disparityMap);
waitKey(1);
return 0;
}
下面的图片是我使用的。