简单介绍

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

基本的坐标系:

  • 世界坐标系(world coordinate system)。
  • 相机坐标系(camera coordinate system);
  • 图像坐标系(image coordinate system);

一般来说,标定的过程分为两个部分:

  • 第一步是从世界坐标系转换为相机坐标系,这一步是三维点到三维点的转换。包含 R,t (相机外參)等參数;
  • 第二部是从相机坐标系转为图像坐标系。这一步是三维点到二维点的转换,包含 K(相机内參)等參数;

相机坐标系 转换到 图像坐标系

坐标系介绍

如上图所看到的(图片来自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)。

相机 转换到 像平面

知道上面的简单知识后,假设知道相机坐标系中的一个点 X(现实三维世界中的点)。在像平面坐标系相应的点是 x,要求求从相机坐标系转为像平面坐标系的转换,也就是从 X 点的(X,Y,Z)通过一定的转换变为 x 点的(x,y)。注意:(X,Y,Z)(大写)是在相机坐标系。而(x,y)(小写)是在像平面坐标系(还不是图像坐标系。原点不同。

)观察第二个图,非常简单的能够得到这个转换:

x=fX/Z
y=fY/Z
(X,Y,Z)↦(fX/Z,fY/Z)

能够表示为矩阵计算为(在这里用的是齐次坐标的表示方式,关于齐次坐标文章最以下有介绍):

⎛⎝⎜⎜⎜XYZ1⎞⎠⎟⎟⎟↦⎛⎝⎜fXfYZ⎞⎠⎟=⎡⎣⎢ff1000⎤⎦⎥⎛⎝⎜⎜⎜XYZ1⎞⎠⎟⎟⎟

能够简写为(P 就是所谓的投影矩阵,当然如今还不完整):

x=PX

增加偏移量

通过上面,能够把相机坐标系转换到像平面坐标系,可是像平面坐标系和图像坐标系尽管在同一个平面上,可是原点并非同一个,而目标是要转换到图像坐标系下。所以还须要一步操作。例如以下图:

如上图所看到的(图片来自UIUC计算机视觉课件),当中主点 p 是像平面坐标系的原点,但在图像坐标系中的位置为(px,py),在这里。图形坐标系的原点是图片的左下角,所以能够得到:

(X,Y,Z)↦(fX/Z+px,fY/Z+py)

相当于在上面的基础上加了一个p点坐标的偏移量,同一时候能够表示为矩阵计算为(在这里用的是齐次坐标的表示方式):

⎛⎝⎜⎜⎜XYZ1⎞⎠⎟⎟⎟↦⎛⎝⎜fX+ZpxfY+ZpyZ⎞⎠⎟=⎡⎣⎢ffpxpy1000⎤⎦⎥⎛⎝⎜⎜⎜XYZ1⎞⎠⎟⎟⎟

整理一下得:

⎛⎝⎜fX+ZpxfY+ZpyZ⎞⎠⎟=⎡⎣⎢ffpxpy1⎤⎦⎥⎡⎣⎢111000⎤⎦⎥⎛⎝⎜⎜⎜XYZ1⎞⎠⎟⎟⎟

所以最后能够得到 K。也就是平时所说的相机内參(Intrinsic parameters):

K=⎡⎣⎢ffpxpy1⎤⎦⎥

以及投影矩阵 P(在这里能够觉得旋转矩阵 R 为单位矩阵 I。平移矩阵 t 都为0,这也是为什么要拆成这样的方式),为:

P=K[I0]

像素坐标

前面也提到了在图像坐标系中用的不是现实生活中的m来度量。而是用的 pixel 的个数,所以在上面转换到图像坐标系中还有个问题。就是坐标的表示还是m,并没有转换到像素坐标系统;在这里须要引入一个新概念就是:

  • mx 表示在水平方向1m的长度包含的像素的个数;
  • my 表示在竖直方向1m的长度包含的像素的个数;

可能有人奇怪为啥不是一个值,还须要分别指定 mx 和 my 呀,这是由于通过上面能够得到一个像素点的大小(m度量)为:

1mx×1my

可是须要说明的是像素并不一定是一个正方形。有时候可能也是一个矩形。所以要分别指定。

所以能够把上面相机内參 K 变为更新为。转换公式把 K 替换就可以,其它不变:

K=⎡⎣⎢mxmy1⎤⎦⎥⎡⎣⎢ffpxpy1⎤⎦⎥=⎡⎣⎢αxαyβxβy1⎤⎦⎥

一般来说。在使用相机内參K计算坐标系转换时,提供的都是已经变换后的值;比如会提供 fx,fy ,cx,cy 四个值代表相机内參K,事实上 fx 就是这里的 αx,同理 fy 是 αy,cx 是 βx。cy 是 βy。

世界坐标系 转换到 图像坐标系

坐标系介绍

如上图所看到的(图片来自UIUC计算机视觉课件)。从世界坐标系转换到相机坐标系是三维空间到三维空间的变换。一般来说须要一个平移操作和一个旋转操作就能够完毕这个转换。用公式表演示样例如以下(能够理解为世界坐标系原点先平移到相机坐标系的位置然后在做一次坐标系旋转,使坐标轴对齐。):

X˜cam=R(X˜−C˜)

  • R 表示旋转矩阵;
  • X˜ 表示 X 点在世界坐标系中的位置;
  • C˜ 表示相机原点 C 在世界坐标系中的位置;
  • X˜cam 表示 X 点在相机坐标系中的位置;

世界 转换到 相机

依据上面的公式能够得到从一个三维点从世界坐标系转换到相机坐标的变换公式例如以下(也是用的齐次坐标的表示方式):

Xcam=(X˜cam1)=[R0−RC˜1](X˜1)=[R0−RC˜1]X

世界 转换到 图像

依据上面的讨论知道了如何从世界坐标系转换到相机坐标系(平移和旋转)以及从相机坐标系转换到图像坐标系(相机内參变换),所以带入上面的矩阵计算,能够得到:

x=K[I0]Xcam=K[R−RC˜]X

这样就得到了终于的投影矩阵 P :

P=K[Rt]

当中:

t=−RC˜

在这里,K 一般称为相机内參(intrinsic parameters),描写叙述了相机的内部參数,包含焦距 f、主点 p 的位置、以及像素与真实环境的大小比例等。这个是固有属性,是提供好的。R 和 t 称为相机外參(extrinsic parameters)。R 在这里是旋转矩阵。能够转换为三维的旋转向量。分别表示绕x。y,z 三个轴的旋转角度。t 眼下就是一个平移向量,分别表示在x,y,z 三个方向上的平移量。

畸变參数(distortion parameters)

在几何光学和阴极射线管(CRT)显示中。畸变(distortion) 是对直线投影(rectilinear projection)的一种偏移。

简单来说直线投影是场景内的一条直线投影到图片上也保持为一条直线。那畸变简单来说就是一条直线投影到图片上不能保持为一条直线了。这是一种光学畸变(optical aberration)。可能由于摄像机镜头的原因,这里不讨论。有兴趣的能够查阅光学畸变的相关的资料。

畸变一般能够分为两大类,包含径向畸变和切向畸变。

基本的一般径向畸变有时也会有轻微的切向畸变。

径向畸变(Radial distortion

径向畸变的效应有三种。一种是桶形畸变(barrel distortion),还有一种是枕形畸变(pincushion distortion)。还有一种是两种的结合叫做胡子畸变(mustache distortion),从图片中能够非常easy看出差别。详细见下图(图片来自wikipedia):

径向畸变能够用例如以下公式修正:

xcorr=xdis(1+k1r2+k2r4+k3r6)

ycorr=ydis(1+k1r2+k2r4+k3r6)

切向畸变(tangential distortion

切向畸变是由于透镜与成像平面不严格的平行,其能够用例如以下公式修正:

xcorr=xdis+[2p1xy+p2(r2+2x2)]

ycorr=ydis+[p1(r2+2y2)+2p2xy]

当中:

  • xdis 和 ydis 表示有畸变的坐标;
  • xcorr 和 ycorr 表示修复后的坐标;
  • k1,k2。k3 表示径向畸变參数;
  • p1,p2 表示切向畸变參数。

所以终于得到5个畸变參数:

D=(k1,k2,p1,p2,k3)

相机标定

那么能够利用这些来进行终于的任务相机标定。简单的过程能够描写叙述为通过标定板。例如以下图。能够得到n个相应的世界坐标三维点 Xi 和相应的图像坐标二维点 xi,这些三维点到二维点的转换都能够通过上面提到的相机内參 K。相机外參 R 和 t,以及畸变參数 D 经过一系列的矩阵变换得到。

如今就用这些相应关系来求解这些相机參数。最后就是用线性方法求解方程式。这里就不做讨论了。

那为什么要做相机标定呢?

每一个镜头的畸变程度各不同样,通过相机标定能够校正这样的镜头畸变。事实上能够觉得用这样的标定的方式来求解相机内參和畸变參数。相当于一种相机校准,然后这些參数就能够用于后面的求解。

比如求解新拍的两幅图片相对的 R 和 t。求解这个外參用到就是标定得到的相机内參和畸变參数。

齐次坐标

就是将一个原本是n维的向量用一个n+1维向量来表示。

很多图形应用涉及到几何变换。主要包含平移、旋转、缩放。

以矩阵表达式来计算这些变换时,平移是矩阵相加,旋转和缩放则是矩阵相乘,综合起来能够表示为 x=R∗X+t(注:由于习惯的原因,实际使用时一般使用变化矩阵左乘向量)(R 旋转缩放矩阵,t 为平移矩阵,X 为原向量,x 为变换后的向量)。

引入齐次坐标的目的主要是合并矩阵运算中的乘法和加法,表示为 x=P∗X 的形式。即它提供了用矩阵运算把二维、三维甚至高维空间中的一个点集从一个坐标系变换到还有一个坐标系的有效方法。

和上面的计算过程是相应的。

相机标定(Camera calibration)的更多相关文章

  1. [zt]摄像机标定(Camera calibration)笔记

    http://www.cnblogs.com/mfryf/archive/2012/03/31/2426324.html 一 作用建立3D到2D的映射关系,一旦标定后,对于一个摄像机内部参数K(光心焦 ...

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

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

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

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

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

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

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

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

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

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

  7. Camera Calibration 相机标定

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

  8. Camera Calibration 相机标定:原理简介(四)

    4 基于3D标定物的标定方法 使用基于3D标定物进行相机标定,是一种传统且常见的相机标定法.3D标定物在不同应用场景下不尽相同,摄影测量学中,使用的3D标定物种类最为繁杂,如图-1的室内控制场,由多条 ...

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

    2 针孔相机模型 常见的相机标定中,使用的相机多为针孔相机(Pinhole camera),也就是大家熟知的小孔成像理论.将其中涉及的坐标系之间的相互转换抽离出来,即为针孔相机模型的核心. 上图所示的 ...

随机推荐

  1. PHP22 PHP在线支付

    易宝支付示例脚本 参考网址:https://blog.csdn.net/yerenyuan_pku/article/details/52239862 参数说明 p1_MerId:商户编号,网站在易宝上 ...

  2. Java 编程下 Eclipse/myeclipse 如何设置单行代码显示的最大宽度

    http://www.cnblogs.com/sunzn/archive/2013/03/30/2990191.html 或 http://zhidao.baidu.com/link?url=67uy ...

  3. xcode中自定义log打印

    打印内容包括 在哪个文件中 ? 在哪个方法中? 将要执行什么操作?   // 此打印实现前提: // 1.在.pch文件中实现自定义log打印方法,log名换为LCLog // 2.定义一个宏obje ...

  4. c++内联函数解析(inline)

    一.基本定义 inline是C++语言中的一个关键字,可以用于程序中定义内联函数,inline的引进使内联函数的定义更加简单.说到内联函数,这里给出比较常见的定义,内联函数是C++中的一种特殊函数,它 ...

  5. docker-ce快速部署

    配置yum源wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repowget -O ...

  6. 编码&解码

    编码与解码首先,明确一点,计算机中存储的信息都是二进制的 编码/解码本质上是一种映射(对应关系):比如‘a’用ascii编码则是65,计算机中存储的就是00110101,但是显示的时候不能显示0011 ...

  7. Spring Boot 集成Angular程序

    假设 1.你已经完成了Spring Boot的示例,在浏览其中输入http://localhost:8080/index,能够返回html页面. 2.你已经完成了Angular程序,名字为quicks ...

  8. 大数据学习——flume拦截器

    flume 拦截器(interceptor)1.flume拦截器介绍拦截器是简单的插件式组件,设置在source和channel之间.source接收到的事件event,在写入channel之前,拦截 ...

  9. Python 单向队列Queue模块详解

    Python 单向队列Queue模块详解 单向队列Queue,先进先出 '''A multi-producer, multi-consumer queue.''' try: import thread ...

  10. MySQL数据库不识别server=.而是识别localhost

    MySQL数据库不识别server=.而是识别localhost