其他分享
首页 > 其他分享> > [摘抄]相机标定(内参/外参)概要

[摘抄]相机标定(内参/外参)概要

作者:互联网

简介

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

基本的坐标系:

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

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

坐标系介绍

相机到图片

如上图所示(图片来自UIUC计算机视觉课件),是一个小孔成像的模型,其中:

相机 转换到 像平面

知道上面的简单知识后,如果知道相机坐标系中的一个点 XX(现实三维世界中的点),在像平面坐标系对应的点是 xx,要求求从相机坐标系转为像平面坐标系的转换,也就是从 XX 点的(X,Y,Z)(X,Y,Z)通过一定的转换变为 xx 点的(x,y)(x,y)。注意:(X,Y,Z)(X,Y,Z)(大写)是在相机坐标系,而(x,y)(x,y)(小写)是在像平面坐标系(还不是图像坐标系,原点不同。)观察第二个图,很简单的可以得到这个转换: 

x=fX/Z

y=fY/Zy

(X,Y,Z)↦(fX/Z,fY/Z)

加入偏移量

通过上面,可以把相机坐标系转换到像平面坐标系,但是像平面坐标系和图像坐标系虽然在同一个平面上,但是原点并不是同一个,而目标是要转换到图像坐标系下,所以还需要一步操作,如下图:

这里写图片描述

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

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

整理后可以得到 K,也就是平时所说的相机内参(Intrinsic parameters): 

K=\begin{bmatrix} f & &p_x\\ & f & p_y\\ & & 1 \end{bmatrix}

f为焦距,即相机镜头光心到成像平面的距离。

像素坐标

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

可能有人奇怪为啥不是一个值,还需要分别指定 mxmx 和 mymy 呀,这是因为通过上面可以得到一个像素点的大小(m度量)为: 

\frac{1}{m_x{}}\times \frac{1}{m_y{}}

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

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

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

坐标系介绍

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

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

世界 转换到 相机

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

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

世界 转换到 图像

根据上面的讨论知道了怎样从世界坐标系转换到相机坐标系(平移和旋转)以及从相机坐标系转换到图像坐标系(相机内参变换),所以带入上面的矩阵计算,可以得到: 

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

这样就得到了最终的投影矩阵 PP : 

P=K[Rt]

其中: 

t=−RC~

 

在这里,KK 一般称为相机内参(intrinsic parameters),描述了相机的内部参数,包括焦距 ff、主点 pp 的位置、以及像素与真实环境的大小比例等,这个是固有属性,是提供好的;RR 和 tt 称为相机外参(extrinsic parameters),RR 在这里是旋转矩阵,可以转换为三维的旋转向量,分别表示绕xx,yy,zz 三个轴的旋转角度,tt 目前就是一个平移向量,分别表示在xx,yy,zz 三个方向上的平移量。

畸变参数(distortion parameters)

在几何光学和阴极射线管(CRT)显示中,畸变(distortion) 是对直线投影(rectilinear projection)的一种偏移。简单来说直线投影是场景内的一条直线投影到图片上也保持为一条直线。那畸变简单来说就是一条直线投影到图片上不能保持为一条直线了,这是一种光学畸变(optical aberration)。可能由于摄像机镜头的原因,这里不讨论,有兴趣的可以查阅光学畸变的相关的资料。 
畸变一般可以分为两大类,包括径向畸变和切向畸变。主要的一般径向畸变有时也会有轻微的切向畸变。

径向畸变(Radial distortion

径向畸变的效应有三种,一种是桶形畸变(barrel distortion),另一种是枕形畸变(pincushion distortion),还有一种是两种的结合叫做胡子畸变(mustache distortion),从图片中可以很容易看出区别,具体见下图(图片来自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]

其中:

所以最终得到5个畸变参数: 

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

 

相机标定

那么可以利用这些来进行最终的任务相机标定,简单的过程可以描述为通过标定板,如下图,可以得到n个对应的世界坐标三维点 XiXi 和对应的图像坐标二维点 xixi,这些三维点到二维点的转换都可以通过上面提到的相机内参 KK,相机外参 RR和 tt,以及畸变参数 DD 经过一系列的矩阵变换得到。现在就用这些对应关系来求解这些相机参数。最后就是用线性方法求解方程式,这里就不做讨论了。

那为什么要做相机标定呢? 
每个镜头的畸变程度各不相同,通过相机标定可以校正这种镜头畸变。其实可以认为用这种标定的方式来求解相机内参和畸变参数,相当于一种相机校准,然后这些参数就可以用于后面的求解。例如求解新拍的两幅图片相对的 RR 和 tt,求解这个外参用到就是标定得到的相机内参和畸变参数。

齐次坐标 
就是将一个原本是n维的向量用一个n+1维向量来表示。 
许多图形应用涉及到几何变换,主要包括平移、旋转、缩放。以矩阵表达式来计算这些变换时,平移是矩阵相加,旋转和缩放则是矩阵相乘,综合起来可以表示为 x=R∗X+tx=R∗X+t(注:因为习惯的原因,实际使用时一般使用变化矩阵左乘向量)(RR 旋转缩放矩阵,tt 为平移矩阵,XX 为原向量,xx 为变换后的向量)。引入齐次坐标的目的主要是合并矩阵运算中的乘法和加法,表示为 x=P∗Xx=P∗X 的形式。即它提供了用矩阵运算把二维、三维甚至高维空间中的一个点集从一个坐标系变换到另一个坐标系的有效方法。和上面的计算过程是对应的。

       

相机内参详解

以下是一些个人在工作中对相机内参的学习和理解
首先要了解一下数码相机的大致成像原理
1.光聚焦在CCD或CMOS上。

2.CCD或CMOS完成光/电转换。

3.A/D将模拟信号转换成数字信号。

4.最后由DSP将数字信号转换成数码图像
在这里插入图片描述
这里引用《SLAM十四讲》中的图片,图中物理成像平面可以等同于上面所说的CCD或者CMOS

根据相似三角形关系可以得到:
在这里插入图片描述
根据相似三角形关系,我们可以将物体所成的像对称到相机前方(实际相机中是由相机内部软件对成像进行倒立像的调节使得我们最后得到正立的像)
在这里插入图片描述
在左右两边都为 f 的情况下可以得到等大的图像
则上述公式变为:
在这里插入图片描述
根据公式可以知道 归一化成像平面是怎么定义的,根据对称得到的虚像
左边除以 f 右边除以 f,最后右边在Z=1的平面上,左边在f=1的平面得到的图像
将公式整理可得:
在这里插入图片描述
则这个公式表示:
归一化坐标点,[X/Z,Y/Z,1] 即在Z=1的平面上所成的像和[ X’/f , Y’/f , 1] 即在f=1的成像平面上所得到的像,离开光轴(即原点,Z轴)的距离是相同的,再这个基础上再乘 f 即可得到,[X, Y, Z]在焦距为f的成像平面上所成的像离开光轴的距离(即成像大小)

所以一般想通过相机坐标得到图像坐标,首先会将相机坐标归一化
经过了这个变换,我们就将相机坐标系的坐标(归一化),投影到了成像平面上。
但是投影到成像平面上之后,在成像平面上的图像的单位还依旧是长度单位
最后变成我们的像素图像以像素为单位
那么成像平面到像素平面还会有一层转换关系,
这一层转换关系 就是我们所说的 相机内参:
在这里插入图片描述
此时我们需要将 长度单位 转换为 以像素为单位的像素坐标,这个转换主要由相机内参中的fx与fy来进行确定

物理成像平面其实是由一个个像素单元组成的,每个像素单元就会有 大小,
即这个小单元格像素的宽高,所以 像素单元 的单位是 微米/像素(米,毫米单位并不固定)
举个例子:
通过投影到成像平面上时
整个图像长5376μm 宽为 3024μm
最后显示在1280*720的图像内 那么每个 物理成像平面每个像素单元的
宽度为 5376/1280 为4.2μm
高度为 3024/720 为4.2 μm
此时像素单元 是正方形的, 此时为 4.2 单位是 μm/像素(若像素单元不是正方形则fx和fy就不同了,所以会存在fx和fy因为大部分都不会是正方形)

根据 opencv中 对于内参 fx与fy的定义:(f是焦距,引用于《学习opencv》–P409)
fx = fsx
fy = f
sy
sx的单位是像素/毫米 就是我们上面求得 像素单元size的倒数

转换一下 可以得到 1/4.2 = 0.238095 像素/μm
(到这基本可以明白如何通过长度转换为像素了)
这里有个疑问 为什么 fx的定义是 fx = f*sx ?

举个例子:
假设现在我们有一个世界坐标(相机坐标系) P = [X,Y,Z]
根据小孔成像公式
在这里插入图片描述
我们得到坐标 X’ = fX/Z Y’ = fY/Z (成像平面坐标)
但是实际使用矩阵乘法中我们是这样用
假设内参矩阵时K :在这里插入图片描述
由opencv的定义 fx = f*sx f是焦距 sx单位是像素/μm

那么这个点转换到像素坐标的为:

Px = K * (P/Z) 即先归一化在左乘内参矩阵
将乘法分解开来
可以得到 Px = fx*(X/Z) + cx (这里CX是光心 暂不做解释)
Px = fsx (X/Z) +cx
Px = f
sx * (X/Z) = f
(X/Z) * sx +cx

所以为什么相机内参会定义为 f*sx就是这个原因
因为坐标在一开始就除以Z进行归一化了
按照小孔成像公式应该乘f 只不过在opencv中将f移到了内参来进行表达 所以fx和fy的本质是 :
将世界坐标归一化后的在成像平面上的像(长度单位) 转换为像素平面上的像素(像素单位)

fx的物理意义: 因为fx 其实 是 f*sx ,sx是像素/μm(该单位并不固定) 加上f之后就变成像素,所以fx的物理意义是 :
在焦距为 f 的成像平面上,每 f 的长度表示多少个像素
最后说明一下CX和CY
在这里插入图片描述
在这个图上可以看到,物理成像平面的中心在光轴上,所以一般在成像平面的中心,但我们最后得到的图像面试以左上角为原点的像素图像,所以CX和CY其实是将物理成像平面的原点,做了一个偏移,将以光轴点为原点转换到以左上角为原点。

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/cjh666/article/details/106326257  

标签:外参,成像,标定,摘抄,像素,相机,畸变,平面,坐标系
来源: https://www.cnblogs.com/fantasyzzz/p/15213328.html