http://www.cnblogs.com/mfryf/archive/2012/03/31/2426324.html

一 作用
建立3D到2D的映射关系,一旦标定后,对于一个摄像机内部参数K(光心焦距变形参数等,简化的情况是只有f错切=0,变比=1,光心位置简单假设为图像中心),参数已知,那么根据2D投影,就可以估计出R t;
空间3D点所在的线就确定了,根据多视图(多视图可以是运动图像)可以重建3D。
如果场景已知,则可以把场景中的虚拟物体投影到2D图像平面(DLT,只要知道M即可)。或者根据世界坐标与摄像机坐标的相对关系,R,T,直接在Wc位置渲染3D图形,这是AR的应用。
因为是离线的,所以可以用手工定位点的方法。

二 方法
1 Direct linear transformation (DLT) method 
2 A classical
approach is "Roger Y. Tsai Algorithm".It is a 2-stage algorithm,
calculating the pose (3D Orientation, and x-axis and y-axis translation)
in first stage. In second

stage it computes the focal length, distortion coefficients and the z-axis translation. 
3
Zhengyou Zhang's "a flexible new technique for camera calibration"
based on a planar chess board. It is based on constrains on homography.

4个空间:世界,摄像机(镜头所在位置),图像(原点到镜头中心位置距离f),图像仿射空间(最终成像空间),这些空间原点在不同应用场合可以假设重合。
具体说来,前两个空间是R t关系,6个变量搞定;第二到第三空间用相似三角形投影到平面上,如果没有变形,光心在图像中心上,到这里为止其实就够了,K就一个参数。

K是摄像机坐标系到图像平面的转换函数,叫内部参数(intrinsic parameter)。标定就是求上三角矩阵K的5个参数的过程。
用齐次(Homogeneous)坐标表示这个关系: (实际二维点是[u,v]'=[U/W , V/W]')

[U]    [a b -u0][-fxc/zc]   [-fa -fb -u0][xc/zc]        [xc/zc]
ub=[V]  =[0 c -v0][-fyc/zc ]= [0   -fc -v0][yc/zc]= K * [yc/zc]
       [W]   [0 0   1][  1    ]       [0   0     1]  [ 1   ]           [ 1   ]
   
世界坐标系到图像坐标系的转换有平移矢量t和旋转R矩阵组成,R,t是外部参数(extrinsic parameters),表示摄像机姿态,包含6个自由度,R t 各3个。Xc=[xc yc zc]'= R(Xw-t) , ' 表示转置。

把两个合起来 
zc*ub=zc*[U V W]'= K*R(Xw-t)

把三维点Xw表示成齐次坐标,Xwb=[Xw,1]',则
       [U] 
ub=[V] = [K*R |-K*R*t][Xw 1]' =M*[Xw 1]' = M* Xwb
       [W]  ([K*R |-K*R*t]也可写成K[R t']串联的形式)
   
3×4矩阵M称为投影矩阵,这样三维点P到二维平面的投影就由上式的线性变换表达了。摄像机标定就是求K,K是与R,t一起耦合在M中的。

常用的方法是已知场景3D点和图像二维点,求M。如Tsai grid方法。   
根据至少6个对应点,建立方程组:
alpha*[u v 1]' = M * [x y z 1]'
写成2n×12矩阵 l*mij=0的形式(叫Direct Linear Transformation (DLT)):

[P1 | 0 | -u*P1]  [m11]
[0  |P1 | -v*P1]* [m12] = 0.   
[   ...                 ]   ...
[   ...                  ]   [m34]      (矢量Pi表示第i个三维点[Xi,Yi,Zi,1]')
方程解是l'*l的最小eigenvalue对应的eigenvector,|m|2=1,很多书上提到用SVD分解,l=UDV',V就是特征矢量矩阵。
其实,l'*l=VDU'UDV'=VDDV',V'=inv(V),所以l'*l*V=VD^2,这就是特征矢量的求法。很明显,l的singular vector是l'*l的特征矢量的平方根。

(PCA,K-L变换
和SVD之间的关系。边肇琪《模式识别》提到人脸识别降维的例子时,讲到如果样本数小于特征维数,要用SVD提取特征向量。在这里协方差矩阵为l'*l,
是12×12的矩阵,l矩阵的短边为9,而且计算M(Homography矩阵)时,点对要经过Normalize,完全可以参照人脸的例子。SVD总是
和最小二乘,伪逆Ax=b-》A'*Ax=A'b-》x=inv(A'*A)*A'*b,联系在一起。)

M=[K*R |-K*R*t]=[A|b],A = K*R,用QR分解(或SVD)将A分解为上三角矩阵K和单位正交阵R.
实际上M只有11个参数(Rt6个,K5个)。如果把摄像头畸变也考虑进去,mij变成16个值,则需要更多的对应点。
如果3D点在一个平面上,l is singular,那么退化成9个参数。

已知场景3D点pattern拍一张照片,点分布在2到3个pattern平面上。
以上参考 milan sonka的Image processing一书。

实际上现在大家都是用张正友的方法,将网格点构成的pattern预先打印在一张纸上,对它拍摄不同方向照片(至少两张)。
网上有matlab calibration包,OpenCV也有对应的实现,可以同时求摄像机的内部参数和外部参数(姿态估计)。
具体用到梯度下降方法,尽管R有3*3=9个数,但只有3个自由度,用rodrigues formula转为3维矢量,计算Jacobi更方便。

具体参考:
1 Rodrigues' Formula
http://www.cs.berkeley.edu/~ug/slide/pipeline/assignments/as5/rotation.html
2 OpenCV函数说明
http://opencv.willowgarage.com/documentation/camera_calibration_and_3d_reconstruction.html
3 Camera Calibration Toolbox for Matlab
http://www.vision.caltech.edu/bouguetj/calib_doc/

--------------------------------------------------
如果只有平面4个点,如何计算构造DLT,求Homography矩阵[mij]?

1 左边8×9矩阵A,m为9个数。rank 8, i.e. they have a one-dimensional null-space. 
The solution can be determined from the null-space of A.

svd分解 A=UDV',D为singular valuies,mij的解为V中最小的singular value对应列。

2 退化成一个平面到另一个平面的透视变换

u = (L1*X + L2*Y + L3)/(L7*X + L8*Y + 1) ;
v = (L4*X + L5*X + L6)/(L7*X + L8*Y + 1) ;

--------------------------------------------------
姿态估计:
基本思想是用3D点align到2D点上,使误差最小。已知3D场景点,估计摄像机姿态,或者3D场景点关于摄像机坐标系的相对位置。
比如,marker可以构成世界坐标系,4个点坐标已知。它们相对于摄像机空间的坐标(Xa,Ya,Za)求出,xy轴可以求出,用右手法则z轴可以求出。
这样世界坐标系的3根轴已知,就可以渲染3D场景了。(AR应用)
具体参见Hybrid camera pose estimation combining square fiducials localisation technique and orthogonal iteration algorithm
或 OI算法 都是类似梯度下降的迭代算法,可以利用前一帧的参数作为初值,实时估计R和T。
--------------------------------------------------
重建3D场景:
对于多个未经标定的摄像机,也可以根据在每个图像中的2D点位置重建3D点
x1=P1X
x2=P2X
。。。。
Pi可以由已知场景点实时更新,xi可以根据运动估计更新,这样可以计算X。

具体方法参见 Multiple View Geometry in Computer Vision 一书。

本文引用地址:http://blog.sciencenet.cn/home.php?mod=space&uid=465130&do=blog&id=365366

[zt]摄像机标定(Camera calibration)笔记的更多相关文章

  1. 相机标定(Camera calibration)

    简单介绍 摄像机标定(Camera calibration)简单来说是从世界坐标系换到图像坐标系的过程.也就是求终于的投影矩阵 P 的过程,以下相关的部分主要參考UIUC的计算机视觉的课件(网址Spr ...

  2. 【视频开发】【计算机视觉】相机标定(Camera calibration)《二》

    简介 摄像机标定(Camera calibration)简单来说是从世界坐标系换到图像坐标系的过程,也就是求最终的投影矩阵 P 的过程,下面相关的部分主要参考UIUC的计算机视觉的课件(网址Sprin ...

  3. 【视频开发】【计算机视觉】相机标定(Camera calibration)原理、步骤

    相机标定(Camera calibration)原理.步骤 author@jason_ql(lql0716)  http://blog.csdn.net/lql0716 在图像测量过程以及机器视觉应用 ...

  4. Camera Calibration 相机标定:原理简介(一)

    1 相机标定常见方法 广义来说,相机标定不单包括成像过程的几何关系标定,还包括辐射关系的标定,本文只探讨几何关系.相机标定是3D计算机视觉(Computer Vision)里从2D图像中提取量测信息的 ...

  5. Camera Calibration 相机标定

    Camera Calibration 相机标定 一.相机标定方法 在opencv中提供了一组函数用于实现相机的标定,标定返回的值包括:相机内参矩阵(fx fy xc yc).相机外参矩阵(R t)以及 ...

  6. 摄像头标定GML Camera Calibration

    摄像头标定GML Camera Calibration GML Camera Calibration官方版是一款十分优秀出色的相机标定软件,GML Camera Calibration官方版界面友好, ...

  7. 机器视觉学习笔记(5)——基于OpenCV的单目摄像机标定

    本文CameraCalibrator类源代码来自于OpenCV2 计算机视觉编程手册(Robert Laganiere 著 张静 译) 强烈建议阅读机器视觉学习笔记(4)--单目摄像机标定参数说明之后 ...

  8. Camera Calibration 相机标定:Opencv应用方法

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/49427383 Opencv中Camer ...

  9. Camera Calibration 相机标定:原理简介(五)

    5 基于2D标定物的标定方法 基于2D标定物的标定方法,原理与基于3D标定物相同,只是通过相机对一个平面进行成像,就可得到相机的标定参数,由于标定物为平面,本身所具有的约束条机,相对后者标定更为简单. ...

随机推荐

  1. Microshaoft WinDbg cmdtree

    windbg ANSI Command Tree 1.0 title {"Microshaoft Commands"} body {"cmdtree"} {&q ...

  2. XStream-----把JavaBean转换为xml的工具

    1. 什么作用 可以把JavaBean转换为(序列化为)xml 2. XStream的jar包 核心JAR包:xstream-1.4.7.jar: 必须依赖包:xpp3_min-1.1.4c(XML ...

  3. 【JDK】电脑上安装多个JDK ,修改JAVA_HOME后没有作用

    电脑上装了 C:\Program Files\Java\jdk1.6.0_43      C:\Program Files\Java\jdk1.7.0_80     C:\Program Files\ ...

  4. loadruner知识点小结

    1.Download Filters功能 帮助在回放脚本的时候对某些特定的访问进行屏蔽,解决页面读取中跨服务器带来数据影响的问题.  过滤规则中有3中策略,即URL.Host.HostSfx 区别于: ...

  5. Uva 524 Prime Ring

    如果用全排列生成之后,在判断是否是素数环是会超时的,应该用回溯. 回溯的时候  首先要注意 递归边界 ,结束的时候别忘记判断最后一个和第一个元素能否成立  还有要记得vis的使用和递归之后的清理. # ...

  6. XSS 跨站脚本攻击之ShellCode的调用

    1.ShellCode,最初是溢出程序和蠕虫病毒的核心,实际上是指利用一个漏洞是所执行的代码,在XSS跨站脚本中,是指由javascript等脚本编写的XSS利用代码: 2.Exploit,在黑客眼里 ...

  7. CSS3属性

    1.边框阴影(box-shadow ): 投影方式,X轴偏移,Y轴偏移,阴影模糊半径,阴影扩展半径,颜色 2.边框图像(border-image) 3.边框圆角:border-radius:5px 4 ...

  8. 05_Java异常(Exception)

    1. 异常的概念 1.1什么是异常 异常指的是程序运行时出现的不正常情况. 1.2异常的层次 Java的异常类是处理运行时的特殊类,每一种异常对应一种特定的运行错误.所有Java异常类都是系统类库中E ...

  9. Windows下安装 使用coreseek

    1.安装 1.01:到官网下载 coreseek-3.2.14 1.01_1 原理 缓存服务器: 准备数据 来自数据库 配置连接  生成索引 开启服务 流程:用户-> web->sphin ...

  10. AutoMapper简明教程(学习笔记)

    ].FirstName + nameDto12[].LastName);Console.WriteLine();//Console.ReadKey();//emitMapper error//List ...