相机标定理论及matlab实现

1. 相机标定

相机标定主要是通过相机模型建立起目标物体的三维空间坐标和二维图像坐标之间的转换关系,是实现计算机视觉的基础。本文主要介绍相机标定技术及其原理,从而求出相机的内部参数,实现相机标定。

1.1 坐标系定义及转换

为了介绍相机标定技术及原理,定量地描述相机成像过程,需要引入四种坐标系,而相机标定的实质即是求解各个坐标系之间的转换关系。

  1. 像素坐标系
    相机采集到的图像通过模数转换和离散采样之后得到数字图像。每一幅数字图像实际上是一个M×N的数组,M行N列中的元素即为像素,像素值的大小代表灰度图像在该点的灰度值。像素坐标系如图所示,其坐标原点O0位于成像平面的左上角,横轴和竖轴定义为u和v,单位为像素。
    在这里插入图片描述

  2. 图像坐标系
    图像坐标系如图所示,其原点建立在相机光轴和成像平面的交点上,该点一般是图像的中心点。图像坐标系的x轴和y轴与像素坐标系的u轴和v轴平行,该坐标系以毫米作为单位。
    在这里插入图片描述
    假设图像坐标系的原点O1在像素坐标系中的坐标为(u0,v0),每个像素在x轴和y轴上的物理尺寸分别为dx和dy,则对于图像中的任一像素点的图像坐标和像素坐标的关系如下:
    在这里插入图片描述
    为了使用方便,采用齐次坐标与矩阵形式把上式表示为:
    在这里插入图片描述

  3. 相机坐标系
    相机坐标系如图所示,该坐标系是以相机透镜中心点Oc为原点建立的三维坐标系,横竖轴Xc和Yc分别与图像坐标系的x轴和y轴平行,Zc轴重合于光轴且垂直于成像面,透镜中心点到成像平面之间的距离Oc O1为相机的焦距f。
    在这里插入图片描述

  4. 世界坐标系
    世界坐标系是空间里的参照基准坐标系,其原点的选取是任意的,主要用来描述相机以及周围环境的位置信息。
    在这里插入图片描述
    世界坐标系Ow-XwYwZw如图2.4所示,可以用旋转和平移来描述世界坐标系和相机坐标系的一一对应关系。对于世界坐标系中的任意一点P(Xw,Yw,Zw),该点在相机坐标系下的坐标为(Xc,Yc,Zc),则世界坐标系和相机坐标系之间的转换关系可以表示为:
    在这里插入图片描述
    其中R为3×3的旋转矩阵,有三个独立变量,包含相机坐标系绕世界坐标系的三个坐标轴旋转的方向余弦;t为平移向量,代表沿着世界坐标系的三个坐标轴方向平移,也有三个独立的变量。将点P用齐次坐标表示,则世界坐标系和相机坐标系之间的转换关系为:
    在这里插入图片描述
    因此可以用矩阵M1来表示世界坐标系和相机坐标系之间的转换,矩阵M1称为相机的外部参数矩阵。

1.2 相机模型

相机模型分为线性和非线性两种模型。线性模型不考虑镜头畸变,是一种理想化模型,又称小孔成像模型,由于这种模型原理简单、计算方便,常作为相机标定原理介绍的模型。本文主要通过相机线性模型介绍相机标定原理,相机线性模型如图所示。
在这里插入图片描述
对于空间中的任一点P,它在相机坐标系下的坐标为(Xc,Yc,Zc),在图像上的投影点为p,坐标为(x,y)。则根据比例关系可以得到:
在这里插入图片描述
其中f为相机的焦距。为了方便后续数学公式的推导,可以将上式改写成矩阵形式为:
在这里插入图片描述
将以上公式整理,可以得出像素坐标系与世界坐标系的转换关系如下:在这里插入图片描述
其中,αx=f/dx,αy=f/dy,分别为u轴和v轴的尺度因子;M1为3×4矩阵,它包括αxy,u0和v0,由于这些参数只和相机内部结构有关,所以M1被称为相机内参矩阵。M2代表相机相对于世界坐标系的位置姿态,所以被称为相机外参矩阵。

1.3 张正有相机标定

通过相机标定技术可以求出相机的内部参数和外部参数,进而可以得到目标物体在三维空间和对应的二维图像之间的转换关系。而对相机进行标定最常见的方法就是微软学院张正有教授提出的棋盘格相机标定法。该方法利用三幅及以上的不同姿态的标定板上的角点信息和其对应的世界坐标位置信息来计算出相机成像平面和标定板平面之间的单应性关系,进而可以求解出相机的未知参数,从而完成相机的标定。有关张正有相机标定过程的推导网上有很多推导过程,也可以参考张正有论文原文。
本文只给出简单的理论推导。

张正有相机标定法的巧妙之处在于其假设标定物的平面位于世界坐标系ZW=0的平面上,且将外参矩阵写成列的形式,所以相机像素坐标系和世界坐标系之间的转换关系可以表示为:
在这里插入图片描述
令H=[r1 r2 t],H被称作单应性矩阵,且定义H=[h1 h2 h3],H用来描述世界坐标平面到相机成像平面的投影映射关系,则
在这里插入图片描述
由于r1和r2是单位正交矩阵,所以有r1^T r2=0,并且r1和r2的模为1,可以得到
在这里插入图片描述
利用上式作为约束,每一张标定板图像可以对相机内参提供两个约束,则通过相机获取至少三张标定板的图像,可以求出相机内部参数。
相机在不同的位置拍摄标定板对应不同的相机外部参数,利用上文的单应性矩阵H和已经求出的相机内参矩阵M1,利用下式及可求出相机的外部参数。
在这里插入图片描述

2. matlab实现相机标定

matlab为我们提供了很成熟的图像处理工具箱,当然也包括相机标定APP,这类似于黑箱,使得我们对相机标定不需要重新编写代码,省去了很多时间。

  1. 首先我们需要准备标准的棋盘格,打印出来贴到平面上。
    在这里插入图片描述
  2. 图像采集,固定相机焦距,多次移动相机并拍摄标定板,拍摄10张以上的图像用于标定实验,本文拍摄了12张图片来做演示。
    在这里插入图片描述
  3. 打开matlab-APP中的Camera Calibrator
    在这里插入图片描述
  4. 显示页面如图所示,点击Add Images添加待标定相机采集到的棋盘格图片,并输入每个棋盘格的实际尺寸,本文打印出的棋盘格每个方格尺寸为16cm。
    在这里插入图片描述
    导入之后进行角点提取,结果如图所示。
    在这里插入图片描述
  5. 相机标定,点击Calibrate来对相机进行标定,可以删除像素误差较大的图片进而来获取更准确的相机内部参数。
    在这里插入图片描述
  6. 点击Export Camera Parameters导出相机参数,在matlab命令行可以查看相机的内外参。
    在这里插入图片描述

至此,我们已经介绍了四种坐标系(像素坐标系、图像坐标系、相机坐标系和世界坐标系)之间的转换关系、相机模型、张正有相机标定法和通过matlab工具箱实现相机标定。
利用相机标定的结果,可以相机采集到的图像进一步做处理。

  • 13
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
matlab 相机标定代码 摄像机标定(Camera calibration)简单来说是从世界坐标系换到图像坐标系的过程,也就是求最终的投影矩阵的过程。 [1]基本的坐标系: 世界坐标系; 相机坐标系; 成像平面坐标系; 像素坐标系 [2]一般来说,标定的过程分为两个部分: 第一步是从世界坐标系转为相机坐标系,这一步是三维点到三维点的转换,包括R,t(相机外参,确定了相机在某个三维空间中的位置和朝向)等参数; 第二部是从相机坐标系转为成像平面坐标系(像素坐标系),这一步是三维点到二维点的转换,包括K(相机内参,是对相机物理特性的近似)等参数; 投影矩阵 : P=K [ R | t ] 是一个3×4矩阵,混合了内参和外参而成。 P=K[Rt] 二.基本知识介绍及 1、摄像机模型 Pinhole Camera模型如下图所示: 摄像机模型与标定 - 小企鹅 - 企鹅的博客 是一个小孔成像的模型,其中: [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 以图像平面的左上角或左下角为原点建立坐标系。假设像平面坐标系原点位于图像左下角,水平向右为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)式代入上式可得: 则右边第一个矩阵和第二个矩阵的乘积亦为摄像机的内参数矩阵(单位为像素),相乘后可得: (2) 和(1)式相比,此内参数矩阵中f/dx, f/dy, cx/dx+u0, cy/dy+v0 的单位均为像素。令内参数矩阵为K,则上式可写成: 摄像机模型与标定 - 小企鹅 - 企鹅的博客 (3) 三.相机内参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 + 2x2) ] ycorrected = y + [ 2p2x + p1 (r2 + 2y2) ] 这里(x, y)是畸变点在成像仪上的原始位置,r为该点距离成像仪中心的距离,(xcorrected ,ycorrected )是校正后的新位置。 五.摄像机的外参数 旋转向量(大小为1×3的矢量或旋转矩阵3×3)和平移向量(tx,ty,tz)。 旋转向量:旋转向量是旋转矩阵紧凑的变现形式,旋转向量为1×3的行矢量。 r就是旋转向量,旋转向量的方向是旋转轴 ,旋转向量的模为围绕旋转轴旋转的角度。 通过上面的公式,我们就可以求解出旋转矩阵R。同样的已知旋转矩阵,我们也可以通过下面的公式求解得到旋转向量: 。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值