测试背景:

     利用一块棋盘格标定板,和一个装在车辆驾驶室上方的单目相机,然后求解该单目相机离地面的高度以及姿态(相对理想水平面相机坐标系),

采集一张图片,分别用OpenCV的算法与Matlab的算法进行求解,并比较其结果.


一、 棋盘格角点检测比较(使能亚像素角点检测)

      matlab函数:

                        detectCheckerboardPoints()

      opencv函数:

                        cv::findChessboardCorners()和cv::cornerSubPix()


通过绘制角点比较,opencv检测的角点在远处误差较大,检测结果比Matlab要差:







二、PnP问题求解的精度比较

        将Matlab检测的棋盘格角点作为Matlab和OpenCV求解的PnP问题的输入源。通过结果比较,在同样的角点输入的前提下,OpenCV和Matlab对PnP问题的结果精度基本相同,误差很小。













三、棋盘格角点检测比较(关闭亚像素角点检测)

        如果OpenCV不添加亚像素角点检测,其角点检测精度反而更优:

        cv::TermCriteria criteria = cv::TermCriteria( cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 40, 0.001 );

         cv::cornerSubPix(gray, image_points, cv::Size(11,11), cv::Size(-1,-1), criteria);






总结:

        (1): Matlab比OpenCV的求解精度更优,差异主要体现在棋盘格角点的检测更精准;

        (2): 但标定板离相机较远时,如果OpenCV开启亚像素角点检测优化(cv::cornerSubPix),其结果反而更差!!!

        (3): 当OpenCV关闭亚像素检测角点优化代码时,其最终的单目相机外参结果与Matlab的结果误差很小。



标签: none

评论已关闭