点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
重磅干货,第一时间送达
作者:天外飞仙
原文:https://zhuanlan.zhihu.com/p/14517710925
今天通过一组数据和多组实验来验证使用MATLAB与OpenCv进行相机标定,到底谁的精度更高?原因是什么?
一、实验数据
选择一组大家都能获取的数据,在OpenCv源代码sample目录中的data数据,选择data目录中的left01.jpg、…、 left14.jpg,共计13张图像。

下载地址:OpenCv官网:https://opencv.org/releases/
在…\4.10.0\opencv-4.10.0\samples\data目录中
二、测试工具
VS2022开发平台: 编写OpenCv标定程序,整理数据
测试工具或代码参考:
OpenCv标定程序参考:OpenCv4.5.5 源代码中的…opencv-4.10.0\samples\cpp\calibration.cpp
MATLAB R2024a:单目视觉标定工具箱
使用OptiCalib标定系统对OpenCv和MATLAB标定结果进行标定结果进行可视化对比分析,今天主要对相机标定结果的重投影均误差进行对比分析。
三、测试配置
为对比不同工具的标定精度,这里对标定参数进行统一,按照MATLAB单目视觉标定工具箱的默认配置进行单目镜头相机标定,具体配置如下:
镜头焦距和主点(4参数): 焦距:Fx 、Fy ,主点:Cx、Cy
畸变参数(2参数): 径向畸变: K1、K2,其它参数默认为0,保持不变。
以上是MATLAB标定工具箱的默认配置,测试时OpenCv和OptiCalib标定系统参数设置与MATLAB配置一致,测试在配置一致情况下标定结果的像素重投影误差均误差,其中棋盘方格长度设置为100毫米。
四、实验测试
采用四组实验,标定精度评价标准:像素重投影误差均误差(保留小数点后6位)
1.MATLAB、OpenCv、OptiCalib按照同样配置对13张样本图像进行相机标定,计算三者相机标定的像素重投影误差均误差,评价同样标定参数配置情况下,谁的精度最高。
1.1 MATLAB进行相机标定

MATLAB计算像素重投影误差均误差(MeanE):0.159648(四舍五入保留小数点后6位)
1.2 OpenCv进行相机标定

标定参数设置:
int flags = cv::CALIB_FIX_K3 + cv::CALIB_ZERO_TANGENT_DIST;//设置K3和相机的切向畸变系数为0并锁定

因为OpenCv的calibrateCamera标定函数返回的是像素重投影误差均方根,在此我们将使用OpenCv相机标定结果重新计算像素重投影均误差和像素重投影误差均方根:

OpenCv计算像素重投影误差均误差(MeanE):0.319373(四舍五入保留小数点后6位)
OpenCv计算重投影均方根误差(RMS) = 0.384051(四舍五入保留小数点后6位)
1.3 OptiCalib进行相机标定

OptiCalib标定界面:

OptiCalib计算像素重投影误差均误差(MeanE):0.157898(四舍五入保留小数点后6位)
结论:精度高低排序 OptiCalib > MATLAB > OpenCv
2.将MATLAB检测的棋盘角点导入OpenCv 中,使用OpenCv对MATLAB检测棋盘角点进行相机标定,计算像素重投影误差均误差, 评定同样的检测角点精度情况下,OpenCv与MATLAB标定精度谁最高。
导出MATLAB检测的棋盘角点,OpenCv使用同样的配置进行相机标定:

OpenCv使用MATLAB棋盘点进行相机标定重投影误差平均值(MeanE)= 0.159648
OpenCv使用MATLAB棋盘点进行相机标定重投影均方根误差(RMS) = 0.182783
以上结果与MATLAB标定结果一致。
3.将MATLAB和OpenCv检测的棋盘角点导入OptiCalib系统中,使用OptiCalib对MATLAB和OpenCv检测棋盘角点进行相机标定,计算像素重投影误差均误差。使用OptiCalib系统来对比分析OpenCv与MATLAB棋盘角点检测精度。
3.1 MATLAB检测的棋盘角点导入OptiCalib系统进行相机标定

OptiCalib使用MATLAB棋盘点进行相机标定重投影误差平均值(MeanE)= 0.159648,以上结果与MATLAB和OpenCv使用MATLAB棋盘点进行相机标定的结果一致。
使用OptiCalib对MATLAB棋盘点像素重投影误差二维分布:

如上图为MATLAB检测棋盘角点的二维分布,误差整体相对集中,但是也存在一个明显的噪声点(1个像素左右),稍后我们将修正该点,验证噪声对相机标定的影响。
3.2 OpenCv检测的棋盘角点导入OptiCalib系统进行相机标定

OptiCalib使用OpenCv棋盘点进行相机标定重投影误差平均值(MeanE)= 0.319373,这个结果与使用OpenCv直接进行相机标定结果一致。
如上图为OpenCv检测棋盘角点的二维分布,误差整体相对集中,但是存在较多大于1个像素的噪声点,这是引起OpenCv相机标定精度低的原因。
4.使用OptiCalib修正MATLAB检测的棋盘角点噪声后再进行相机标定, 计算像素重投影误差均误差。
该实验是验证噪声对相机标定精度的影响,使用OptiCalib修正MATLAB的噪点,再进行相机标定:
先放大看下噪点信息:
双击OptiCalib二维分布图噪点,即可自动定位该点所在的影像和对应图像位置,标定点编辑页面如下:


图像中双击新的位置,即可使用对MATLAB棋盘点噪点修正,修正后进行相机标定重投影误差平均值(MeanE)= 0.158018,修正前重投影均误差为0.159648。
由此可见,棋盘噪声对相机标定精度影响较大。
五、结论
1.MATLAB比OpenCv检测棋盘角点的精度高,噪点分布少。
2.MATLAB比OpenCv相机标定精度高直接原因是MATLAB定位角点的精度高和一致性较好。
3.在使用同样角点数据的情况下,MATLAB、OpenCv、OptiCalib进行相机标定结果一致(重投影误差保留小数点后6位)。
4.标定点中的噪点对标定精度影响较大,在相机标定时应该逐点检查并剔除,以确保参与运算的点没有噪声。
最后需要说明的是:像素重投影误差并非相机标定精度评定的唯一评价标准,重投影误差小并不一定代表镜头的标定精度就高,它仅能代表该组样本的棋盘方格的拟合程度,对于未拍摄到棋盘方格约束的镜头区域,其像素畸变程度仍不确定,特别是边缘区域。
以上仅仅是个人观点,各位行业朋友有任何疑问可以留言或者私信~欢迎讨论~~~
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~