基于OPENCV的相机标定

  • Post author:
  • Post category:其他



一、坐标系转换


摄像机标定(Camera calibration)简单来说是从世界坐标系换到图像坐标系的过程,也就是求最终的投影矩阵的过程。

【1】基本的坐标系:

世界坐标系;

相机坐标系;

成像平面坐标系;

像素坐标系

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

第一步是从世界坐标系转为相机坐标系,这一步是三维点到三维点的转换,包括R,t(相机外参,确定了相机在某个三维空间中的位置和朝向)等参数;

第二步是从相机坐标系转为成像平面坐标系(像素坐标系),这一步是三维点到二维点的转换,包括K(相机内参,是对相机物理特性的近似)等参数;

投影矩阵 : P=K [ R | t ] 是一个3×4矩阵,混合了内参和外参而成。

坐标系转换


二、相机模型


是一个小孔成像的模型,其中:

[1]O点表示camera centre,即相机的中心点,也是相机坐标系的中心点;

[2]z轴表示principal axis,即相机的主轴;

[3]q点所在的平面表示image plane,即相机的像平面,也就是图片坐标系所在的二维平面;

[4]O1点表示principal point,即主点,主轴与像平面相交的点;

[5]O点到O1点的距离,也就是右边图中的f,即相机的焦距;

[6]像平面上的x和y坐标轴是与相机坐标系上的X和Y坐标轴互相平行的;

[7]相机坐标系是以X,Y,Z(大写)三个轴组成的且原点在O点,度量值为米(m);

[8]像平面坐标系是以x,y(小写)两个轴组成的且原点在O1点,度量值为米(m);

[9]像素坐标系一般指图片相对坐标系,在这里可以认为和像平面坐标系在一个平面上,不过原点是在图片的角上,而且度量值为像素的个数(pixel);

在这里插入图片描述

2、相机坐标系→成像平面坐标系

[1]以O点为原点建立摄像机坐标系。点Q(X,Y,Z)为摄像机坐标系空间中的一点,该点被光线投影到图像平面上的q(x,y,f)点。

图像平面与光轴z轴垂直,和投影中心距离为f (f是相机的焦距)。按照三角比例关系可以得出:

x/f = X/Z y/f = Y/Z ,即 x = fX/Z y = fY/Z

以上将坐标为(X,Y,Z)的Q点映射到投影平面上坐标为(x,y)的q点的过程称作投影变换。

上述Q点到q点的变换关系用3*3的矩阵可表示为:q = MQ ,其中

在这里插入图片描述

最终得出透视投影变换矩阵为:

在这里插入图片描述
(1)

M称为摄像机的内参数矩阵,单位均为物理尺寸。

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

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

通过上面,可以把相机坐标系转换到像图像坐标系的物理单位[即(X,Y,Z)→(x,y)]

3、成像平面坐标系→像素坐标系

通过下面,可以把像平面坐标系物理单位到像素单位[即→(u,v)]

以图像平面的左上角或左下角为原点建立坐标系。假设像平面坐标系原点位于图像左下角,水平向右为u轴,垂直向上为v轴,均以像素为单位。

以图像平面与光轴的交点O1 为原点建立坐标系,水平向右为x轴,垂直向上为y轴。原点O1一般位于图像中心处,O1在以像素为单位的图像坐标系中的坐标为(u0, v0)。

像平面坐标系和像素坐标系虽然在同一个平面上,但是原点并不是同一个。

在这里插入图片描述

设每个像素的物理尺寸大小为 dx * dy (mm) ( 由于单个像素点投影在图像平面上是矩形而不是正方形,因此可能dx != dy),

图像平面上某点在成像平面坐标系中的坐标为(x, y),在像素坐标系中的坐标为(u, v),则二者满足如下关系:[即(x, y)→(u, v)]

u = x / dx + u0 v = y / dy + v0

用齐次坐标与矩阵形式表示为:

在这里插入图片描述

将等式两边都乘以点Q(X,Y,Z)坐标中的Z可得:

在这里插入图片描述

将摄像机坐标系中的(1)式代入上式可得:

在这里插入图片描述

则右边第一个矩阵和第二个矩阵的乘积亦为摄像机的内参数矩阵(单位为像素),相乘后可得:

在这里插入图片描述

和(1)式相比,此内参数矩阵中f/dx, f/dy, cx/dx+u0, cy/dy+v0 的单位均为像素。令内参数矩阵为K,则上式可写成:

在这里插入图片描述


三.相机内参K(与棋盘所在空间的3D几何相关)

在计算机视觉中,摄像机内参数矩阵

其中 f 为摄像机的焦距,单位一般是mm;dx,dy 为像元尺寸;u0,v0 为图像中心。

fx = f/dx, fy = f/dy,分别称为x轴和y轴上的归一化焦距.

为更好的理解,举个实例:

现以NiKon D700相机为例进行求解其内参数矩阵:

在这里插入图片描述

就算大家身边没有这款相机也无所谓,可以在网上百度一下,很方便的就知道其一些参数——

焦距 f = 35mm 最高分辨率:4256×2832 传感器尺寸:36.0×23.9 mm

根据以上定义可以有:

u0= 4256/2 = 2128 v0= 2832/2 = 1416 dx = 36.0/4256 dy = 23.9/2832

fx = f/dx = 4137.8 fy = f/dy = 4147.3

分辨率可以从显示分辨率与图像分辨率两个方向来分类。

[1]显示分辨率(屏幕分辨率)是屏幕图像的精密度,是指显示器所能显示的像素有多少。由于屏幕上的点、线和面都是由像素组成的,

显示器可显示的像素越多,画面就越精细,同样的屏幕区域内能显示的信息也越多,所以分辨率是个非常重要的性能指标之一。

可以把整个图像想象成是一个大型的棋盘,而分辨率的表示方式就是所有经线和纬线交叉点的数目。

显示分辨率一定的情况下,显示屏越小图像越清晰,反之,显示屏大小固定时,显示分辨率越高图像越清晰。

[2]图像分辨率则是单位英寸中所包含的像素点数,其定义更趋近于分辨率本身的定义。


四.畸变参数(与点集如何畸变的2D几何相关。)


采用理想针孔模型,由于通过针孔的光线少,摄像机曝光太慢,在实际使用中均采用透镜,可以使图像生成迅速,但代价是引入了畸变。

有两种畸变对投影图像影响较大: 径向畸变和切向畸变。

1、径向畸变

对某些透镜,光线在远离透镜中心的地方比靠近中心的地方更加弯曲,产生“筒形”或“鱼眼”现象,称为径向畸变。

一般来讲,成像仪中心的径向畸变为0,越向边缘移动,畸变越严重。不过径向畸变可以通过下面的泰勒级数展开式来校正:

xcorrected = x(1+k1r2+k2r4+k3r6)

ycorrected = y(1+k1r2+k2r4+k3r6)

这里(x, y)是畸变点在成像仪上的原始位置,r为该点距离成像仪中心的距离,(xcorrected ,ycorrected )是校正后的新位置。

对于一般的摄像机校正,通常使用泰勒级数中的前两项k1和k2就够了;对畸变很大的摄像机,比如鱼眼透镜,可以使用第三径向畸变项k3

2、切向畸变

当成像仪被粘贴在摄像机的时候,会存在一定的误差,使得图像平面和透镜不完全平行,从而产生切向畸变。也就是说,如果一个矩形被投影到成像仪上时,

可能会变成一个梯形。切向畸变可以通过如下公式来校正:

xcorrected = x + [ 2p1y + p2 (r2 + 2×2) ]

ycorrected = y + [ 2p2x + p1 (r2 + 2y2) ]

这里(x, y)是畸变点在成像仪上的原始位置,r为该点距离成像仪中心的距离,(xcorrected ,ycorrected )是校正后的新位置。


五.摄像机的外参数


旋转向量(大小为1×3的矢量或旋转矩阵3×3)和平移向量(tx,ty,tz)。

旋转向量:旋转向量是旋转矩阵紧凑的变现形式,旋转向量为1×3的行矢量。

在这里插入图片描述

r就是旋转向量,旋转向量的方向是旋转轴 ,旋转向量的模为围绕旋转轴旋转的角度。

通过上面的公式,我们就可以求解出旋转矩阵R。同样的已知旋转矩阵,我们也可以通过下面的公式求解得到旋转向量:

在这里插入图片描述


六、OPENCV中的相机标定函数


在OpenCV中我们使用张正友相机标定法通过10幅不同角度的棋盘图像来标定相机获得相机内参和畸变系数。函数为calibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix, distCoeffs, rvecs, tvecs,flag)

objectPoints: 一组世界坐标系中的3D

imagePoints: 超过10张图片的角点集合

imageSize: 每张图片的大小

cameraMatrix: 内参矩阵

distCoeffs: 畸变矩阵(默认获得5个即便参数k1,k2,p1,p2,k3,可修改)

rvecs: 外参:旋转向量

tvecs: 外参:平移向量

flag: 标定时的一些选项:

CV_CALIB_USE_INTRINSIC_GUESS:使用该参数时,在cameraMatrix矩阵中应该有fx,fy,u0,v0的估计值。否则的话,将初始化(u0,v0)图像的中心点,使用最小二乘估算出fx,fy。

CV_CALIB_FIX_PRINCIPAL_POINT:在进行优化时会固定光轴点。当CV_CALIB_USE_INTRINSIC_GUESS参数被设置,光轴点将保持在中心或者某个输入的值。

CV_CALIB_FIX_ASPECT_RATIO:固定fx/fy的比值,只将fy作为可变量,进行优化计算。当CV_CALIB_USE_INTRINSIC_GUESS没有被设置,fx和fy将会被忽略。只有fx/fy的比值在计算中会被用到。

CV_CALIB_ZERO_TANGENT_DIST:设定切向畸变参数(p1,p2)为零。

CV_CALIB_FIX_K1,…,CV_CALIB_FIX_K6:对应的径向畸变在优化中保持不变。

CV_CALIB_RATIONAL_MODEL:计算k4,k5,k6三个畸变参数。如果没有设置,则只计算其它5个畸变参数。



版权声明:本文为qq_34839823原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。