1.什么是相机标定
2.为什么要进行标定
3.相机模型
4.现有标定方法
5.张正友标定法推导
6.相应代码实现
7.特种相机标定,相关软件介绍
8.鱼眼相机,双目相机,深度相机
1,2:
http://blog.csdn.net/dcrmg/article/details/52880508
3.相机模型
主要参考
https://zhuanlan.zhihu.com/p/24651968 以及
https://www.cnblogs.com/Jessica-jie/p/6596450.html
http://blog.csdn.net/lql0716/article/details/71973318?locationNum=8&fps=1
这部分内容就是解释下面这张图
3.1 世界坐标系与相机坐标系
在世界坐标系中设一个点坐标为
Pw
, 在相机坐标系中对应点为
Pc
. 两者间的旋转平移关系如下:
Pc=RPw+T(1)
其中
R
为旋转矩阵,而
T
为平移向量。
写成齐次坐标表示如下:
⎡⎣⎢⎢⎢xcyczc1⎤⎦⎥⎥⎥=[R0t1]⎡⎣⎢⎢⎢xwywzw1⎤⎦⎥⎥⎥(2)
为便于理解,我们先将物体从世界坐标转换为相机坐标,投影到相机平面上,然后再考虑从相机平面坐标到像素坐标的转化。
而从世界坐标系到相机坐标系的转化参数
R,T
即是所谓外参。
3.2 图像坐标系
真实世界的场景在经过相机镜头
Oc
后会发生放缩与畸变。在不考虑畸变,理想透镜作用下,针孔相机成像原理如下:
为方便推倒,一般将像平面点移到与同一侧。变成如下这样:
由相似三角形即可得:
xp=fxmzm;yp=fymzm(3)
写出齐次坐标形式为:
zm⎡⎣⎢xPyP1⎤⎦⎥=⎡⎣⎢f000f0001000⎤⎦⎥⎡⎣⎢⎢⎢xMyMzM1⎤⎦⎥⎥⎥(4)
3.3 理想图像坐标到实际图像坐标
现实相机中存在多种缺陷,并不能反映真实物理世界物体的几何形状,这称之为畸变。 主要的畸变分为径向畸变与切向畸变。相应的畸变修正参数即所谓相机内参。对畸变最直观的理解就是现实世界的直线经过相机系统后所成的像变弯曲。
径向畸变 是相机透镜形状制造工艺导致的。越往透镜边缘径向畸变越严重。实际操作时常使用光心r=0处泰勒级数展开前几项近似描述径向畸变。矫正前后坐标关系为:
{xrcorr=xp(1+k1r2+k2r4+k3r6)yrcorr=yp(1+k1r2+k2r4+k3r6)(5)
切向畸变 是由于透镜平面与感光平面平行度不够引起的。切向畸变需要额外的畸变参数来描述,矫正前后坐标关系为:
{xtcorr=xp+[2p1xpyp+p2(r2+2x2p)]ytcorr=yp+[p1(r2+2y2p)+2p2xpyp](6)
由此可知对于切向畸变,我们有2个畸变参数需要求解。
综上,我们一共需要5个畸变参数(k1、k2、k3、p1和p2 )来描述透镜畸变。
3.4 从实际图像坐标到像素坐标系
由于定义的像素坐标系原点与图像坐标系原点不重合,假设像素坐标系原点在图像坐标系下的坐标为(u0,v0),每个像素点在图像坐标系x轴、y轴方向的尺寸为:dx、dy,且像点在实际图像坐标系下的坐标为(xc,yc),于是可得到像点在像素坐标系下的坐标为:
u=xcdx+u0;v=ycdy+v0(7)
结合3.2节可得:
⎡⎣⎢uv1⎤⎦⎥=⎡⎣⎢f/dx000f/dy0u0v01⎤⎦⎥⎡⎣⎢⎢⎢xMyMzM1⎤⎦⎥⎥⎥=⎡⎣⎢fx000fy0u0v01⎤⎦⎥⎡⎣⎢⎢⎢xMyMzM1⎤⎦⎥⎥⎥(8)
其中的转换矩阵即为相机内参矩阵。
5.张正友标定法推导
相机标定的问题是如何求解相机内参矩阵M,上述推导中可以看出世界坐标与相机图像坐标间由内参矩阵连接。故要想办法将内参用照片信息与外界标志信息还原出来。
首先给出单应性矩阵的概念。单应性矩阵是同一场景两个不同视角图像对应点的转换矩阵,即:
x1=Hx2(9)
如下图中可以找到一个矩阵能表示从X到X’的转化。该矩阵就称之为单应性矩阵。
为简化起见,我们将物体面视为Z=0平面,则有:
s⎡⎣⎢uv1⎤⎦⎥=M[r1r2r3t]⎡⎣⎢⎢⎢XY01⎤⎦⎥⎥⎥=M[r1r2t]⎡⎣⎢XY1⎤⎦⎥(10)
记
P~=[XY1]T
,
H=M[r1r2t]
,
上式
???
可记为:
p~=sHP~(11)
其中s为比例缩放因子。
我们将单应性矩阵H展开:
H=[h1h2h3]=λM[r1r2t](12)
则可以得到
h1h2h3=λMr1=λMr2=λMt(13)(14)(15)
由于外参矩阵
[r1r2t]
中
r1⊥r2
,以及
||r1||2=||r2||2
所以有:
hT1M−TM−1h2=0hT1M−TM−1h1=hT2M−TM−1h2(16)(17)
接下来令
B=M−TM−1
,显然B矩阵是一个对称阵,一共有六个自由参数,写开可有:
B=M−TM−1=⎡⎣⎢B11B12B13B12B22B23B13B23B33⎤⎦⎥=⎡⎣⎢1/f2x0−cx/f2x01/f2y−cy/f2y−cx/f2x−cy/f2yc2x/f2x+c2y/f2y+1⎤⎦⎥(18)(19)
将原约束写为以B矩阵表示为:
hT1Bh2=0hT1Bh1=hT2Bh2(20)(21)
而
hTiBhj=vTijb=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢hi1hj1hi1hj2+hi2hj1hi2hj2hi3hj1+hi1hj3hi3hj2+hi2hj3hi3hj3⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥T⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢B11B12B22B13B23B33⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥(22)
原约束可写为:
[vT12vT11−vT22]b=0(23)
上式即可用于求解内参。
7.特种相机标定,相关软件介绍
7.1普通单目相机内参标定使用opencv,matlab自带内参标定工具。
http://blog.csdn.net/liyuqian199695/article/details/62887636
7.2 广角大畸变、鱼眼镜头内参标定使用OCamCalib,
https://sites.google.com/site/scarabotix/ocamcalib-toolbox
7.3 双目、多目相机阵列、相机-IMU、行扫描(rolling shutter)内外参数标定使用Kalibr.
7.4 kinect相机标定
https://github.com/code-iai/iai_kinect2/tree/master/kinect2_calibration