高精度双目匹配---基于sb标定法

       在上一章中介绍了OpenCV4.3中的findChessboardCornersSB算法,该算法大大提高了单目标定的精度结果。由此我们这里依然可以将这种方法应用在双目标定中以获取更高的标定精度,从而获取更高的匹配精度。首先直接看代码:

      

//Opencv4.3角点提取方法
	isFindL   =findChessboardCornersSB(imageL, boardSize, imageCornersL,CALIB_CB_EXHAUSTIVE | CALIB_CB_ACCURACY);
	isFindR   =findChessboardCornersSB(imageR, boardSize, imageCornersR,CALIB_CB_EXHAUSTIVE | CALIB_CB_ACCURACY);
        //isFindL = cv::findChessboardCorners(imageL, boardSize, imageCornersL);
        //isFindR = cv::findChessboardCorners(imageR, boardSize, imageCornersR);
        if (isFindL == true && isFindR == true)  //如果两幅图像都找到了所有的角点 则说明这两幅图像是可行的
        {
            /*
            Size(5,5) 搜索窗口的一半大小
            Size(-1,-1) 死区的一半尺寸
            TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ASsxITER, 20, 0.1)迭代终止条件
            */
            //cv::cornerSubPix(imageL, imageCornersL, cv::Size(5, 5), cv::Size(-1, -1), cv::TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 20, 0.1));
            cv::drawChessboardCorners(imageL, boardSize, imageCornersL, isFindL);
            //  cv::imshow("chessboardL", imageL);
            imagePointL.push_back(imageCornersL);

            //cv::cornerSubPix(imageR, imageCornersR, cv::Size(5, 5), cv::Size(-1, -1), cv::TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 20, 0.1));
            cv::drawChessboardCorners(imageR, boardSize, imageCornersR, isFindR);
          //  cv::imshow("chessboardR", imageR);
            imagePointR.push_back(imageCornersR);

            goodFrameCount++;
            std::cout << "The image" << goodFrameCount << " is good" << std::endl;
        }

       在上述代码中,我们分别对左图和右图提取了SB角点,这样得到的子像素角点精度将远远高于OpenCV3.4版本中的组合方法。这里我也做了一个比较,当使用3.4版本的双目标定方法平均RMS为0.478像素,而使用本文中的方法其平均RMS为:

       在非工业界来说,这个标定精度基本上可以应付大部分场景。应用这个精度,我这里调用了OpenCV的SGBM对我所标定的双目图像进行匹配得到如下视差图,如下:

        

高精度双目匹配---基于sb标定法_第1张图片

高精度双目匹配---基于sb标定法_第2张图片

      实际的距离误差大约在2m范围以内,大约精度在5cm以内,而在4m范围,大约是10cm误差。总体来说精度很高。大家可以去试试这个新标定方法带来的惊喜吧!!!

你可能感兴趣的:(计算机视觉,opencv,算法,计算机视觉)