【CV】一文图解单目相机标定算法

共 3737字,需浏览 8分钟

 ·

2021-02-02 20:49

有一天,蟹老板找底下的员工川建国同学:
等蟹老板走后,然后转头问旁边的学霸李雷同学:
李雷同学整理了下情绪:


有人反映哦,有时候我们发出来的技术贴太硬了,不方便去理解,于是,就有了上面这个尝试,在开始正课之前,我们先讲一段故事。如果大家觉得OK,后面我们将继续用这种方式来讲课,如果不OK,请大家在我们评论区提供您宝贵的意见。

这次单目相机标定教程,预计有三期,第一期讲单目相机成像过程,第二期讲MATALAB和OpenCV的单目相机标定实践,第三期则讲张正友标定法的原理。这里是3D视觉工坊嘉宾,Atlas博士生计算机视觉大讲堂,致力于把计算机视觉知识讲得不那么无趣!

01 什么是相机标定?
说到相机标定,就要先说什么是传感器的标定。我们知道,任何传感器,它都是存在有误差的,那么狭义上说,标定就是去校正这部分误差,让传感器尽量准确一点。我们来看相机标定前后输出图像的差别:
图1 相机标定前后输出图像的差别
有人说了,那为什么相机出厂前,它不提前做好标定呢?
李雷同学又鄙夷了一次建国同学:
出厂前相机标定,厂家想做(谁不想自己的传感器准一点呢),但这个真还不是厂家懒,它真做不了。因为相机要标定的参数,跟相机实际的光圈、焦距大小有关,而这两个参数,在一般的工业相机中都是可调节的,所以只能你自己来标定。
常见单目相机标定方法是张正友标定法,这在很多软件,比如说MATLAB、或者库OpenCV中都有相应的实现。至于相机标定,要标定哪些参数,先让我来和你说一下单目相机的成像模型。
哦,对了,要补充一点,我们常说的标定可不光光指纠正传感器的误差,当涉及到两个或者多个传感器的标定的时候,往往还包括计算出这些传感器间的相互位置关系。比如说在机器人系统里,我们经常需要在不同坐标系下转换位置关系,那么我们所说的一些标定还包括标定出这些关节、传感器之间的相互位置关系。再比如说我们双目相机的标定,就包括左相机、右相机的传感器误差标定,还包括它们之间相互位置关系的这么一个标定。


概括一下,常说的标定包括两部分内容:传感器误差的校正、传感器相互之间的位置关系。


而单目相机的标定主要指前者,传感器误差的校正,常用的方法是张正友标定法

02 理想单目相机成像模型


实际上,小孔成像的模型其实可以看作是针孔相机模型的基础:

图2 小孔成像模型
进一步地,针孔相机模型可以简化为下面这个模型:
图3 针孔相机模型(未翻转)
图中,P是物点, 是前者在CCD上成像的像点,而是相机的光心,则为成像平面到光心的距离,我们称之为焦距。


实际上,焦距的定义会更复杂,是所有平行光透过透镜汇聚一点,那一点到透镜光心的距离,它就涉及到摄影里非常专业的概念最小弥散圆了,我们之后会讲一期相机光圈、焦距、景深、视场大小、最佳成像距离的专栏。


这里先把模型简化一下吧,下面我们来讲整个成像过程,在相机成像模型中,主要有四大坐标系:世界坐标系相机坐标系图像坐标系像素坐标系。
图4 四大坐标系
其中:


世界坐标系(3D)世界坐标系就是以外界某个参考点建立的坐标系,单位为mm,或者m。
相机坐标系(3D):以光心建立相机坐标系,其中轴指向相机的正前方。
图像坐标系(2D):光心在成像平面的投影,也就是点建立另一坐标系,称为图像坐标系,单位为mm
像素坐标系(2D):像素坐标系是我们最终用户所看到的,也就是坐标系的原点在图像左上角,单位为像素。

那么这中间,我们怎么建立实际物理点(世界坐标系)到图像上点(像素坐标系)的一一映射呢?需要三步转换,也就是:


世界-> 相机 -> 图像 -> 像素

这中间,这些坐标系有什么差别,它们是怎么转换的?请看下面的文章。

2.1世界坐标系 -> 相机坐标系

我们知道,世界坐标系就是以外界某个参考点建立的坐标系,而相机坐标系则是以相机的光心作为坐标原点,光轴的正方向作为Z轴建立的坐标系,两者属于刚体变换,只需要进行旋转和平移,如下所示:
图5 世界坐标系到相机坐标系的转换


为了统一旋转和平移,我们将其写为齐次形式,至于为什么要用齐次,我们之后的栏目里也会说,总而言之是这样的。

2.2 相机坐标系 -> 图像坐标系

在完成了世界坐标系 -> 相机坐标系的转换后,我们再从相机坐标系 -> 图像坐标系。为了方便描述,我们将针孔相机模型对称翻转过来,如下图所示,从数学的角度,它们是等价的:


想不明白没关系,这里就算是不等价的,我们就假设相机的电子设备已经帮我们做好了这样一个翻转

图6 针孔相机模型(翻转)

先回顾一下前面所说的,如我们之前所说:P是物点、P’是像点,现在我们将它翻转过来了,记作小写的p。其中:

跟之前的公式统一一下,写为齐次形式:


  2.3 图像坐标系 -> 像素坐标系
图像坐标系中,坐标的原点在图像中间,而我们平时处理图像时用的坐标系,称为像素坐标系,坐标系的原点在图像的左上角,此外它们的度量单位也不同,前者的单位是mm,而后者的单位是像素。如下图所示,两个坐标系之间的差别:
图7 图像坐标系和像素坐标系的差别



CCD并不是一个正方形,dx、dy的大小是有所差别的

其进行移项,并写为齐次的形式,有:

2.4 汇总
总结一下之前所说的四大坐标系的关系
图8 四大坐标系间关系

它们的公式如下:
1.世界坐标系->相机坐标系

2.相机坐标系->图像坐标系

3.图像坐标系->像素坐标系

那么将这些式子联立,最终得(你可以尝试自己去推导一下,就是几个式子代换一下):

进一步化简:

这个公式就是整个单目相机在理想情况下的成像公式,可以建立世界坐标系到像素坐标系的一一映射。

再补充一个知识点,归一化平面:



归一化平面,其实际是图像坐标系的等比缩放,也就是当f=1的情况,主要是便于公式推导,它与图像坐标系是等比缩放关系,只需要乘以f即可完成相互转换。

图9 图像坐标系与归一化平面关系

03 相机畸变


以上是理想情况下世界坐标系到像素坐标系的转换。而由于相机制造工艺的原因,其成像过程中难免存在着畸变,在后续构建精确的三维重建算法前,我们要对相机的畸变进行矫正,以提高算法重建的精度,这一步骤才称为相机标定。

3.1径向畸变



径向畸变原因:在相机制造过程中,很难保证镜头的厚度完全均匀,由于制造工艺的原因,通常为这种情况为中间厚、边缘薄,因而光线在远离透镜中心的地方,会发生更大程度的扭曲,这种现象在鱼眼相机(桶形畸变)中尤为明显。

径向畸变主要有两种类型:枕型畸变桶型畸变,示意图如下:
图10 相机径向畸变



需要注意的是,这里校正,并不是用的系数越多,整个矫正结果越精确,我们应该考虑相机的实际情况,选择合适的参数数量。


3.2切向畸变



切向畸变原因:切向畸变产生的原因在于相机在制造过程中,成像平面与透镜平面不平行,产生了透视变换。


图11 切向畸变
这种畸变可以由以下公式描述,它也与距离图像中心的距离半径有关:

3.3合并考虑

将径向畸变和切向畸变合并,只需要将两个畸变矫正直接加起来即可,公式如下:




合并考虑畸变原因:其实也很简单,两种畸变是同时发生在成像过程中的,发生的原因也是相互独立的,而且也都是关于距离的表达式,你似乎也找不到更好的方式来综合考虑这两种误差,实践证明,这种合并考虑畸变的情况效果还不错。

04 成像过程总结
我已经把所有需要记住的知识点汇聚在一张图片上了,请大家对照着前面的文章去理解:


05 思考问题


当看完这次推文之后,请大家在脑海里梳理以下几个概念:

  1. 世界坐标系、相机坐标系、图像坐标系、像素坐标系、归一化坐标系,它们之间的差别是什么,怎么进行相互转换?
  2. 径向畸变、切向畸变、它们的主要因素、以及如何去校正?
  3. 最好的话,你自己去画这个图,去推导一遍公式。虽然你后面公式会忘,但相信我,3D视觉领域好多公式,我不需要你记住它,但你要有个直觉印象,去推导一遍有助于你真正理解这个公式。
当明白了这些以后,下节课我们讲,怎么通过张正友标定法去获得要标定的参数,标定得来的参数怎么用,用MATALAB跟OpenCV分别去实践,不过在此之前,你要自己思考以下这些问题:
  1. 相机标定,我们究竟要标定那些参数?
  2. 相机畸变发生在四大坐标系转换的哪一过程?
  3. 假设我们拿到了这些参数怎么用?
  4. 对于每个物点,在像素坐标系下都有唯一像点与之对应,那么反过来是否成立?
  5. 怎么去评判标定的好不好?
大家还想要我们讲什么呢?请踊跃留言!高能预警,下节课我们将以视频的形式来讲解。不过,如果你没有好好看这个相机成像过程的文章,下节课我讲的再有趣也是白扯~这里是3D视觉工坊嘉宾,Atlas博士计算机视觉大讲堂,致力于把计算机视觉知识讲得不那么无趣!

往期精彩回顾





本站知识星球“黄博的机器学习圈子”(92416895)

本站qq群704220115。

加入微信群请扫码:

浏览 86
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报