作者丨李迎松@知乎

来源丨https://zhuanlan.zhihu.com/p/378819083

编辑丨3D视觉工坊

亲爱的同学们,我们的世界是3D世界,我们的双眼能够观测三维信息,帮助我们感知距离,导航避障,从而翱翔于天地之间。而当今世界是智能化的世界,我们的科学家们探索各种机器智能技术,让机器能够拥有人类的三维感知能力,并希望在速度和精度上超越人类,比如自动驾驶导航中的定位导航,无人机的自动避障,测量仪中的三维扫描等,都是高智机器智能技术在3D视觉上的具体实现。

立体视觉是三维重建领域的重要方向,它模拟人眼结构用双相机模拟双目,以透视投影、三角测量为基础,通过逻辑复杂的同名点搜索算法,恢复场景中的三维信息。它的应用十分之广泛,自动驾驶、导航避障、文物重建、人脸识别等诸多高科技应用都有它关键的身影。

本课程将带大家由浅入深的了解立体视觉的理论与实践知识。我们会从坐标系讲到相机标定,从被动式立体讲到主动式立体,甚至可能从深度恢复讲到网格构建与处理,感兴趣的同学们,来和我一起探索立体视觉的魅力吧!

本课程是电子资源,所以行文并不会有太多条条框框的约束,但会以逻辑清晰、浅显易懂为目标,水平有限,若有不足之处,还请不吝赐教!

个人微信:EthanYs6,加我申请进技术交流群 StereoV3D,一起技术畅聊。

CSDN搜索 :Ethan Li 李迎松,查看网页版课程。

随课代码,将上传至github上,地址:StereoV3DCode:ethan-li-coding/StereoV3DCode(https://github.com/ethan-li-coding/StereoV3DCode)

大家好,上一篇:立体视觉入门指南:关键矩阵(本质矩阵,基础矩阵,单应矩阵)https://zhuanlan.zhihu.com/p/377794028

中,我们对立体视觉的3个关键矩阵:本质矩阵 E 、基础矩阵 F、单应性矩阵H作了较为详细的描述,同时给出了本质矩阵、单应性矩阵的求解方法以及本质矩阵分解外参R,t 的具体公式。更加难能可贵的是,我们在博文最后提供了几个作业题并在Github开源了参考答案代码【我知道很多心理都在默念李博666】【当然肯定也有一些人在默念这太easy了李博能不能上点难度】。无论如何,博主觉得这是一件有意义的事情,只希望没有误人子弟。

而本篇的内容,则是立体视觉的绝对核心模块:相机标定。虽然它因为技术相对成熟,如今研究的人不多,也容易被人忽略,往往用一个开源算法库如Opencv或者Matlab标定工具箱就直接搞定,但实际在立体视觉工程化、产品化时,开源工具由于其精度不高、灵活度低而不建议直接使用,企业往往是自己开发相机标定算法。相机标定作为立体视觉的核心模块,掌握其理论是相当必要的,对我们深入理解立体视觉技术大有帮助,有开山辟路之效

所谓标定,即是由大量观测值拟合参数模型的过程,且在此拟合的参数模型是已知的,所以应尽可能探索能便捷获取大量观测值的方案,如果观测值之间还满足一些其他的几何约束就更有助于求解具体单个参数值。

今天所述的Zhang式标定法1即提供了一种便捷获取大量观测值的的方案,同时观测值之间还满足一类明显的几何约束(即平面约束),可直接求解出内外参。其操作方式非常简单,只需要拍摄带有标定板图案的平面,即可完成相机标定,使标定难度极大降低,如果不追求高精度,打印一张棋盘格标定板图案粘贴到近似平的硬纸板上即可完成标定,加快了立体视觉的入门和普及,影响深远,是相机标定领域绝对的经典。

本篇即带大家深入了解Zhang式相机标定法,掌握本篇对立体视觉的理论掌握及工程实战来说都是非常必要的。

实施方法

Zhang式标定法能够被广泛应用,其中一个重要原因是其实施方法十分简单,不需要专业的工艺制作即可完成。

第一步,设计一张具有明显角点特征,且已知每个角点二维坐标的图案作为标定图案,常见的图案有三种:

规则的图案设计可以方便的计算出角点在图案内的二维坐标,拿棋盘格来说,角点之间的间隔像素数是固定的,假设左上角角点的坐标为(0,0),则其他角点的像素坐标都可以通过格子的偏移量计算出来,而一张已知DPI的标定板图像,在打印后每个角点的二维空间坐标也是完全已知的(通过像素换算成空间尺寸)。

第二步,将标定板图案以某种方式置于一个平面上。比如最简单的方式是将标定图原尺寸打印出来,然后找一块近似平的平板,将打印后的标定图案粘贴至平板上;更专业高精度的方式是找专业厂家制作高精平板(如陶瓷板)并将标定图案以某种工艺刻印到平板上。这一步的目的是让标定图案的角点都位于一个平面上。

图片来源:Calibration Patterns Explained

如此,第一步所描述的二维坐标可以转换成第三维  坐标等于0的三维坐标(将世界坐标系的原点放在标定板的某个角点,Z轴垂直于标定板)。

第三步,移动相机到N(N>=3)个不同的位姿拍摄标定板图案。

第四步,对上一步拍摄的标定板图案进行角点提取,解算标定参数。

matlab软件标定示意图

以上便是相机标定的实施步骤,总结来说,在一个平面标定板上有一组已知空间坐标的角点,相机在多个不同位姿下拍摄角点图案并提取角点的像素坐标,即可完成相机内外参数的解算。这句总结蕴含2个重要的知识点:

1.标定图案中角点的空间坐标是已知的,且它们都位于一个平面上, Z坐标等于0

2.相机需要在多个不同的位姿拍摄角点图案并提取像素坐标

可以看到Zhang式标定法确实是易于实施的方法,其中蕴含的标定理论,是非常有价值的,对于立体视觉的初学者来说,掌握其理论很有必要,还请务必阅读本篇接下来的内容。

理论基础

定义

单应性矩阵

在实施方法中,我们一定能够关注到一个非常关键的信息:标定图案被置于一个平面上。它的目的是为了让标定图案中的角点都位于一个空间平面上,从而当相机拍摄角点成像后,空间平面和像平面之间存在一个单应性变换关系,即可通过一个单应性矩阵H将角点的空间坐标转换成图像坐标。

对内参的约束

由上式可知,单应性矩阵H和内参矩阵A的元素之间满足两个线性方程约束。如果能够计算出单应性矩阵,直观上感觉应该可通过解线性方程解出内参矩阵。具体是否可以呢?我们继续往下看。

相机参数求解

本小节将带大家了解相机参数的具体解法,回答上节遗留的问题,即是否能够通过公式(7)来求解相机参数。

本小节将分为3个部分,第一部分介绍直接由式(7)求解相机参数的闭合解公式;第二部分介绍相机参数的最大似然解法;第三部分介绍考虑相机畸变后的畸变参数解法。

闭合解

这是一个典型的线性方程组,系数矩阵的行数为2,求解6维向量 b 。由公式(4),当相机在1个位姿下拍摄标定板图案后,经过角点的像素坐标提取,可得所有角点的世界坐标系和像素坐标系的对应关系,进而通过线性方程组的最小二乘解法求解当前位姿下的单应性变换矩阵 H ,可得公式(11)的具体表达式。

但公式(11)的系数矩阵只有2行,要求解6维向量b是不够的。所以我们需要相机在n个位姿下拍摄标定图案,得到n个单应性矩阵,以及行数为2n的系数矩阵,当 n>=3 时,便可求解6维向量 b 。也就是说至少3张图片才能完成相机标定。最后得到的总方程组可表达为:

以上,内外参数全部解出,整个闭合解法完成。

备注:感谢微信公众号「3D视觉工坊」整理。

最大似然估计

闭合解法可得到代数距离最小的解,并没有考虑到各个参数实际的几何含义,由于噪声的存在,解并不会非常精确。我们可以通过最大似然估计法来获取更精确的解。

如果我们观测到标定板n张拍摄图像中的m个点对。假设所有点存在独立的等尺度的噪声,则最大似然估计即最小化如下表达式:

式(16)是一个非线性表达式,所以这是一个非线性最小化求解问题,可以用Levenberg-Marquardt算法来求解。想必部分同学知道求解该类问题需要一个相对准确的初始化值,这个值便可以使用前一节得到的闭合解来获取。

在工程实践中,我们通常用ceres-solver库来搞定这部分。

相机畸变

到目前为止,我们还没有考虑相机畸变,所有推导都是基于无畸变的理想情况,而实际情况是相机必然会有多多少少的畸变,主要包括两种:径向畸变和切向畸变。一般情况下,会考虑3项径向畸变 k1,k2,k3 和2项切向畸变p1,p2 。在Zhang式标定法中,只考虑了2项径向畸变 k1,k2 ,而实际应用时,我们会考虑更多项,原理相同,依次类推即可。

式(17)是一个线性方程组,求解k1,k2看上去是一件简单的事儿,但实际上却面临一个问题,即无法获取无畸变的理想坐标 (u,v),它需要已知准确的内外参通过投影公式(2)来求解,同学们可能会问:前两节不是解出了内外参数吗!?不要忘了,前面是没有考虑相机畸变的,内外参的求解实际是不精确的(把观测值当做无畸变坐标来求解的内外参,是有偏差的)。所以这成了一个鸡生蛋蛋生鸡的矛盾问题。

那就干脆不奢求通过线性方程求出精确畸变,将闭合解得到的内内外参代入公式(2)求出近似的理想坐标 (u,v),从而由公式(17)建立线性方程组求解近似的k1,k2 。

然后,我们建立新的最大似然估计表达式:

同样通过非线性求解方法来求解所有内外参数和畸变系数。而畸变系数的初值由上面所描述的方法来求解。

实际上,因为畸变系数是非常小值,所以直接将畸变系数的初值全部设置为0也是可以的,这就不需要解线性方程组了。

总结

下面对整个Zhang式标定的流程做一个总结:

1.打印标定图案并粘贴至一个平面上,称之为标定板。

2.通过移动相机或移动标定板在不同的位姿拍摄多张标定板图像(图像数>=3)。

3.在所有图像上检测特征点(角点或者圆心点)。

4.使用闭合解法求解所有内参数和外参数。

5.通过线性方程组求解近似的畸变系数(或者直接赋值为0)。

6.通过非线性优化计算精确的内外参数和畸变系数。

以上便是Zhang式标定法的所有理论讲解,希望同学们读完此篇能有醍醐灌顶之效,并能融会贯通,在实际工程应用中得心应手。

在Zhang式标定法的原文中,还有一些值得学习的高阶知识点并未在本篇中体现,包括关键公式(7)的几何解释,以及退化情况下的讨论,感兴趣的同学可以继续阅读原文来了解。

下一篇我们将带来相机标定的另一种方法:DLT直接线性变换法。

作业

这里为大家准备了一些练习题,可以通过实践加深理解:

1 通过opencv开源库提供的接口完成相机标定,可使用opencv提供的图像,也可使用自己的图像。
2 更高阶的是,你能够自己不依赖opencv库写一套相机标定算法吗?或者只使用opencv来检测角点坐标,其他步骤自己来实现。
参考答案地址:https://github.com/ethan-li-coding/StereoV3DCode

[代码持续更新,大家感兴趣可以star和watch,本篇代码暂缺]。

参考文献

- [1] Zhang Z . A Flexible New Technique for Camera Calibration[J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2000, 22(11):1330-1334.

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

3D视觉精品课程推荐:

1.面向自动驾驶领域的多传感器数据融合技术

2.面向自动驾驶领域的3D点云目标检测全栈学习路线!(单模态+多模态/数据+代码)
3.彻底搞透视觉三维重建:原理剖析、代码讲解、及优化改进
4.国内首个面向工业级实战的点云处理课程
5.激光-视觉-IMU-GPS融合SLAM算法梳理和代码讲解
6.彻底搞懂视觉-惯性SLAM:基于VINS-Fusion正式开课啦
7.彻底搞懂基于LOAM框架的3D激光SLAM: 源码剖析到算法优化
8.彻底剖析室内、室外激光SLAM关键算法原理、代码和实战(cartographer+LOAM +LIO-SAM)

9.从零搭建一套结构光3D重建系统[理论+源码+实践]

10.单目深度估计方法:算法梳理与代码实现

11.自动驾驶中的深度学习模型部署实战

12.相机模型与标定(单目+双目+鱼眼)

13.重磅!四旋翼飞行器:算法与实战

14.ROS2从入门到精通:理论与实战

重磅!3DCVer-学术论文写作投稿 交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。

一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。

▲长按加微信群或投稿

▲长按关注公众号

3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列、三维点云系列、结构光系列、手眼标定、相机标定、激光/视觉SLAM自动驾驶等)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近4000星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

圈里有高质量教程资料、答疑解惑、助你高效解决问题

觉得有用,麻烦给个赞和在看~  

立体视觉入门指南:相机标定之Zhang式标定法相关推荐

  1. 立体视觉入门指南(4):相机标定之DLT直接线性变换【建议收藏】

    亲爱的同学们,我们的世界是3D世界,我们的双眼能够观测三维信息,帮助我们感知距离,导航避障,从而翱翔于天地之间.而当今世界是智能化的世界,我们的科学家们探索各种机器智能技术,让机器能够拥有人类的三维感 ...

  2. 立体视觉入门指南(3):相机标定之张式标定法【超详细值得收藏】

    亲爱的同学们,我们的世界是3D世界,我们的双眼能够观测三维信息,帮助我们感知距离,导航避障,从而翱翔于天地之间.而当今世界是智能化的世界,我们的科学家们探索各种机器智能技术,让机器能够拥有人类的三维感 ...

  3. 立体视觉入门指南(5):双相机标定【再不收藏我收费了~】

    亲爱的同学们,我们的世界是3D世界,我们的双眼能够观测三维信息,帮助我们感知距离,导航避障,从而翱翔于天地之间.而当今世界是智能化的世界,我们的科学家们探索各种机器智能技术,让机器能够拥有人类的三维感 ...

  4. 立体视觉入门指南(1):坐标系与相机参数

    亲爱的同学们,我们的世界是3D世界,我们的双眼能够观测三维信息,帮助我们感知距离,导航避障,从而翱翔于天地之间.而当今世界是智能化的世界,我们的科学家们探索各种机器智能技术,让机器能够拥有人类的三维感 ...

  5. 立体视觉入门指南(6):对级约束与Fusiello法极线校正

    亲爱的同学们,我们的世界是3D世界,我们的双眼能够观测三维信息,帮助我们感知距离,导航避障,从而翱翔于天地之间.而当今世界是智能化的世界,我们的科学家们探索各种机器智能技术,让机器能够拥有人类的三维感 ...

  6. 立体视觉入门指南:对级约束与Fusiello法极线校正

    作者丨李迎松@知乎 来源丨https://zhuanlan.zhihu.com/p/466758105 编辑丨3D视觉工坊 亲爱的同学们,我们的世界是3D世界,我们的双眼能够观测三维信息,帮助我们感知 ...

  7. 张正友立体魔方_双目立体视觉中的相机标定与机器人位置标定

    在基于双目立体视觉的工业机器人抓取系统中涉及三个坐标系:世界坐标系(现实世界中的坐标位置).机器人坐标系(以机器人基座标 标识的坐标位置)和 相机坐标系(以双目相机中某相机光心位置为原点,光轴作为参考 ...

  8. 立体视觉入门指南(7):立体匹配

    关于立体匹配,我之前写了很多博客,重复去写就没有必要,学习的朋友请阅读如下链接. 本文我们随便聊聊立体匹配的方法论和弱纹理恢复问题. 文章目录 立体匹配系列 0 1 SGM系列 2 PatchMatc ...

  9. 相机标定和双目相机标定标定原理推导及效果展示

    文章目录 前言 一.相机标定 1.相机的四个坐标系 2.相机的畸变 二.张正友标定法 1.求解内参矩阵与外参矩阵的积 2.求解内参矩阵 3.求解外参矩阵 4.标定相机的畸变参数 5.双目标定 6.极线 ...

最新文章

  1. 各个数据库取前10行记录
  2. 欧几里德算法(自写理解)
  3. python 打开图像
  4. 通过反射给属性赋值代码示例
  5. P2601 [ZJOI2009]对称的正方形(二维哈希)(二分)
  6. ShellExecute 函数的用法和实例
  7. *【CodeForces - 280C】Game on Tree(期望模型,期望的线性性)
  8. SSRF服务器端请求伪造
  9. windows doc快捷键
  10. python虚拟环境配置文件_uwsgi 配置 python virtualenv 虚拟环境目录 ( ini 配置)
  11. java创建gitlab账户_GitLab不会创建新的存储库
  12. 从“流处理”到“流批一体”,Apache Flink 的19个企业最佳实践
  13. imp 只导表前10条数据_2020年玉石行情,从10条数据就能略窥一二
  14. LTE:资源调度(5)
  15. unity3D游戏素材素材哪家强?Top3都在这!
  16. java中,HashMap为什么每次扩容的倍数是2,而不是1.5或者2.5?
  17. Exp5 CAL_MSF基础运用 20154328 常城
  18. 蚂蚁安全键盘空白或应该显示安全键盘却显示的系统键盘的问题(iOS中时间佛历如何转换为公历)
  19. 计算机教程无线路由器桥接上网,两个无线路由器怎么桥接?如何桥接两个无线路由器...
  20. 2018版ISTQB FL基础级大纲全解析

热门文章

  1. 听说有人谋求稳定的工作?
  2. PB9核心之——数据窗口对象使用
  3. 小程序制作宋词欣赏海报
  4. 一文读懂 NMEA-0183 协议数据
  5. Springboot快递管理系统1k61h计算机毕业设计-课程设计-期末作业-毕设程序代做
  6. AngelSword(天使之剑)漏洞框架的使用
  7. [腾讯校招] 微信红包
  8. LLJ-300HS;LLJ-F(S)系列漏电继电器
  9. MySQL安装当中遇到的问题
  10. 基于cefsharp的浏览器应用开发(支持XP系统)