仅用于站内搜索,没有排版格式,具体信息请跳转上方微信公众号内链接
点击上方“小白学视觉”,选择加”星标”或“置顶”
重磅干货,第一时间送达
作者:天外飞仙原文:https ://zhuanlan.zhihu.com/p/14517710925
今天通过一组数据和多组实验来验证使用MATLAB与OpenCv进行相机标定,到底谁的精度更高?原因是什么?
选择一组大家都能获取的数据,在OpenCv源代码sample目录中的data数据,选择data目录中的left01、…、left14,共计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
MATLABR2024a:单目视觉标定工具箱
使用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.1MATLAB进行相机标定
MATLAB计算像素重投影误差均误差(MeanE):0.159648(四舍五入保留小数点后6位)
1.2OpenCv进行相机标定
标定参数设置:
intflags=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.3OptiCalib进行相机标定
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.1MATLAB检测的棋盘角点导入OptiCalib系统进行相机标定
OptiCalib使用MATLAB棋盘点进行相机标定重投影误差平均值(MeanE)=0.159648,以上结果与MATLAB和OpenCv使用MATLAB棋盘点进行相机标定的结果一致。
使用OptiCalib对MATLAB棋盘点像素重投影误差二维分布:
如上图为MATLAB检测棋盘角点的二维分布,误差整体相对集中,但是也存在一个明显的噪声点(1个像素左右),稍后我们将修正该点,验证噪声对相机标定的影响。
3.2OpenCv检测的棋盘角点导入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“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解