标定

标定是联系世界坐标与像素坐标的环节,目的是求出相机和投影仪的内外参数,对于3D成像来说至关重要

张正友标定法

通过各种方法的对比,为了方便,我们采用的是张正友标定。我们主要对张正友标定法的原理进行介绍,文章后面后面也会给大家介绍一个张正友标定的matlab包,它以及具体使用的视频。张正友标定是基于2D平面靶标的相机标定,实验中对平面棋盘格进行多角度拍摄后,将所得图片输入计算即可实现相机标定,具有较强的实验可行性。

张正友标定原理介绍

要想进一步了解张正友标定法,首先需学习一个最基本的思想——非线性最小二乘法思想,其次是了解张正友标定法的主体思想。接下来我将分两部分进行介绍。(由于篇幅过长,所以最小二乘法思想在另一篇文章中)

张正友标定法的主题思想

前面我们理解了非线性最小二乘法的思想,这种思想实际上就是一个求解最合适的x的过程。

张正友标定法是一种基于2D平面靶标的摄影机标定,我们通过拍摄多张标定板的图片,再通过多个实际中的点(世界坐标)和图片上的点(像素坐标)的一一对应,即可求出世界坐标和像素坐标的对应关系。

关于什么是世界坐标和像素坐标,还有其中转化时涉及到的相机坐标,图像坐标,大家可以寻找其他资料进行了解(可以搜针孔相机模型),这里我直接用结论。在世界坐标和像素坐标的转化中,将关系矩阵分成两个部分,一个是内参矩阵,另一个是外参矩阵。

内参矩阵是由相机内部的参数决定的,定义为

张正友标定法手眼标定代码python 张正友标定方法_世界坐标

张正友标定法手眼标定代码python 张正友标定方法_相机标定_02张正友标定法手眼标定代码python 张正友标定方法_世界坐标_03是u轴和v轴的尺度因子(与摄像机的焦距有关),张正友标定法手眼标定代码python 张正友标定方法_相机标定_04是u轴和v轴的不垂直因子,

张正友标定法手眼标定代码python 张正友标定方法_matlab_05

 为主点坐标(是光轴与成像平面的交点);外参矩阵是由摄像机与被测物所处的相对位置决定(相机坐标经过旋转平移后于世界坐标重合,这个旋转平移的矩阵就是外参矩阵)。定义为:

张正友标定法手眼标定代码python 张正友标定方法_张正友标定法手眼标定代码python_06


张正友标定法手眼标定代码python 张正友标定方法_相机标定_07

是相机坐标的三个坐标轴在世界坐标轴中的方向矢量,

张正友标定法手眼标定代码python 张正友标定方法_开发语言_08

互相垂直,张正友标定法手眼标定代码python 张正友标定方法_相机标定_09是从世界坐标的原点到光心的平移矢量。为了让大家更清楚了解张正友标定法,我先从大家熟悉的对应点的关系去给大家讲解。靶标平面上的点和图像平面上的点具有一一对应关系。记靶标平面上的点为

张正友标定法手眼标定代码python 张正友标定方法_世界坐标_10

图像平面上的点为

张正友标定法手眼标定代码python 张正友标定方法_张正友标定法手眼标定代码python_11

相应的齐次坐标为

张正友标定法手眼标定代码python 张正友标定方法_开发语言_12

张正友标定法手眼标定代码python 张正友标定方法_世界坐标_13

通过坐标变换我们可以得到

张正友标定法手眼标定代码python 张正友标定方法_相机标定_14

, s是个常数。这里我们假设靶标平面位于世界坐标系的xy平面上,即z=0。所以有

张正友标定法手眼标定代码python 张正友标定方法_相机标定_15

。之后仍然采用M表示靶标平面上点的坐标,但此时

张正友标定法手眼标定代码python 张正友标定方法_matlab_16


张正友标定法手眼标定代码python 张正友标定方法_张正友标定法手眼标定代码python_17

,这样就能有一一对应关系

张正友标定法手眼标定代码python 张正友标定方法_matlab_18

张正友标定法手眼标定代码python 张正友标定方法_张正友标定法手眼标定代码python_19

。接下来就是求解了。我们拍的每一种照片上有多组对应点通过这多组对应点,应用最小二乘法我们可以求出H,H的计算是使实际图像坐标张正友标定法手眼标定代码python 张正友标定方法_开发语言_20与通过M求出张正友标定法手眼标定代码python 张正友标定方法_张正友标定法手眼标定代码python_21之间参差最小的过程,目标函数为

张正友标定法手眼标定代码python 张正友标定方法_matlab_22


H求解出来后,我们就可以求解摄像机的参数矩阵了。

利用式

张正友标定法手眼标定代码python 张正友标定方法_张正友标定法手眼标定代码python_23

,和R的正交性

张正友标定法手眼标定代码python 张正友标定方法_张正友标定法手眼标定代码python_24

, 

张正友标定法手眼标定代码python 张正友标定方法_相机标定_25

,可以得到

张正友标定法手眼标定代码python 张正友标定方法_matlab_26

……①

式①是关于摄像机内参数的两个基本约束,一个转换矩阵H可以得到关于摄像机内参的两个约束,所以要求出A,需求多个转换矩阵(每张图片可以求出一个转换矩阵,所以需要拍摄多张图片)。

为了方便求解,这里设:

张正友标定法手眼标定代码python 张正友标定方法_相机标定_27

我们注意到B是一个对称矩阵,可以表示为六维向量

张正友标定法手眼标定代码python 张正友标定方法_开发语言_28

H中的第i列向量为

张正友标定法手眼标定代码python 张正友标定方法_世界坐标_29

,可以推出

张正友标定法手眼标定代码python 张正友标定方法_开发语言_30

其中

张正友标定法手眼标定代码python 张正友标定方法_matlab_31

这样就可以将①式化为

张正友标定法手眼标定代码python 张正友标定方法_张正友标定法手眼标定代码python_32

如果对靶标平面拍n幅图像,将n个这样的方程叠加起来就可以得到:

张正友标定法手眼标定代码python 张正友标定方法_张正友标定法手眼标定代码python_33

……②

其中V为2n×6的矩阵。

如果n张正友标定法手眼标定代码python 张正友标定方法_matlab_343,一般的,b可以在相差一个尺度因子λ的定义下唯一确定;如果n=2,可以加上一个附加约束条件r=0,即

张正友标定法手眼标定代码python 张正友标定方法_相机标定_35

即可以用

张正友标定法手眼标定代码python 张正友标定方法_张正友标定法手眼标定代码python_36

作为附加方程。通过对②的求解可解出b。而解可以通过求解矩阵

张正友标定法手眼标定代码python 张正友标定方法_相机标定_37

的最小特征值对应的特征向量,或者对矩阵V进行奇异分解得出。B求出后,就可以利用Cholesky矩阵分解算法求出

张正友标定法手眼标定代码python 张正友标定方法_开发语言_38

再通过逆得到A。一旦A确定后,每幅图像的外参就容易求出了,通过

张正友标定法手眼标定代码python 张正友标定方法_世界坐标_39

可以推出:


张正友标定法手眼标定代码python 张正友标定方法_开发语言_40

张正友标定法手眼标定代码python 张正友标定方法_张正友标定法手眼标定代码python_41

 ;  

张正友标定法手眼标定代码python 张正友标定方法_开发语言_42

张正友标定法手眼标定代码python 张正友标定方法_相机标定_43

 ,

其中:

张正友标定法手眼标定代码python 张正友标定方法_matlab_44

由此就可以求出相机的内参和外参,由于通常情况下,相机镜头是由畸变的,我们也可以将这组参数作为初始值,然后进行优化搜索(最小二乘思想),进而求出所有参数的准确值。

归纳一些张正友标定法的主体思想:

  1. 通过每张照片上的点的对应关系求出转换矩阵H(其中用到了最小二乘法思想减小误差)。          
  2. 通过多张图片求出的多个H,来进一步求内参矩阵A,然后就进一步可求出外参矩阵,最后再通过最小二乘法思想对畸变进行评估,进而求出更加精确的值。

张正友标定算法压缩包与视频讲解

通过了解张正友标定法的原理,在使用压缩包时也能更加容易知道问题出现在哪里(如果出现问题),但实际中其实你只要会用安装包以及标定后得出的数据就行了。由于安装包、讲解视频、数据使用都是由前辈先给出的(挺多的,这是我给出我认为比较靠谱的),这里将给出他们的链接