【视频开发】【计算机视觉】相机标定(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
),描述了相机的内部参数,包括焦距 f、主点 p的位置、以及像素与真实环境的大小比例等,这个是固有属性,是提供好的;R 和 t 称为相机外参(
parametersextrinsic
),R 在这里是旋转矩阵,可以转换为三维的旋转向量,分别表示绕x,y,z 三个轴的旋转角度,t 目前就是一个平移向量,分别表示在x,y,z 三个方向上的平移量。
parameters
畸变参数(distortion parameters
)
在几何光学和阴极射线管(CRT)显示中,畸变(distortion
) 是对直线投影(rectilinear
)的一种偏移。简单来说直线投影是场景内的一条直线投影到图片上也保持为一条直线。那畸变简单来说就是一条直线投影到图片上不能保持为一条直线了,这是一种光学畸变(
projectionoptical aberration
)。可能由于摄像机镜头的原因,这里不讨论,有兴趣的可以查阅光学畸变的相关的资料。
畸变一般可以分为两大类,包括径向畸变和切向畸变。主要的一般径向畸变有时也会有轻微的切向畸变。
径向畸变(Radial distortion
)
径向畸变的效应有三种,一种是桶形畸变(barrel distortion
),另一种是枕形畸变(pincushion
),还有一种是两种的结合叫做胡子畸变(
distortionmustache distortion
),从图片中可以很容易看出区别,具体见下图(图片来自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)简单来说是从世界坐标系换到图像坐标系的过程,也就是求最终的投影矩阵 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
),描述了相机的内部参数,包括焦距 f、主点 p的位置、以及像素与真实环境的大小比例等,这个是固有属性,是提供好的;R 和 t 称为相机外参(
parametersextrinsic
),R 在这里是旋转矩阵,可以转换为三维的旋转向量,分别表示绕x,y,z 三个轴的旋转角度,t 目前就是一个平移向量,分别表示在x,y,z 三个方向上的平移量。
parameters
畸变参数(distortion parameters
)
在几何光学和阴极射线管(CRT)显示中,畸变(distortion
) 是对直线投影(rectilinear
)的一种偏移。简单来说直线投影是场景内的一条直线投影到图片上也保持为一条直线。那畸变简单来说就是一条直线投影到图片上不能保持为一条直线了,这是一种光学畸变(
projectionoptical aberration
)。可能由于摄像机镜头的原因,这里不讨论,有兴趣的可以查阅光学畸变的相关的资料。
畸变一般可以分为两大类,包括径向畸变和切向畸变。主要的一般径向畸变有时也会有轻微的切向畸变。
径向畸变(Radial distortion
)
径向畸变的效应有三种,一种是桶形畸变(barrel distortion
),另一种是枕形畸变(pincushion
),还有一种是两种的结合叫做胡子畸变(
distortionmustache distortion
),从图片中可以很容易看出区别,具体见下图(图片来自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)《二》的更多相关文章
- 相机标定(Camera calibration)
简单介绍 摄像机标定(Camera calibration)简单来说是从世界坐标系换到图像坐标系的过程.也就是求终于的投影矩阵 P 的过程,以下相关的部分主要參考UIUC的计算机视觉的课件(网址Spr ...
- [zt]摄像机标定(Camera calibration)笔记
http://www.cnblogs.com/mfryf/archive/2012/03/31/2426324.html 一 作用建立3D到2D的映射关系,一旦标定后,对于一个摄像机内部参数K(光心焦 ...
- Android 音视频开发(四):使用 Camera API 采集视频数据
本文主要将的是:使用 Camera API 采集视频数据并保存到文件,分别使用 SurfaceView.TextureView 来预览 Camera 数据,取到 NV21 的数据回调. 注: 需要权限 ...
- 【视频开发】OpenCV中Mat,图像二维指针和CxImage类的转换
在做图像处理中,常用的函数接口有OpenCV中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转 ...
- 【视频开发】【计算机视觉】相机标定(Camera calibration)原理、步骤
相机标定(Camera calibration)原理.步骤 author@jason_ql(lql0716) http://blog.csdn.net/lql0716 在图像测量过程以及机器视觉应用 ...
- Android 音视频开发学习思路
Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的.只能通过一点点的学习和积累把这块的知识串联积累起来. 初级入门篇: Android 音视频开发(一) ...
- Android 音视频开发(七): 音视频录制流程总结
在前面我们学习和使用了AudioRecord.AudioTrack.Camera.MediaExtractor.MediaMuxer API.MediaCodec. 学习和使用了上述的API之后,相信 ...
- Camera Calibration 相机标定:原理简介(二)
2 针孔相机模型 常见的相机标定中,使用的相机多为针孔相机(Pinhole camera),也就是大家熟知的小孔成像理论.将其中涉及的坐标系之间的相互转换抽离出来,即为针孔相机模型的核心. 上图所示的 ...
- Camera Calibration 相机标定:Opencv应用方法
本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/49427383 Opencv中Camer ...
随机推荐
- DateTime的ToString方法格式
新建一个.NET Core控制台项目,敲入如下代码: using System; namespace NetCoreDatetime { class Program { static void Mai ...
- oracle 更新日期字段
update field set BEGINDATE=to_date('2017-02-03 10:30:20','yyyy-mm-dd hh24:mi:ss')
- aspose.cells导出Demo
/// <summary> /// 导出excel /// </summary> /// <param name="list"></par ...
- 2019 中细软java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.中细软等公司offer,岗位是Java后端开发,因为发展原因最终选择去了中细软,入职一年时间了,也成为了面试官 ...
- 简单几招提速 Kotlin Kapt编译
https://droidyue.com/blog/2019/08/18/faster-kapt/?hmsr=toutiao.io&utm_medium=toutiao.io&utm_ ...
- SpringBoot+logback实现按业务输出日志到不同的文件
公司有个项目,需要和几个第三方系统对接.这种项目,日志一定要记录详细,不然出了问题就是各种甩锅.虽然项目里面和第三方系统对接相关的业务记录的日志很详细,但是由于整个项目的日志都在一个文件中,排 ...
- python基础-面向对象编程之多态
面向对象编程之多态以及继承.抽象类和鸭子类型三种表现形式 多态 定义:同一种类型的事物,不同的形态 作用: 多态也称之为"多态性".用于在不知道对象具体类型的情况下,统一对象调用方 ...
- 生成Uuid工具类
package com.freeter.util; import java.util.UUID; /** * @author liuqi * **/public class Uuid{ public ...
- Elasticsearch 在 7.X版本中去除type的概念
背景说明 Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎.无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进.性能最好的.功能最全的搜索引擎库. El ...
- docker在linux上的安装
docker安装在liunx环境上,我电脑用的是ubuntu系统的,需要下载对应系统的docker,我下载的是社区版,对着官方的命令敲就好了, 地址是:https://docs.docker.com/ ...