为什么当视差通过opencv输出失真时屏幕?

时间:2017-12-27 03:17:05

标签: c++ opencv

首先,我是一个不会说英语的韩国人。

因为我缺乏英语技能而使用谷歌的翻译,

请事先确认

我想通过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;
}

下面的图片是我使用的。

left image

right image

result

sample image 2

0 个答案:

没有答案