相机标定(Camera calibration)
简单介绍
摄像机标定(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)(小写)是在像平面坐标系(还不是图像坐标系。原点不同。
)观察第二个图,非常简单的能够得到这个转换:
能够表示为矩阵计算为(在这里用的是齐次坐标的表示方式,关于齐次坐标文章最以下有介绍):
能够简写为(P 就是所谓的投影矩阵,当然如今还不完整):
增加偏移量
通过上面,能够把相机坐标系转换到像平面坐标系,可是像平面坐标系和图像坐标系尽管在同一个平面上,可是原点并非同一个,而目标是要转换到图像坐标系下。所以还须要一步操作。例如以下图:
如上图所看到的(图片来自UIUC计算机视觉课件),当中主点 p 是像平面坐标系的原点,但在图像坐标系中的位置为(px,py),在这里。图形坐标系的原点是图片的左下角,所以能够得到:
相当于在上面的基础上加了一个p
点坐标的偏移量,同一时候能够表示为矩阵计算为(在这里用的是齐次坐标的表示方式):
整理一下得:
所以最后能够得到 K。也就是平时所说的相机内參(Intrinsic parameters
):
以及投影矩阵 P(在这里能够觉得旋转矩阵 R 为单位矩阵 I。平移矩阵 t 都为0,这也是为什么要拆成这样的方式),为:
像素坐标
前面也提到了在图像坐标系中用的不是现实生活中的m
来度量。而是用的 pixel
的个数,所以在上面转换到图像坐标系中还有个问题。就是坐标的表示还是m
,并没有转换到像素坐标系统;在这里须要引入一个新概念就是:
- mx 表示在水平方向
1m
的长度包含的像素的个数; - my 表示在竖直方向
1m
的长度包含的像素的个数;
可能有人奇怪为啥不是一个值,还须要分别指定 mx 和 my 呀,这是由于通过上面能够得到一个像素点的大小(m
度量)为:
可是须要说明的是像素并不一定是一个正方形。有时候可能也是一个矩形。所以要分别指定。
所以能够把上面相机内參 K 变为更新为。转换公式把 K 替换就可以,其它不变:
一般来说。在使用相机内參K
计算坐标系转换时,提供的都是已经变换后的值;比如会提供 fx,fy ,cx,cy 四个值代表相机内參K,事实上 fx 就是这里的 αx,同理 fy 是 αy,cx 是 βx。cy 是 βy。
世界坐标系 转换到 图像坐标系
坐标系介绍
如上图所看到的(图片来自UIUC计算机视觉课件)。从世界坐标系转换到相机坐标系是三维空间到三维空间的变换。一般来说须要一个平移操作和一个旋转操作就能够完毕这个转换。用公式表演示样例如以下(能够理解为世界坐标系原点先平移到相机坐标系的位置然后在做一次坐标系旋转,使坐标轴对齐。):
- R 表示旋转矩阵;
- X˜ 表示 X 点在世界坐标系中的位置;
- C˜ 表示相机原点 C 在世界坐标系中的位置;
- X˜cam 表示 X 点在相机坐标系中的位置;
世界 转换到 相机
依据上面的公式能够得到从一个三维点从世界坐标系转换到相机坐标的变换公式例如以下(也是用的齐次坐标的表示方式):
世界 转换到 图像
依据上面的讨论知道了如何从世界坐标系转换到相机坐标系(平移和旋转)以及从相机坐标系转换到图像坐标系(相机内參变换),所以带入上面的矩阵计算,能够得到:
这样就得到了终于的投影矩阵 P :
当中:
在这里,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
):
径向畸变能够用例如以下公式修正:
切向畸变(tangential distortion
)
切向畸变是由于透镜与成像平面不严格的平行,其能够用例如以下公式修正:
当中:
- xdis 和 ydis 表示有畸变的坐标;
- xcorr 和 ycorr 表示修复后的坐标;
- k1,k2。k3 表示径向畸变參数;
- p1,p2 表示切向畸变參数。
所以终于得到5个畸变參数:
相机标定
那么能够利用这些来进行终于的任务相机标定。简单的过程能够描写叙述为通过标定板。例如以下图。能够得到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)的更多相关文章
- [zt]摄像机标定(Camera calibration)笔记
http://www.cnblogs.com/mfryf/archive/2012/03/31/2426324.html 一 作用建立3D到2D的映射关系,一旦标定后,对于一个摄像机内部参数K(光心焦 ...
- 【视频开发】【计算机视觉】相机标定(Camera calibration)原理、步骤
相机标定(Camera calibration)原理.步骤 author@jason_ql(lql0716) http://blog.csdn.net/lql0716 在图像测量过程以及机器视觉应用 ...
- 【视频开发】【计算机视觉】相机标定(Camera calibration)《二》
简介 摄像机标定(Camera calibration)简单来说是从世界坐标系换到图像坐标系的过程,也就是求最终的投影矩阵 P 的过程,下面相关的部分主要参考UIUC的计算机视觉的课件(网址Sprin ...
- Camera Calibration 相机标定:Opencv应用方法
本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/49427383 Opencv中Camer ...
- Camera Calibration 相机标定:原理简介(五)
5 基于2D标定物的标定方法 基于2D标定物的标定方法,原理与基于3D标定物相同,只是通过相机对一个平面进行成像,就可得到相机的标定参数,由于标定物为平面,本身所具有的约束条机,相对后者标定更为简单. ...
- Camera Calibration 相机标定:原理简介(一)
1 相机标定常见方法 广义来说,相机标定不单包括成像过程的几何关系标定,还包括辐射关系的标定,本文只探讨几何关系.相机标定是3D计算机视觉(Computer Vision)里从2D图像中提取量测信息的 ...
- Camera Calibration 相机标定
Camera Calibration 相机标定 一.相机标定方法 在opencv中提供了一组函数用于实现相机的标定,标定返回的值包括:相机内参矩阵(fx fy xc yc).相机外参矩阵(R t)以及 ...
- Camera Calibration 相机标定:原理简介(四)
4 基于3D标定物的标定方法 使用基于3D标定物进行相机标定,是一种传统且常见的相机标定法.3D标定物在不同应用场景下不尽相同,摄影测量学中,使用的3D标定物种类最为繁杂,如图-1的室内控制场,由多条 ...
- Camera Calibration 相机标定:原理简介(二)
2 针孔相机模型 常见的相机标定中,使用的相机多为针孔相机(Pinhole camera),也就是大家熟知的小孔成像理论.将其中涉及的坐标系之间的相互转换抽离出来,即为针孔相机模型的核心. 上图所示的 ...
随机推荐
- Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown error 1146
问题介绍: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown error 1146 MySql语法错误, 但是错 ...
- HTML习题附答案
第一章 1.HTML指的是( A ). A超文本标记语言(Hyper Text Markup Language) B家庭工具标记语言(Home Tool Markup Language) C超 ...
- Chrome浏览器商店安装的插件保存到本地
Chrome自67版本开始,不能从第三方下载插件拖动安装,要么就是以前的方法安装修改为zip格式,会有报错(报错如下图),强迫症肯定忍不了报错的:按照网上说法,是第三方插件的压缩算法和Chrome商店 ...
- Maven项目框架源代码和文档的查看
方便maven项目的调试和源代码学习,可以通过添加maven插件的方式下载源代码和文件进行查看. mavan插件节点结构如下: <project xmlns="http://maven ...
- memcached 经典问题或现象
缓存雪崩现象及真实案例 缓存雪崩一般是由某个缓存节点失效,导致其他节点的缓存命中率下降, 缓存中缺失的数据 去数据库查询.短时间内,造成数据库服务器崩溃. 重启 DB,短期又被压跨,但缓存数据也多一些 ...
- 五分钟掌握 for...in 和 for...of 区别
GitHub 地址,欢迎star,查看更多整理的前端知识 for...in for...in 语句以任意顺序遍历一个对象的可枚举属性. for...in 遍历对象本身的所有可枚举属性,以及对象从其构造 ...
- python书籍推荐:量化投资:以Python为工具
所属网站分类: 资源下载 > python电子书 作者:mimi 链接:http://www.pythonheidong.com/blog/article/451/ 来源:python黑洞网 内 ...
- Python数据结构--搜索树
''' 二叉搜索树(BST)是一棵树,其所有节点都遵循下述属性 - 节点的左子树的键小于或等于其父节点的键. 节点的右子树的键大于其父节点的键. 因此,BST将其所有子树分成两部分; 左边的子树和右边 ...
- Android开发——程序锁的实现(可用于开发钓鱼登录界面)
1. 程序锁原理 1.1 实现效果: 在用户打开一个应用时,若此应用是我们业务内的逻辑拦截目标,那就在开启应用之后,弹出一个输入密码的界面,输入密码正确则进入目标应用.若不输入直接按返回键,则直接返回 ...
- .NET Core 文件的上传与下载
1.前言 文件导入导出是简单且常用的功能,以下示例实现了文件上传与下载的几种方法,如有不妥的地方,欢迎指正.小白一枚,在往目标前进. 2.1.文件上传 -- 纯文件 <form ac ...