python计算机视觉编程——张正友的相机平面标定

本文详细介绍了张正友博士提出的相机标定方法,包括相机标定的目的、畸变类型、原理和步骤。通过使用平面棋盘格进行标定,可以矫正透镜畸变并建立相机成像几何模型。文章还分享了在matlab环境下的标定测试,以及Python代码实现的实验结果。


此次实验的内容主要有关于张正友博士的平面标定法的测试。

一、关于张氏标定法

1.1简介

「张氏标定法」 是张正友博士在1999年发表在国际顶级会议ICCV上的论文《Flexible Camera Calibration By Viewing a Plane From Unknown Orientations》中,提出的一种利用平面棋盘格进行相机标定的实用方法。该方法介于摄影标定法和自标定法之间,既克服了摄影标定法需要的高精度三维标定物的缺点,又解决了自标定法鲁棒性差的难题。标定过程仅需使用一个打印出来的棋盘格,并从不同方向拍摄几组图片即可,任何人都可以自己制作标定图案,不仅实用灵活方便,而且精度很高,鲁棒性好。 因此很快被全世界广泛采用,极大的促进了三维计算机视觉从实验室走向真实世界的进程。

1.2为什么要进行相机标定

相机标定的目的是:建立相机成像几何模型并矫正透镜畸变。这句话有点拗口,下面分别对其中两个关键部分进行解释。

建立相机成像几何模型:计算机视觉的首要任务就是要通过拍摄到的图像信息获取到物体在真实三维世界里相对应的信息,于是,建立物体从三维世界映射到相机成像平面这一过程中的几何模型就显得尤为重要,而这一过程最关键的部分就是要得到相机的内部参数和外部参数。
在这里插入图片描述
矫正透镜畸变:我们最开始接触到的成像方面的知识应该是有关 小孔成像 的,但是由于这种成像方式只有小孔部分能透过光线就会导致物体的成像亮度很低,于是聪明的人类发明了透镜。虽然亮度问题解决了,但是新的问题又来了:由于透镜的制造工艺,会使成像产生多种形式的畸变,于是为了去除畸变(使成像后的图像与真实世界的景象保持一致),人们计算并利用畸变系数来矫正这种像差。虽然理论上可以设计出不产生畸变的透镜,但其制造工艺相对于球面透镜会复杂很多,所以相对于复杂且高成本的制造工艺,人们更喜欢用数学来解决问题。

1.2.1关于畸变

1 图像径向畸变 :

  • 透镜质量原因
  • 光线在远离透镜中心的地方比靠近中心的地方更加弯曲

2 桶状畸变:

3枕形畸变
在这里插入图片描述
在这里插入图片描述

1.3 相机标定的原理

相机标定的目的之一是为了建立物体从三维世界到成像平面上各坐标点的对应关系,所以首先我们需要定义这样几个坐标系来为整个过程做好铺垫:

世界坐标系(world coordinate system):用户定义的三维世界的坐标系,为了描述目标物在真实世界里的位置而被引入。单位为m。

相机坐标系(camera coordinate system):在相机上建立的坐标系,为了从相机的角度描述物体位置而定义,作为沟通世界坐标系和图像/像素坐标系的中间一环。单位为m。

图像坐标系(image coordinate system):为了描述成像过程中物体从相机坐标系到图像坐标系的投影透射关系而引入,方便进一步得到像素坐标系下的坐标。 单位为m。

像素坐标系(pixel coordinate system):为了描述物体成像后的像点在数字图像上(相片)的坐标而引入,是我们真正从相机内读取到的信息所在的坐标系。单位为个(像素数目)。

一下子定义出来四个坐标系可能有点晕,下图可以更清晰地表达这四个坐标系之间的关系:

世界坐标系:Xw、Yw、Zw。相机坐标系: Xc、Yc、Zc。图像坐标系:x、y。像素坐标系:u、v。

其中,相机坐标系的轴与光轴重合,且垂直于图像坐标系平面并通过图像坐标系的原点,相机坐标系与图像坐标系之间的距离为焦距f(也即图像坐标系原点与焦点重合)。像素坐标系平面u-v和图像坐标系平面x-y重合,但像素坐标系原点位于图中左上角(之所以这么定义,目的是从存储信息的首地址开始读写)。
在这里我们先引入「棋盘」的概念:

棋盘是一块由黑白方块间隔组成的标定板,我们用它来作为相机标定的标定物(从真实世界映射到数字图像内的对象)。之所以我们用棋盘作为标定物是因为平面棋盘模式更容易处理(相对于复杂的三维物体),但与此同时,二维物体相对于三维物体会缺少一部分信息,于是我们会多次改变棋盘的方位来捕捉图像,以求获得更丰富的坐标信息。如下图所示,是相机在不同方向下拍摄的同一个棋盘图像。
在这里插入图片描述

1.4如何进行相机标定

相机标定的数学原理可以参考下面这篇博文理解。
https://www.cnblogs.com/Jessica-jie/p/6596450.html
所以,通过数学原理,我们进行相机标定需要同步标定内部参数和外部参数,一般包括两种策略:

  1. 光学标定: 利用已知的几何信息(如定长棋盘格)实现参数求解。
  2. 自标定: 在静态场景中利用 structure from motion估算参数。

可以通过线性回归(最小二乘法)或者非线性优化。
如下我们标定参数线性回归:
在这里插入图片描述
通过空间中已知坐标的(特征)点 (Xi,Yi,Zi),以及它 们在图像中的对应坐标 (ui,vi),直接估算 11 个待求解的内部和外部参数。
标定参数线性回归的优缺点:

优点:

  • 所有的相机参数集中在一个矩阵中,便于求解
  • 通过矩阵可以直接描述世界坐标中的三维点,到二维 图像平面中点的映射关系。

缺点:

  • 无法直接得知具体的内参数和外参数
  • 求解出的11个未知量,比待标定参数(9个)更多。
  • 带来了参数不独立/相关的问题
  • 对噪声/误差敏感

二、实验测试

实验设备:华为p10
实验对象:
在这里插入图片描述
这个由word生成的棋盘格。
实验目的是求解参数。

2.1实验步骤

1.制作棋盘格(每个格子的大小可测量)
2.根据棋盘格,采集10-20张图片,提取角点
3.解算出内外参数

2.2matlab环境下的测试

matlab作为一个集成化程度相当高的软件,其内置功能非常强大,这里我使用其中的Camera+Calibration 这个功能来做相机标定,它的可视化程度十分完善。
参考blog:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值