点击下方卡片,关注「3D视觉工坊」公众号
选择星标,干货第一时间送达

编辑:3D视觉工坊

添加小助理:cv3d001,备注:方向+单位+昵称,拉你入群。文末附行业细分群。

扫描下方二维码,加入「3D视觉从入门到精通」知识星球(点开有惊喜),星球内凝聚了众多3D视觉实战问题,以及各个模块的学习资料:近20+门独家视频课程100+场顶会直播讲解最新顶会论文分享计算机视觉书籍优质3D视觉算法源码等。想要入门3D视觉、做项目、搞科研,欢迎扫码加入!

作者:天外飞仙
原文: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单目标定工具箱标定结果
MATLAB单目标定工具箱标定结果

MATLAB计算像素重投影误差均误差(MeanE):0.159648(四舍五入保留小数点后6位)

1.2 OpenCv进行相机标定

OpenCv棋盘角点检测配置
OpenCv棋盘角点检测配置

标定参数设置:

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

OpenCv相机标定参数配置
OpenCv相机标定参数配置

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

计算MeanE和RMS
计算MeanE和RMS

OpenCv计算像素重投影误差均误差(MeanE):0.319373(四舍五入保留小数点后6位)

OpenCv计算重投影均方根误差(RMS) = 0.384051(四舍五入保留小数点后6位)

1.3 OptiCalib进行相机标定

OptiCalib配置解算Fx、Fy和K1、K2

OptiCalib标定界面:

OptiCalib标定结果
OptiCalib标定结果

OptiCalib计算像素重投影误差均误差(MeanE):0.157898(四舍五入保留小数点后6位)

结论:精度高低排序 OptiCalib > MATLAB > OpenCv

2.将MATLAB检测的棋盘角点导入OpenCv 中,使用OpenCv对MATLAB检测棋盘角点进行相机标定,计算像素重投影误差均误差, 评定同样的检测角点精度情况下,OpenCv与MATLAB标定精度谁最高。

导出MATLAB检测的棋盘角点,OpenCv使用同样的配置进行相机标定:

MATLAB检测棋盘角点导入OpenCv进行相机标定
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棋盘点进行相机标定
OptiCalib使用MATLAB棋盘点进行相机标定

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

使用OptiCalib对MATLAB棋盘点像素重投影误差二维分布:

MATLAB棋盘点重投影误差二维分布
MATLAB棋盘点重投影误差二维分布

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

3.2 OpenCv检测的棋盘角点导入OptiCalib系统进行相机标定

OpenCv棋盘点重投影误差二维分布
OpenCv棋盘点重投影误差二维分布

OptiCalib使用OpenCv棋盘点进行相机标定重投影误差平均值(MeanE)= 0.319373,这个结果与使用OpenCv直接进行相机标定结果一致。

如上图为OpenCv检测棋盘角点的二维分布,误差整体相对集中,但是存在较多大于1个像素的噪声点,这是引起OpenCv相机标定精度低的原因。

4.使用OptiCalib修正MATLAB检测的棋盘角点噪声后再进行相机标定, 计算像素重投影误差均误差。

该实验是验证噪声对相机标定精度的影响,使用OptiCalib修正MATLAB的噪点,再进行相机标定:

先放大看下噪点信息:

双击OptiCalib二维分布图噪点,即可自动定位该点所在的影像和对应图像位置,标定点编辑页面如下:

OptiCalib标定点修正界面
OptiCalib标定点修正界面
OptiCalib对标定点进行放大并修正后结果
OptiCalib对标定点进行放大并修正后结果

图像中双击新的位置,即可使用对MATLAB棋盘点噪点修正,修正后进行相机标定重投影误差平均值(MeanE)= 0.158018,修正前重投影均误差为0.159648。

由此可见,棋盘噪声对相机标定精度影响较大。

五、结论

1.MATLAB比OpenCv检测棋盘角点的精度高,噪点分布少。

2.MATLAB比OpenCv相机标定精度高直接原因是MATLAB定位角点的精度高和一致性较好。

3.在使用同样角点数据的情况下,MATLAB、OpenCv、OptiCalib进行相机标定结果一致(重投影误差保留小数点后6位)。

4.标定点中的噪点对标定精度影响较大,在相机标定时应该逐点检查并剔除,以确保参与运算的点没有噪声。

最后需要说明的是:像素重投影误差并非相机标定精度评定的唯一评价标准,重投影误差小并不一定代表镜头的标定精度就高,它仅能代表该组样本的棋盘方格的拟合程度,对于未拍摄到棋盘方格约束的镜头区域,其像素畸变程度仍不确定,特别是边缘区域。

以上仅仅是个人观点,各位行业朋友有任何疑问可以留言或者私信~欢迎讨论~~~


下面来自于3D视觉工坊:

标定精度的影响因素主要包括:

  • 图像分辨率;

  • 特征提取精度;

  • 标定板摆放位姿是否覆盖全面

  • 标定算法,迭代条件

  • 椭圆构象偏差

为什么推荐圆形标定板

图片

图片对称圆标定板

图片非对称标定板

图片扫码可查看商品详情

图片▲长按添加小助理:cv3d001 或者 13451707958,咨询更多

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐