相机标定究竟在标定什么?

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达a8591346536c9c4e3e1031826885a569.png

相机标定可以说是计算机视觉/机器视觉的基础,但是初学者不易上手,本文将给读者整理一遍相机标定的逻辑,并在文末回答评论区提出的问题。分为以下内容:

  • 相机标定的目的和意义

  • 相机成像过程的简化与建模

  • 针孔相机模型的数学描述

  • 标定针孔相机模型的参数

相机标定的目的和意义

我们所处的世界是三维的,而照片是二维的,这样我们可以把相机认为是一个函数,输入量是一个场景,输出量是一幅灰度图。这个从三维到二维的过程的函数是不可逆的。44e5e8c122137e69c7e796be1596e9d2.png相机标定的目标是我们找一个合适的数学模型,求出这个模型的参数,这样我们能够近似这个三维到二维的过程,使这个三维到二维的过程的函数找到反函数。8b56251955a7b97d8e84b97cb239f494.png这个逼近的过程就是「相机标定」,我们用简单的数学模型来表达复杂的成像过程,并且求出成像的反过程。标定之后的相机,可以进行三维场景的重建,即深度的感知,这是计算机视觉的一大分支。

相机成像过程的简化与建模

提到相机的成像,从根本上来说,就是在讨论相机的镜头。固定结构的相机镜头决定了一对固定的物像共轭关系,所谓「共轭」,意思是镜头前某个位置的物,它的像一定在镜头后的某个位置,这个关系是固定的。举个最简单的例子,无穷远处的物必然会在镜头的焦点处成像。这里说的固定结构,指的是镜头的焦距固定,光圈固定。4d3d2df0234680a2d4bfd2c650853c47.png上图是Canon EF 85mm/F1.2L II USM,我们可以找一个与这个镜头具有相同的物像共轭关系的凸透镜来等效这个镜头,我们把这个凸透镜称作等效透镜,用朝外的双箭头表示,如下图。093d11f347a97bee2978b2a0461a9afc.png这里说的等效,只是针对物像共轭关系的等效,也就是光路的等效,镜头中之所以用了形态各异的透镜主要是为了消除各种各样的像差,提高清晰度。换句话说,等效透镜的目的绝不是为了在实际应用中取代镜头(毕竟一个镜头都好贵),只是为了帮助我们理解。这样我们就可以画出相机拍摄到清晰的蜡烛燃烧场景的草图,如下图。32a4c2f220ae704c113db84da6c7412d.png其中, a2b408a13afc6b774b802b70e5344774.png是火苗尖的物点, 88f4e290b7299f7abc07984b31bbbd0f.png是火苗尖的像点 , 134b3d6af3c9ea61e1b8d50f722285c0.png是蜡烛根的物点,dbee1fac57da140087491bc1b6c6f756.png是蜡烛根的像点,  721347db0dc6bb3beb1d74b931c44478.png是等效透镜的中心(也称为光心),红色虚线表达了物点  0f443fd8f5bd407104ee996308138b90.png到 像点890ad29310d4e6319804aca93f0a665a.png成像光路中的两条,绿色虚线表达了物点 9da577b48109cfc3678b05e88c9255f9.png到像点 bb07039cd06f834eaaeec975d9f788bb.png成像光路中的两条,红色是CCD面。注意,刚刚说到我们画的是「相机拍摄到清晰的蜡烛燃烧场景的草图」,这表明像点 dfaf22c7925b61166b90c8ca99b889be.png和像点 11f2e93af73e8ef6206da01a97affdd2.png刚好落在CCD面上,那么假如像点没有落在CCD面上,也就是CCD拍摄的图像不清晰,我们如何确定像点的位置?9520ae690e9767d7d2b4ebc45b3948ef.png根据几何光学的作图法,由过等效透镜的焦点 ff72a39d3571352e95c18a07a1ea8481.png的光线和过光心 77bc596cb2c9979e668bb3dd4fa994e9.png的光线,我们可以作出像点 7c33b9ac591e402431cb9968076dc76c.pngdebe47f1f8acf657fbbe511e88ddaf5d.png的位置,现在我们对「相机拍摄到清晰的蜡烛燃烧场景的草图」同样用作图法,只考虑 0f9b916739c4d62897169c20b88507d4.png5638a8db31797b97ab39b9d1d8514243.png点的物像关系。91d39b67af33a0a73544455ed6158f96.png这样我们就能够得到成像光路中的4条:①是过透镜上边沿的光路,④是过透镜下边沿的光路,②是过等效透镜焦点的光路,③是过光心的光路。它们都表达了物点 f39fa159e677ac8ae1c5c6c39f937269.png与像点 7a0dd94ceef45afc99345ec545ad486b.png的物像共轭关系,显然③过光心的光路是最容易建立物像共轭关系数学模型,因此我们用③来代表成像光路,对相机成像过程进行简化。6192753aa89d4e3cd7624dc14a8fbb8c.png到这里我们发现,简化后的相机模型和针孔相机的成像原理很相似,因此我们把简化后的相机模型称为针孔相机模型。上图中的 3c96b79c4d529a085f81b2e004a7f1a9.png是针孔相机模型的焦距,但请注意,此针孔相机「焦距」非彼等效透镜「焦距」,只是借用了「焦距」汇聚光线的概念,表达的是CCD面到光心的距离。210ff81c500f6c19f834e94b17abeae5.png但是我们说的是简化后的相机模型和针孔相机的成像原理仅仅是相似,绝不能等同,由于针孔相机的原理是光沿直线传播,所以真实的针孔相机是没有「焦距」的概念的,也不存在像差,其物像关系不具有一一对应性,如下图。3a8da3ffc46401a4e7387c3d0525ef3a.png所以准确的讲把相机的成像过程简化成针孔相机模型,只是借用了针孔相机中简单的数学关系来表达一些本来难以表达的数学关系,使得数学上大大降低了复杂性,但是这个简化的代价同样很大,它本身不考虑像差(虽然针孔相机模型补充了消畸变模型)、不考虑景深(针孔相机模型物像关系不具有一一对应性,认为凡是物总能成清晰像),并且假定等效透镜是薄透镜。所以说针孔相机模型仅仅是一种真实相机的成像过程的近似,甚至于我们可以说这是一种非常粗糙的近似,这使得这个模型对越符合针孔相机模型的真实相机近似程度越高,如网络摄像头、手机镜头、监控探头等等。

针孔相机模型的描述

我们对相机成像过程进行简化和建模得到了针孔相机模型,如下图示。433497da5a1429861781e4e75b2b1814.png

首先建立相机坐标系,我们以光心 9498bf07918ecb070021d81f8fc3750a.png为坐标系的原点, 72c254117db0d4508ce72051fa5e648e.pngb15ed3fbe2d703d391846a7da2206833.png方向是CCD像素排列的水平和竖直两个方向, 1707ce346c0567f5ff35c3dc46a40249.png方向垂直与CCD面,建立右手坐标系,这是一个三维坐标系。其次,我们还需要建立CCD标号坐标系:以CCD左上角像素标号为原点,CCD像素排列的水平和竖直两个方向为 2bb90b99ee5278dc00e92e8eb0e7d766.pngbfb0d5603b36c805fe4a76a7c560605b.png方向,这是一个二维坐标系。为了方便描述,我们之后将把针孔相机模型对称翻转过来,如下图所示,从数学的角度,它们是等价的。3921d8eaa9011b68f37a6a19b0150f64.png

  • 由光心 acf8db356cb9708ac093bdf7a786c473.png着光轴出发,像平面在 2a61573c4e2905d7b279b9dc2e89496c.png上, 4c0632280b8561dedc8b2e968bfd2aec.png是相机的物理焦距(单位:9c7ce9adcda5701572a658a9f40e06e4.png)。

  • 677d6b6623a1d4f8054fe0d8f59ff32d.png在空间中,在相机坐标系下的位置是5debb7cfbd9e8f18332562d63ada6b2d.png

  • b804be58728a462205197fbf8ee4183a.png在像平面上,有两个等价的位置描述:1. 在相机坐标系下的位置是 5ae1236f33427c00d3a683a88f03f460.png;2. 在CCD标号坐标系下的位置是 c75bf8d2627c60d3d1f679b9040cd344.png

  • 在无镜头畸变的条件下,光心 8035fa98c2b7469e515490012512f6b6.png、点 899125365e5955ce45b730c93b717732.png与点 86b46bf4a8747aaf0a7993c9630e8fab.png在一条直线上。

  • 470fc4d8fad8b38236360a1570e8a3fe.png076159d2a3e72ff5c7580aa6c6419770.png是CCD单个像素在水平和竖直两个方向上的尺寸(单位:6a94a74ef3a614bacc6aafd5078b470e.png/像素),因此定义焦距为 2bb976fbca172645f7d6ecd47fd98e89.png(单位:像素)。

  • CCD标号坐标系原点到光轴的偏移量为 241fa60a2b71e2daccd391de4ebbffe1.png(单位:像素)。根据相似三角形关系,可以得出:b5f0ecb5170caa9b56e0259a57e098f0.png(1) 二维CCD标号坐标 25982d2ab26e30916ee86f6736591891.png二维CCD像素坐标 39cf9d09ea882604fbf662a27ef939d5.png建立CCD像面上的点标号坐标与物理坐标之间关联,由于像平面在 16706082029cabcb4f9b2c06cc01c04f.png上,可省略。cc9178fa3e9fcd08b232747b5c09ac4d.png(2) 像点的二维像素坐标 e75100bda0d1406f68f9f793d6f566df.png物点的三维空间中的坐标 09aa19c4b27fd4e7d2f5129f7d93c11e.png建立CCD像面上像点物理坐标与对应的三维空间中物点坐标之间关联。6a96849861ce6d704e78ffee9f57a17d.png(3) 像点的二维CCD标号坐标 b191fab8318b1ec2cdb9a9686053b661.png物点的三维空间中的坐标 3e22c914101fe375a24e448eb90e3bd8.png连接(1)和(2)的两个关联,也是实际进行标定得到参数 94b2f9afb62ef312c1aa258e4e9e649f.pnge0b686dd5b93754206cc907c0cf06ad6.png由以上三个关联可以得到:像点标号 e14bff1427eae7e39ca8aeb76db131dd.png像点坐标 9e3e6a6b93ba0fd413337e50faf7973f.png物点坐标 bcd0aab559df6f0f230ad668a5454a97.png。在OpenCV及Matlab标定工具箱直接使用了(3)关联,不需要知道CCD单个像素的尺寸,因此在标定过程是得不到物理焦距 e0c14859597749bf0ee594816ef20333.png的,只能得到像素焦距 f70d44e0d289439ede30984745820173.png8d913b257077ef1a2cfcc6e75ffe50a6.png

  • 很容易发现,(3)关联是不约束 03a60ad0d99ed5b562ca741a65845521.png的,也就是说,针孔相机模型本身是欠定的,通过被点亮的CCD像素 922e2e1016b62c7d06c520043d50017b.png我们只能知道物点 98d1611b7579053b60a4a74a5ff0f017.png在射线 993f28afadb32bf94aa9797a6b9bd7cc.png上,但无法确定具体的点,所以我们讲,针孔相机模型是一个射线方程模型, ced59434068426c4ea520092f31e9074.png点的射线方程:8fe9b0ace98452106014021dabcc27e7.png以上的关系是在无镜头畸变的条件下建立的,但是实际上存在镜头畸变,可以理解成像点和物点之间的光线是弯曲的,要得到射线模型,要进行消除畸变。e0575738ad389c9e9d00c7676e9de482.png(4) 补充消畸变模型以像面中心像素坐标 6ee64c62af108dd6e4787e853ab70ee0.png为中心,像面上的点到中心的距离为5eddb44e056e3a4437959bf58f1f20d0.png

  • 合成畸变 154e02de8f434289c119611d48c0e256.png其中:

  • 径向畸变f3886e6864b8ff84f6842aac723b74d0.png

  • 切向畸变 c99a24005544c739b0ba40f8c5148518.png把消畸变模型补充进针孔相机模型,因此「像点标号 48df22fa9f742b32832cfa09d1d84350.png像点坐标 1c97f72e6550ef5f5e9b55fe0d9eb793.png物点坐标 0329ce21745bde94021a24dbe138b1b4.png」被修正为:像点标号 c7095bcb9e38e47e38c8f9ea79c9ff5a.png像点坐标 7e74a5902716d222c2f5bb3d0989fc82.png物点坐标 302d5039098fd9f268f58280e2fc31dd.png消畸变后的射线方程 e8141bf97bd49e1b6d4cce276a1d09ae.png是:596debe0a25ee79c45fbfe2740a020ac.png

标定针孔相机模型的参数

针孔相机模型中,只要确定这9个参数就可以唯一的确定针孔相机模型, 0ed02a9d35b5f55e579c9680070dee7a.png,这个过程就称为「相机标定」,其中前4个我们称为内参数,后5个称为畸变参数,畸变参数是为了补充内参的。所以一旦相机结构固定,包括镜头结构固定,对焦距离固定,我们就可以用这9个的参数去近似这个相机。这里说的「镜头结构固定」,按我个人的理解,除了焦距固定之外,也应当包含光圈固定,因为改变光圈的大小,除了景深之外,是有可能改变针孔相机模型中的光心位置,但是影响并不是很大。这意味着标定好的相机如果改变光圈大小,会使得标定误差变大但应该不会大到难以接受的地步。对于针孔相机本身需要拟合的方程如下:08345f36cd37360a110557a2d551af4d.png其中 c3bed4bd05ba0a82dfd8e016404079df.png代表了畸变图像和消畸变图像之间的变换。因此,我们现在的任务就是找出一大堆具有对应关系的像点 3725bff73caa9dade41d474922589da8.png和物点 ac1e589b4566867a675a21af280b8bfe.png的点对作为样本,来训练出模型的9个参数 bd933b76052d9a193f367dbb13c71db1.png。那么这里就引发了两个问题:(1) 这么多像点和物点到底谁和谁是一对儿?(2) 即便我知道物点在哪里,可是我怎么样用相机坐标系来表达物点的位置 2edef8af45c0927a5e2ac7f96df224c5.png?为了解决上述的两个问题,标定板应运而生。标定板的第一大作用,确定物点和像点的对应性。这里用到的原理主要是「透视不变性」,打个比方,你近看一个人和远看一个人,虽然他的鼻子大小变了,你看鼻子的视角也变了,但是拓扑结构肯定是不变的,你也不可能把鼻子看成是嘴巴。f1787bfa8ccd055bf941028400ad84a3.png所以在标定板中,印刷了拓扑结构,广泛应用的是棋盘格和圆点格,这两种之所以成为主流,不仅是因为它们的拓扑结构明确且均匀,更重要的是检测其拓扑结构的算法简单且有效。棋盘格检测的是角点,只要对拍摄到的棋盘格图像横纵两个方向计算梯度就可获得;而圆点格的检测只需要对拍摄到的圆点格图样计算质心即可。假如你开发了一套非常完美的检测人脸全部特征的算法,你完全可以用你的照片当作标定板。按照我的经验,圆点格的效果应该是好于棋盘格,因为圆点质心的「透视不变性」要比棋盘格的角点稳定的多。下图是同样尺寸、同样比例棋盘格和圆点在最大重投影误差处的误差对比,红色十字是提取的角点/质心,绿色圆圈是针孔相机模型计算出来认为的角点/质心位置。69205909f9263100020ba5747845fcf3.png下图是棋盘格与圆点格的重投影误差图,显然圆点格的重投影误差的误差空间要小。7c554c137d8dfa40fb423f6d4292640b.png但是圆点格的检测似乎是Halcon的专利(存疑),因此OpenCV和Matlab标定工具箱用的是棋盘格,要用圆点格得要自己写算法。下文中提到的标定板说的都是棋盘格。标定板的第二大作用是把标定板中的角点变换到相机坐标系下的坐标 0cb2b6fb34c73a19a15f5c2a703142ad.png。对于标定的初学者来说,很容易忽略的一点是标定板是具有标定板坐标系的。换句话说,标定板中的每个角点,在标定板坐标系下的位置是确定并且是已知的。1737a4851e84eff77c83635b3724e0dc.png

而标定板坐标系变换到相机坐标系的变换矩阵,我们称它的元素为外参数,所以在我眼中,相机标定的外参根本就是标定内参的副产品,它会随着标定板的摆放不同而不同,由标定板坐标系变换到相机坐标系的变换矩阵可以由下式表达:3c7dcb337b674bd0ee4555b1b3c7f223.png其中, 11fe6f0248d890f7f5ac131059cc14ba.png称为旋转矩阵, 5e90d10abbaf2e4fc51dd397caf72d6e.png称为平移矩阵,下表 df1841e3cae9e140ae6f458781395c17.png代表board to camera。注意这个坐标系的变换是一个线形变换,反应到物理上讲,这意味者标定板必须尽可能的平,如果标定板不平,这个变换就不是线形的了。我们把这个变换带到原本要拟合的方程中去:d5aa68ff0eb24e69422939c827ad11df.png如此一来,我们就把能够把CCD上拍摄的到角点的像素标号 b9279b34e6c047a8b3503e8d79f01eac.png和每一个角点已知的在标定板坐标系下的坐标 527a84a7f1df516a504bd0befc78b524.png对应起来,通过各种各样的姿态作为样本,训练出全部参数 205117df8e8d9854dff49e8db1a295ea.png350bdba1b3579e0e271e361ca58a4d09.png

至于参数训练的方法,最小二乘,极大似然估计等等,很容易找到相关的资料,在此不再赘述。如果用OpenCV或Matlab标定工具箱进行标定,需要给出棋盘格的物理尺寸,这其实就是在建立标定板坐标系,从测量的角度讲,标定板的精度是相机标定精度的基准,是误差传递链上的第一个环节。所以为了使针孔相机模型更逼近真实相机,对标定板的质量有以下要求(按重要性顺序):

  1. 标定板的平面度高,棋盘格是直角;

  2. 标定板每个格子尺寸的高一致性;

  3. 真实尺寸与标称尺寸的差异小。

    向祖师爷张正友致敬。

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

f8917d567f4df569c89ab92d096aade4.png

491487835c95b500ea6635af74717274.png

  • 4
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值