相机标定
- 1. 相机标定
- 1.1相机内外参数(重点)
- 1.2 为什么要做相机标定
- 2. 相机标定的意义
- 3. 相机成像模型
- 3.1 像素坐标系
- 3.2 图像坐标系
- 3.3 相机坐标系
- 3.4 世界坐标系
- 4.坐标系转换
- 4.1 世界坐标到相机坐标
- 4.2 相机坐标到图像坐标
- 4.3 像素坐标到世界坐标的变换关系
- 5. 图像畸变及畸变矫正
- 5.1 径向畸变(重点)
- 5.2 切向畸变
- 6. 张正友标定法
- 7. 实验过程及小结
- 7.1 实验步骤
- 7.2 实验准备
- 7.3 实验过程
- 7.3.1 Matlab工具箱
- 7.3.2 python代码运行
- 7.4 实验小结
- 8 实验中遇到的问题
1. 相机标定
在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何关系位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数(内参,外参,畸变参数)的过程就称之为相机标定。
一般来说,标定的过程分为两个部分:
- 第一步:从世界坐标系转换为相机坐标系,这一步是三维点到三维点的转换,包括 R,t (相机外参)等参数;
- 第二步:从相机坐标系转为图像坐标系,这一步是三维点到二维点的转换,包括 K(相机内参)等参数;
1.1相机内外参数(重点)
- 什么是相机内参:相机内部参数,内参是相机固有的属性,实际上就是焦距,像元尺寸
- 什么是相机外参:相机外部参数,外参就是相机相对于世界坐标系的旋转和平移变换关系
1.2 为什么要做相机标定
- 那为什么要做相机标定呢?
每个镜头的畸变程度各不相同,通过相机标定可以校正这种镜头畸变。可以认为用这种标定的方式来求解相机内参和畸变参数,相当于一种相机校准,然后这些参数就可以用于后面的求解。例如求解新拍的两幅图片相对的 R 和 t,求解这个外参用到就是标定得到的相机内参和畸变参数。
2. 相机标定的意义
- 在机器视觉领域,相机的标定是一个关键的环节,它决定了机器视觉系统能否有效的定位,能否有效的计算目标物。
- 相机的标定基本上可以分为两种:
第一种是相机的自标定;是相机拍摄周围物体,通过数字图像处理的方法和相关的几何计算得到相机参数,但是这种方法标定的结果误差较大,不适合于高精度应用场合。
第二种是依赖于标定参照物的标定方法。是通过标定参照物,由相机成像,并通过数字图像处理的方法,以及后期的空间算术运算计算相机的内参和外参。这种方法标定的精度高,适用于对精度要求高的应用场合。
3. 相机成像模型
- 相机成像过程中首先涉及坐标系的变换,包含世界坐标系( X w , Y w , Z w X_w,Y_w,Z_w Xw,Yw,Zw),相机坐标系( X e , Y e , Z e X_e,Y_e,Z_e Xe,Ye,Ze),像平面坐标系(x,y)和像素坐标系( u t , v t u_t,v_t ut,vt)。
3.1 像素坐标系
-
像素坐标就是像素在图像中的位置。
一般像素坐标系的左上角的顶点就是远点,水平向右是u,垂直向下是v轴。
下图1.1中任意一个像素点的坐标可以表示为( u t , v t u_t,v_t ut,vt)
-
在像素坐标系中,每个像素的坐标是用像素来表示的,然而,像素的表示方法却不能反应图像中物体的物力尺寸,因此,有必要将像素坐标转换为图像坐标。
3.2 图像坐标系
- 将像素坐标系的原点平移到图像的中心,就定为图像坐标系的原点,图像坐标系的x轴与像素坐标系的u轴平行,方向相同,而图像坐标系的y轴与像素坐标系的v轴平行,方向相同。
- - 在图中,假设图像中心的像素坐标是( u 0 , v t u_0,v_t u0,vt)
相机中感光器件每个像素的物力尺寸是 d x , d y d_x,d_y dx,dy
那么,图像坐标系的坐标(x,y)与像素坐标系的坐标(u,v)之间的关系可以表示为:
{ x = u d x − u 0 d y y = v d y − v 0 d y \begin{cases} x=udx-u_0dy\\ y=vdy-v_0dy\end{cases} {x=udx−u0dyy=vdy−v0dy
写成矩阵的形式就为:
[ x y ] = [ d x 0 0 d y ] [ u v ] + [ d x 0 0 d y ] \left[ \begin{matrix} x \\y \end{matrix} \right]= \left[ \begin{matrix} dx & 0 \\0 & dy \end{matrix} \right] \left[ \begin{matrix} u \\ v \end{matrix} \right] + \left[ \begin{matrix} dx & 0 \\0 & dy \end{matrix} \right] [xy]=[dx00dy][uv]+[dx00dy]
改为齐次坐标的形式:
[ x y 1 ] = [ d x 0 0 0 d y 0 0 0 0 ] [ u v 0 ] + [ − u 0 d x − v 0 d y 1 ] = [ d x 0 − u 0 d x 0 d y − v 0 d y 0 0 1 ] [ u v 1 ] \left[ \begin{matrix} x \\y\\1 \end{matrix} \right]= \left[ \begin{matrix} dx & 0 &0 \\0&dy&0\\0&0&0 \end{matrix} \right] \left[ \begin{matrix} u \\v\\0 \end{matrix} \right] + \left[ \begin{matrix} -u_0dx \\-v_0dy\\1 \end{matrix} \right]=\left[ \begin{matrix} dx & 0 &-u_0dx \\0&dy&-v_0dy\\0&0&1 \end{matrix} \right]\left[ \begin{matrix} u \\v\\1 \end{matrix} \right] ⎣⎡xy1⎦⎤=⎣⎡dx000dy0000⎦⎤⎣⎡uv0⎦⎤+⎣⎡−u0dx−v0dy1⎦⎤=⎣⎡dx000dy0−u0dx−v0dy1⎦⎤⎣⎡uv1⎦⎤
3.3 相机坐标系
- 相机坐标系是以相机的光轴作为Z轴,光线在相机光学系统的中心位置就是原点 O c Oc Oc(实际上就是透镜的中心),相机坐标系的水平轴 X c Xc Xc与垂直轴 Y c Yc Yc分别于图像坐标系的X轴和Y轴平行。
- 在图中,相机坐标系的原点与图像坐标系的原点之间的距离 O c O i OcOi OcOi之间的距离为f(也就是焦距)。
上图中,如果有一个物体成像到图像坐标系,则可以用下图来表示(B点是相机坐标系中物体的点坐标,P是图像坐标系中成像的坐标):
- 为什么 O c O i O_cO_i OcOi是相机的焦距呢?:
由小孔成像原理
1.像平面就是成像的位置,这个是用户自己设定的,就是CCD传感器的位置,而焦平面就是镜头的焦距所在平面。当像平面刚好和焦平面重合时,此时所成的像是最清晰的。所以,这也就是为什么上面的公式中相机坐标系的原点到图像坐标系的原点的距离就是焦距。(实际上,由于物理条件的限制,像平面和焦平面是不可能完全重合的。)
2.同样是本文的第一个图,我们可以看到像平面在光学系统的右面,而在推导相机标定的坐标系关系时,却认为光线先通过成像平面,再在相机坐标系上汇聚到一个点,实际上,如果用下图来说明,可能就更清楚一点。就是推导的时候,把像平面用虚拟像平面代替了。
3.4 世界坐标系
- 世界坐标系是图像与真实物体之间的一个映射关系。如果是单目视觉的话,主要就是真实物体尺寸与图像尺寸的映射关系。如果是多目视觉的话,那么就需要知道多个相机之间的关系,这个关系就需要在同一个坐标系下进行换算。在下图中,世界坐标系的原点是 O w Ow Ow,而 X w , Y w , Z w Xw,Yw,Zw Xw,Yw,Zw轴并不是与其他坐标系平行的,而是有一定的角度,并且有一定的平移。
当对相机坐标系安装一定的参数,分别绕着X,Y,Z轴做平移和旋转后,就得到在世界坐标系中的坐标。 平移表示:
{ X w = X c + t x Y w = Y c + t y Z w = Z c + t z \begin{cases} X_w=X_c+t_x\\ Y_w=Y_c+t_y\\Z_w=Z_c+t_z\end{cases} ⎩⎪⎨⎪⎧Xw=Xc+txYw=Yc+tyZw=Zc+tz
而对于旋转,可以采用如下的方法,给定一个基本旋转矩阵和基本矩阵:
[ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 ] \left[ \begin{matrix} 1&0&0&0\\0&1&0&0\\0&0&1&0\\0&0&0&1 \end{matrix} \right] ⎣⎢⎢⎡1000010000100001⎦⎥⎥⎤
R = [ c o s θ s i n θ − s i n θ c o s θ ] R=\left[ \begin{matrix} cos\theta&sin\theta\\-sin\theta&cos\theta \end{matrix} \right] R=[cosθ−sinθsinθcosθ]
- 对于三坐标轴旋转
当绕着X轴旋转时,保持基本矩阵的第1列不变
当绕着Y轴旋转时,保持基本矩阵的第2列不变
当绕着Z轴旋转时,保持基本矩阵的第3列不变
那么,整个相机坐标系到世界坐标系的变换公式为:
[ X w , Y w , Z w , 1 ] = [ X c , Y c , Z c , 1 ] [ R 0 t 1 ] \left[ \begin{matrix} X_w,Y_w,Z_w,1 \end{matrix} \right]=\left[ \begin{matrix} X_c,Y_c,Z_c,1 \end{matrix} \right]\left[ \begin{matrix} R&0\\t&1 \end{matrix} \right] [Xw,Yw,Zw,1]=[Xc,Yc,Zc,1][Rt01]
旋转矩阵
R = R x , R y , R z R=R_x,R_y,R_z R=Rx,Ry,Rz
平移矩阵
T = [ t x , t y , t z ] T=\left[ \begin{matrix} t_x,t_y,t_z \end{matrix} \right] T=[tx,ty,tz]
上述图片来自:相机标定详解
4.坐标系转换
总结坐标系转换如下
4.1 世界坐标到相机坐标
如上图所示,从世界坐标系转换到相机坐标系是三维空间到三维空间的变换,一般来说需要一个平移操作和一个旋转操作就可以完成这个转换,用公式表示如下(可以理解为世界坐标系原点先平移到相机坐标系的位置然后在做一次坐标系旋转,使坐标轴对齐。):
4.2 相机坐标到图像坐标
可以知道相机坐标系与图像坐标系的关系为:
如上图所示(图片来自UIUC计算机视觉课件),是一个小孔成像的模型,其中:
- C 点表示camera centre,即相机的中心点,也是相机坐标系的中心点;
- Z 轴表示principal axis,即相机的主轴;
- p 点所在的平面表示image plane,即相机的像平面,也就是图片坐标系所在的二维平面;
- p 点表示principal point,即主点,主轴与像平面相交的点;
- C 点到 p 点的距离,也就是右边图中的 f 表示focal length,即相机的焦距;
- 像平面上的 x 和 y 坐标轴是与相机坐标系上的 X 和 Y 坐标轴互相平行的;
- 相机坐标系是以 X, Y, Z(大写)三个轴组成的且原点在 C 点,度量值为米(m);
- 像平面坐标系是以 x,y(小写)两个轴组成的且原点在 p 点,度量值为米(m);
- 图像坐标系一般指图片相对坐标系,在这里可以认为和像平面坐标系在一个平面上,不过原点是在图片的角上,而且度量值为像素的个数(pixel);
4.3 像素坐标到世界坐标的变换关系
从像素坐标系到世界坐标系的变换关系:
- 红色的框框表示相机的外参。
- 公式中有一个Zc,它表示物体离光学中心的距离。这也就说明,在标定的时候,如果物体在距离相机的不同位置,那么我们就必须在不同的位置对相机做标定。简单点来理解就是,当物体离相机远的时候,在图像上就很小,那么一个像素代表的实际尺寸就大,当物体离相机近的时候,那么成像效果就大,一个像素代表的实际物体尺寸就小。因此,对于每一个位置都需要去标定。
5. 图像畸变及畸变矫正
- 畸变:字面意思是物体看起来不正常,比如形状改变了,扭曲了或者其他的变化。
- 造成图像畸变的原因有很多,总结起来可以分为两类:径向畸变和切向畸变。
5.1 径向畸变(重点)
- 为了取得好的成像效果,通常要在相机的镜头前添加透镜。在相机成像的过程中,透镜会对光线的传播产生影响,从而影响相机的成像效果,产生畸变。
- 透镜自身的形状对才光线的传播产生影响,形成的畸变称为径向畸变。在小孔模型中,一条指向在成像平面上的像仍然是直线。但是在实际拍摄的过程中,由于透镜的存在,往往将一条直线投影成了曲线,越靠近图像的边缘,这种现象越明显。透镜往往是中心对称的,使得这种不规则的畸变通常是径向对称的。
- 径向畸变的效应有三种,一种是桶形畸变(barrel distortion),另一种是枕形畸变(pincushion distortion),还有一种是两种的结合叫做胡子畸变(mustache distortion),从图片中可以很容易看出区别,具体见下图
- 径向畸变是由于镜头的凸透形状造成的,即固有特性无法消除,主要可通过硬件和软件消除,如硬件上采用高质量的光学玻璃及镜片组优化设计(价格因素),软件上用matlab或opencv后期进行畸变矫正。
5.2 切向畸变
-
切向畸变是当透镜与成像平面不行时,就产生了畸变,类似于透视变换。
-
切向畸变主要由于相机安装过程中产生的,即透镜本身和传感器平面不平行造成的。
6. 张正友标定法
- 张正友相机标定法:张正友的平面标定方法是介于传统标定方法和自标定方法之间的一种方法。它既避免了传统方法设备要求高,操作繁琐等缺点,又比自标定方法精度高,因此张氏标定法被广泛应用于计算机视觉方面。
其中包括:
- 模型 即如何由光学成像公式和坐标变换方法建立摄像机的参数矩阵
- 算法 即如何对参数矩阵进行计算
- 优化 即如何计算畸变,以及如何对参数进行优化坐标变换
张正友的方法只考虑了径向畸变,没有考虑切向畸变。
设 ( μ , ν ) (μ,ν) (μ,ν)是理想的无畸变的像素坐标; ( μ , ν ) (μ^,ν^) (μ,ν)是畸变后的像素坐标; ( μ 0 , ν 0 ) (μ_0,ν_0) (μ0,ν0)是相机的主点; ( x , y ) (x,y) (x,y)和 ( x , y ) (x^,y^) (x,y)理想的无畸变的归一化的图像坐标和畸变后的归一化图像坐标,使用下面的式子表示径向畸变:
x ^ = x + x [ k 1 ( x 2 + y 2 ) + k 2 ( x 2 + y 2 ) 2 ] \hat{x}=x+x[k_1(x^2+y^2)+k_2(x^2+y^2)^2] x^=x+x[k1(x2+y2)+k2(x2+y2)2]
y ^ = y + y [ k 1 ( x 2 + y 2 ) + k 2 ( x 2 + y 2 ) 2 ] \hat{y}=y+y[k_1(x^2+y^2)+k_2(x^2+y^2)^2] y^=y+y[k1(x2+y2)+k2(x2+y2)2]
假设γ=0,则有:
μ ^ = μ + ( μ − μ 0 ) [ k 1 ( x 2 + y 2 ) + k 2 ( x 2 + y 2 ) 2 ] \hat{μ}=μ+(μ−μ_0)[k_1(x^2+y^2)+k_2(x^2+y^2)^2] μ^=μ+(μ−μ0)[k1(x2+y2)+k2(x2+y2)2]
ν ^ = ν + ( ν − ν 0 ) [ k 1 ( x 2 + y 2 ) + k 2 ( x 2 + y 2 ) 2 ] \hat{ν}=ν+(ν-ν_0)[k_1(x^2+y^2)+k_2(x^2+y^2)^2] ν^=ν+(ν−ν0)[k1(x2+y2)+k2(x2+y2)2]
将上面的式子改写为矩阵的形式:
[ ( μ − μ 0 ) ( x 2 + y 2 ) d x ( μ − μ 0 ) ( x 2 + y 2 ) 2 ( ν − μ 0 ) ( x 2 + y 2 ) d x ( ν − ν 0 ) ( x 2 + y 2 ) 2 ] [ k 1 k 2 ] = [ μ ^ − μ ν ^ − ν ] \left[ \begin{matrix} (\mu-\mu_0)(x^2+y^2)dx &(\mu-\mu_0)(x^2+y^2)^2\\ (\nu-\mu_0)(x^2+y^2)dx &(\nu-\nu_0)(x^2+y^2)^2 \end{matrix} \right] \left[ \begin{matrix} k_1 \\k_2 \end{matrix} \right] =\left[ \begin{matrix} \hat{μ}-\mu \\ \hat{\nu}-\nu \end{matrix} \right] [(μ−μ0)(x2+y2)dx(ν−μ0)(x2+y2)dx(μ−μ0)(x2+y2)2(ν−ν0)(x2+y2)2][k1k2]=[μ^−μν^−ν]
上面的等式是从一幅图像上的一个点取得,设有n幅图像,每幅图像上有m个点,则将得到的所有等式组合起来,可以得到2mn个等式,将其记着矩阵形式 D k = d D_k=d Dk=d
则可得
和上面类似利用最大似然估计取得最优解,使用LM的方法估计使得下面式子是最小值的参数值
得到畸变参数 k 1 , k 2 k_1,k_2 k1,k2后,可以先将图像进行去畸变处理,然后用去畸变后的图像坐标估计相机的内参数.
关于张正友相机标定的详细:张正友相机标定法(知乎)
7. 实验过程及小结
7.1 实验步骤
- 1.打印一张棋盘格,把它贴在一个平面上,作为标定物。
- 2.通过调整标定物或摄像机的方向,为标定物拍摄一些不同方向的照片(一般10~20张)。
- 3.从照片中提取棋盘格角点(Harris特征)。
- 4.估算理想无畸变的情况下,五个内参和六个外参。
- 5.应用最小二乘法估算实际存在径向畸变下的畸变系数。
- 6.极大似然法,优化估计,提升估计精度。
7.2 实验准备
- 拍摄了不同高度不同角度的23张照片
- 我是iphone 7Plus 1200万像素后置
7.3 实验过程
7.3.1 Matlab工具箱
使用的是Matlab工具箱标定:
-
1.应用程序中找到Camera Calibration
-
2.添加标定板拍摄图片(按Ctrl可一次添加多张
-
3.输入棋盘格每格的尺寸大小
我这里是2.8cm -
4.显示已检测出的棋盘格,点击Calibration,开始标定。
-
5.显示标定结果
7.3.2 python代码运行
运行结果:
所有图像都可以检测出角点,这里只放3张
内参矩阵:
7.4 实验小结
标定结果:
- 可以通过重投影误差来评估结果的好坏。结果越小效果越好。这里平均误差为0.22,网上说小于平均误差小于0.5都算效果良好。
- 我看了一下误差最大和误差最小的照片
误差最大:
误差最小:
- 径向畸变是由于透镜形状的制造工艺导致,造成图像点从主点开始沿着径向线发生位移,主要原因是由于透镜的制造原理使光线在远离透镜中心的地方折射效果更加明显,越远离中心点畸变的效果越显著。可见这个误差最小的图像完全位于照片的中心位置,所以畸变程度小,重投影误差就小。误差最大的图像占满了整个屏幕且四个周围点都有黑白格。
相机外部参数,外参就是相机相对于世界坐标系的旋转和平移变换关系。所以每次的外参都不相同,这里因为外参过多,所以贴上可视化显示的结果:
- 点击工具箱上的Show Extrinsic,外部参数(网格对于摄像机的相对坐标,即摄像机坐标系)将显示出来:它表示相机固定不动,每次相机相对于拍摄图片的位姿。在该图中,帧 ( O c , X c , Y c , Z c ) (O c,X c,Y c,Z c) (Oc,Xc,Yc,Zc)是相机参考帧。蓝色金字塔对应于由图像平面定义的相机的有效视野。要从“以摄像机为中心”视图切换到“以世界为中心”视图,只需单击位于图左下角的切换到以世界为中心的视图按钮即可。
术语解释:
中文名 | 英文名 |
---|---|
内参矩阵 | Intrinsic Matrix |
焦距 | Focal Length |
主点 | Principal Point |
径向畸变 | Radial Distortion |
切向畸变 | Tangential Distortion |
旋转矩阵 | Rotation Matrices |
平移向量 | Translation Vectors |
平均重投影误差 | Mean Reprojection Error |
重投影误差 | Reprojection Errors |
重投影点 | Reprojected Points |
获得(按顺序)
内参矩阵
径向畸变
切向畸变
- 由结果可看出,我手机相机的径向畸变为0.0745 -0.1486,切向畸变可忽略不计
- 查资料得知,Calibration是经过校准后的标注结果,校准分两步完成:首先进行初始化,然后进行非线性优化。 初始化步骤基于不包括任何镜头失真(程序名称:init_calib_param.m)计算校准参数的闭合形式解决方案 。 非线性优化步骤使所有校准参数(对于内在的9DOF:焦点,主点,失真系数和6 * 20 DOF外部=> 129参数)的总重投影误差(在最小二乘意义上)最小化。
内参矩阵的含义:
这里可以发现用matlab和python的方法测得的内参矩阵有误差存在,但差距不会很大。
内参矩阵的每一个参数都有意义:
-
f x = f ∗ s x , f y = f ∗ s y fx=f*s_x,fy=f*s_y fx=f∗sx,fy=f∗sy,f是相机的焦距,以mm为单位
我的这里焦距的参数:415.5265mm 414.3220mm
焦距就是真空与图像平面(投影屏幕)的距离,类似于人眼和视网膜,焦距的度量是针对像素的。针孔相机的fx,fy有相同的值。上图中红线部分就是焦距。但是在实际中,fx和fy一般不同,有一下几个原因:
1.数码相机传感器的缺陷
2.后处理中图像被非均匀缩放
3.相机透镜导致的无意的失真
4.相机使用了失真的格式,透镜将宽屏场景压缩到标准大小的传感器中
5.相机校准的误差 -
[ c x , c y ] [c_x,c_y] [cx,cy]是相机的光学中心(主点,principal point),s是倾斜参数,当x轴和y轴完全垂直时,s=0.
-
[ s x , s y ] [s_x,s_y] [sx,sy]代表在 ( x , y ) (x,y) (x,y)方向上每毫米的像素量。
-
内参矩阵只关心相机坐标和图像坐标之间的关系,与相机的绝对尺寸无关。针对焦距和主点偏移使用响度单元可以表示相机的相对尺寸,换句话说就是投影面的位置与其尺寸(以像素为单位)相关。
8 实验中遇到的问题
1.这里有一张图片无法检测出角点,所以最后有22张图片进行标定
分析:这里因为照片过于局部,方格的数量已经与其他图片不一样,导致无法计算。