首页 > 编程语言 >一文图解单目相机标定算法

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

时间:2022-10-05 10:32:22浏览次数:70  
标签:标定 像素 相机 畸变 单目 图像 图解 坐标系


有一天,蟹老板找底下的员工川建国同学:


一文图解单目相机标定算法_世界坐标系

一文图解单目相机标定算法_3d_02

一文图解单目相机标定算法_3d_03

一文图解单目相机标定算法_世界坐标系_04

一文图解单目相机标定算法_世界坐标系_05

一文图解单目相机标定算法_3d_06

等蟹老板走后,然后转头问旁边的学霸李雷同学:

一文图解单目相机标定算法_相机标定_07

一文图解单目相机标定算法_相机标定_08

一文图解单目相机标定算法_世界坐标系_09

李雷同学整理了下情绪:

一文图解单目相机标定算法_世界坐标系_10



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


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


01 什么是相机标定?

一文图解单目相机标定算法_世界坐标系_11

说到相机标定,就要先说什么是传感器的标定。我们知道,任何传感器,它都是存在有误差的,那么狭义上说,标定就是去校正这部分误差,让传感器尽量准确一点。我们来看相机标定前后输出图像的差别:

一文图解单目相机标定算法_3d_12

图1 相机标定前后输出图像的差别

有人说了,那为什么相机出厂前,它不提前做好标定呢?

一文图解单目相机标定算法_相机标定_13

李雷同学又鄙夷了一次建国同学:

一文图解单目相机标定算法_3d_14

一文图解单目相机标定算法_相机标定_15

出厂前相机标定,厂家想做(谁不想自己的传感器准一点呢),但这个真还不是厂家懒,它真做不了。因为相机要标定的参数,跟相机实际的光圈、焦距大小有关,而这两个参数,在一般的工业相机中都是可调节的,所以只能你自己来标定。

一文图解单目相机标定算法_3d_16

常见单目相机标定方法是张正友标定法,这在很多软件,比如说MATLAB、或者库OpenCV中都有相应的实现。至于相机标定,要标定哪些参数,先让我来和你说一下单目相机的成像模型。

一文图解单目相机标定算法_3d_17

哦,对了,要补充一点,我们常说的标定可不光光指纠正传感器的误差,当涉及到两个或者多个传感器的标定的时候,往往还包括计算出这些传感器间的相互位置关系。比如说在机器人系统里,我们经常需要在不同坐标系下转换位置关系,那么我们所说的一些标定还包括标定出这些关节、传感器之间的相互位置关系。再比如说我们双目相机的标定,就包括左相机、右相机的传感器误差标定,还包括它们之间相互位置关系的这么一个标定。



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


一文图解单目相机标定算法_世界坐标系_18

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

一文图解单目相机标定算法_3d_19

一文图解单目相机标定算法_3d_20


02 理想单目相机成像模型

一文图解单目相机标定算法_世界坐标系_11


一文图解单目相机标定算法_相机标定_22

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

一文图解单目相机标定算法_世界坐标系_23

图2 小孔成像模型


进一步地,针孔相机模型可以简化为下面这个模型:

一文图解单目相机标定算法_世界坐标系_24

图3 针孔相机模型(未翻转)

图中,P是物点, 是前者在CCD上成像的像点,而是相机的光心,则为成像平面到光心的距离,我们称之为焦距。



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



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

一文图解单目相机标定算法_相机标定_25

图4 四大坐标系

其中:



世界坐标系(3D)世界坐标系就是以外界某个参考点建立的坐标系,单位为mm,或者m。

相机坐标系(3D):以光心建立相机坐标系,其中轴指向相机的正前方。

图像坐标系(2D):光心在成像平面的投影,也就是点建立另一坐标系,称为图像坐标系,单位为mm

像素坐标系(2D):像素坐标系是我们最终用户所看到的,也就是坐标系的原点在图像左上角,单位为像素。



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



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


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

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

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

一文图解单目相机标定算法_世界坐标系_26

图5 世界坐标系到相机坐标系的转换

一文图解单目相机标定算法_相机标定_27



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


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

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



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


一文图解单目相机标定算法_相机标定_28

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

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

一文图解单目相机标定算法_3d_29


一文图解单目相机标定算法_相机标定_30


一文图解单目相机标定算法_世界坐标系_31

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

一文图解单目相机标定算法_世界坐标系_32


  2.3 图像坐标系 -> 像素坐标系


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

一文图解单目相机标定算法_3d_33

一文图解单目相机标定算法_相机标定_34

图7 图像坐标系和像素坐标系的差别


一文图解单目相机标定算法_3d_35



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


一文图解单目相机标定算法_相机标定_36

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

一文图解单目相机标定算法_世界坐标系_37

2.4 汇总

总结一下之前所说的四大坐标系的关系:

一文图解单目相机标定算法_相机标定_38

图8 四大坐标系间关系

它们的公式如下:

1.世界坐标系->相机坐标系


一文图解单目相机标定算法_3d_39

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

一文图解单目相机标定算法_3d_40

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

一文图解单目相机标定算法_3d_41

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

一文图解单目相机标定算法_相机标定_42

进一步化简:

一文图解单目相机标定算法_世界坐标系_43

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

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



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



一文图解单目相机标定算法_相机标定_44

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


03 相机畸变

一文图解单目相机标定算法_世界坐标系_11

一文图解单目相机标定算法_相机标定_46

一文图解单目相机标定算法_3d_47

一文图解单目相机标定算法_世界坐标系_48

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

一文图解单目相机标定算法_相机标定_49

一文图解单目相机标定算法_世界坐标系_50

3.1径向畸变



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


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

一文图解单目相机标定算法_相机标定_51

图10 相机径向畸变


一文图解单目相机标定算法_3d_52

一文图解单目相机标定算法_相机标定_53



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


3.2切向畸变



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


一文图解单目相机标定算法_3d_54

图11 切向畸变

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

一文图解单目相机标定算法_相机标定_55

一文图解单目相机标定算法_3d_56

3.3合并考虑

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

一文图解单目相机标定算法_相机标定_57

一文图解单目相机标定算法_相机标定_58



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


04 成像过程总结

一文图解单目相机标定算法_世界坐标系_11

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

一文图解单目相机标定算法_相机标定_25

一文图解单目相机标定算法_相机标定_38

一文图解单目相机标定算法_相机标定_62


05 思考问题

一文图解单目相机标定算法_世界坐标系_11


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

  1. 世界坐标系、相机坐标系、图像坐标系、像素坐标系、归一化坐标系,它们之间的差别是什么,怎么进行相互转换?
  2. 径向畸变、切向畸变、它们的主要因素、以及如何去校正?
  3. 最好的话,你自己去画这个图,去推导一遍公式。虽然你后面公式会忘,但相信我,3D视觉领域好多公式,我不需要你记住它,但你要有个直觉印象,去推导一遍有助于你真正理解这个公式。

当明白了这些以后,下节课我们讲,怎么通过张正友标定法去获得要标定的参数,标定得来的参数怎么用,用MATALAB跟OpenCV分别去实践,不过在此之前,你要自己思考以下这些问题:

  1. 相机标定,我们究竟要标定那些参数?
  2. 相机畸变发生在四大坐标系转换的哪一过程?
  3. 假设我们拿到了这些参数怎么用?
  4. 对于每个物点,在像素坐标系下都有唯一像点与之对应,那么反过来是否成立?
  5. 怎么去评判标定的好不好?

大家还想要我们讲什么呢?请踊跃留言!高能预警,下节课我们将以视频的形式来讲解。不过,如果你没有好好看这个相机成像过程的文章,下节课我讲的再有趣也是白扯~这里是3D视觉工坊嘉宾,Atlas博士计算机视觉大讲堂,致力于把计算机视觉知识讲得不那么无趣!


准确说,Atlas今年博一,应该讲博士生~

当然啊,之后包括多个传感器的时间戳同步、怎么去做融合,这些在我们后续的教程中都会讲,请关注我们的公众号《3D视觉工坊》。我相信,未来视觉领域,一定是3D视觉的世界,如果你可以从头到尾完整地跟完我们整个课程,并且掌握的话,在硕士期间,再尽量去找一些实习,如果你打算从事3D视觉领域,我相信一定会收到一份不错的offer的。

本文仅做学术分享,如有侵权,请联系删文。


一文图解单目相机标定算法_相机标定_64

标签:标定,像素,相机,畸变,单目,图像,图解,坐标系
From: https://blog.51cto.com/u_14439393/5732298

相关文章

  • 基于图像的单目三维网格重建
    代码地址:https://github.com/ShichenLiu/SoftRas论文题目:SoftRasterizer:ADifferentiableRendererforImage-based3DReasoning(CVPR2019)概述渲染通过模拟图像形成的......
  • 多相机视觉系统的坐标系统标定与统一及其应用
    整理:公众号@新机器视觉 本文仅做学术分享,如有侵权,请联系删除。随着机器视觉应用的日益广泛,大幅面多相机视觉系统的需求越来越多,主要应用方向为大幅面高精度的定位与测量......
  • 一种简化的线扫相机单维度标定法
    线扫相机精度高、速度快、抗干扰能力强,适用于连续性产品的在线检测。针对产品的测量,要获得产品边界的精确坐标,需对检测目标进行图像坐标系u-v到世界坐标系x-y-z的转化,如下图......
  • 蔚来招聘|多传感器联合标定算法工程师
    3D视觉工坊致力于推荐最棒的工作机会,精准地为其找到最佳求职者,做连接优质企业和优质人才的桥梁。团队介绍我们是谁?蔚来是一家全球化的智能电动汽车公司,于2014年11月成立。蔚......
  • 视图解析器
    <!--视图解析器--><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"id="internalResourceViewResolver"><!--前缀--><prop......
  • 函数调用机制图解
      1). 每个函数都有一个自己的栈当调用/执行一个函数时,就会开辟一个独立的空间(栈)此处优先执行main栈当接触到test时会重新创建一个test栈,并且把6传递给test的n......
  • 【WSN定位】基于改进chan算法和talor算法实现多基站目标定位附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 总结 | 相机标定的基本原理与改进方法
    1、相机模型(1)各个坐标系确定空间某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型(各个坐标系),这些坐标系之间的转换参数就是相机参数,求解参数......
  • 基于GAN的单目图像3D物体重建(纹理和形状)
    项目地址:​​https://nv-tlabs.github.io/DIB-R/​​代码地址:​​https://github.com/nv-tlabs/DIB-R​​主要思想很多机器学习的模型都是在图片上操作,但是忽略了图像其实是......
  • 【C#】一幅图解释Class和Delegate 的本质 - 一体双生
    本文纯粹是个人感悟:一个事物=数据+行为,为了定义这两个。.net派生出了Class和Delegate。Class:用于封装数据,Delegate:用于封装行为。于是就有了.net系统的属性和索引、......