OpenCV与Matlab计算单目相机外参的精度比较
测试背景:
利用一块棋盘格标定板,和一个装在车辆驾驶室上方的单目相机,然后求解该单目相机离地面的高度以及姿态(相对理想水平面相机坐标系),
采集一张图片,分别用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的结果误差很小。
评论已关闭