图像处理中消除相机透镜畸变和视角变换


一般的针孔相机模型如下:

三维坐标点经过透视投影变换,转换到一个图像平面坐标点。


而相机透镜还存在一定的畸变,包括横向畸变和切向畸变。

 

因此,针孔相机模型又被扩展为以下模型:


首先,世界坐标被转换为相机坐标,由X,Y,Z到x,y,z;

然后,归一化,z=1处,x,y的投影坐标x`,y`;

接下来,对投影坐标,进行畸变处理;

最后,由相机坐标转换到图像坐标。

 

在使用广角镜头或鱼眼相机时,原始图像存在畸变比较严重。

在图像识别的很多应用场景中,消除图像的畸变是图像预处理的首要问题。

通过相机标定,很容易拿到相机的内部参数,包括焦距、光心和畸变系数。


以上过程,就是透镜畸变前后图像坐标变换的公式。具体步骤如下:

1. 由图像坐标系反变换到相机坐标系中

2.  然后,校正反变换R-1,一般无校正变换的相机,默认为单位矩阵

3. 归一化,并进行相机透镜畸变处理

4. 由相机坐标转换到图像坐标。

由此,得到由针孔模型到透镜畸变畸变模型相互变换的对应关系u <--> mapx, v <--> mapy

initUndistortRectifyMap函数就是完成了以上工作。

 opencv中,remap与undistortion都是消除畸变的函数,undistortion在设置了一些参数后调用了remap函数,二者的算法实质是一样的。由目标图像的坐标,找到对应的原始图像坐标,然后将其值复制到目标图像。大致思路是如此,由于图像大小和变换,需要插值或近似的方法,如最邻近法、线性插值等

 

图像视角变换

如图像由前向视角frontview转换为俯视角birdview。

一般来讲,相机向下倾斜时,相机前向视角frontview的视角范围比较大,而俯视birdview需要的视角比较小(涉及地面的视角部分)。

 

针孔模型下,在前向视角图像中,截取涉及地面的部分,并通过透视变换,转换为俯视视角。地面的一个矩形区域,在前向视图中会大致是一个三角形或梯形的形状,而在俯视图中,仍是一个矩形图像,且能保留线性、平行性特征。

 

如下,一个前向广角视图,转换为俯视图。

前向视图:


俯视图:

 

转换方法:

首先,通过标定获取相机的外部参数,世界坐标系中相机的位置Position和倾角(相对于x,y,z坐标轴的角度),即M=R|t。并假定地面的z坐标为z=0.

然后,获取俯视图内的三维地面坐标。z=0,地面区域的实际大小与俯视图的大小成一定比例,即俯视图中一个像素的位置(u`,v`),在地面坐标上,也有对应的位置(x`, y`, 0) = (u`*spaceSolution, v`*spaceSolution, 0).spaceSolution是空间像素的大小,如一个像素的高和宽是0.05米。

然后,由上面第二块公式,通过位置变换,畸变计算,和相机参数变换,三个步骤,将每个地面位置坐标(x`,y`, 0)转换为前向视图中的坐标(u, v)。

此时,前向畸变视图像与俯视图像有一个对应关系(u,v) <--> (u`,v`)。


双目相机的畸变校正以及平行校正(极线校正)的入门问题总结

分类: 相机标定_matlab  |  标签: 相机标定,极线校正,畸变校正,坐标系转换  |  作者: wangxiaokun671903 相关  |  发布日期 : 2014-08-21  |  热度 : 1226°


做相机标定对于刚入手的人来说有很多疑惑的点,我总结个人的入手的方法和需要弄明白的问题:

一、相机标定是干什么的,需要什么器材才能做?双目校正目标是什么,又需要什么设备?


二、相机(针孔)模型是什么样的?世界坐标系,相机坐标系,图像物理坐标系,图像像素坐标系,这四个坐标系到底是什么?从世界坐标系到图像坐标系到底是怎么转换的?


三、Opencv中用到的相机标定函数,对应的算法具体是谁的,什么算法?获得的各矩阵数据的含义指的是什么?


四、获得单个相机的内参矩阵和畸变系数后,怎么对相机进行畸变校正?


五、分别获得两个相机的内参矩阵和畸变系数,以及两相机之间的相对旋转平移矩阵后。怎样进行双目平行校正?校正的结果和流程应该是怎样的?


这些问题如果搞清楚了,那么相机的畸变和平行校正的方法你一定也就明白了。


对于上述问题,我目前的理解如下:


     一、
相机标定就是要通过一定的方法对特定图像(棋盘格角点检测)计算出这个相机本身的一些参数,包扩:内参矩阵A,外参矩阵[R|T]、畸变系数[k1,k2,k3,~,p1,p2,~]内参矩阵各元素意义:一个像素的物理尺寸dxdy,焦距f,图像物理坐标的扭曲因子gama,图像原点的纵横偏移量cxcy外参矩阵:世界坐标系转换到相机坐标系的旋转R和平移T矩阵。畸变系数:包括相机的径向畸变系数k1,k2,k3,~和相机的切向畸变系数p1,p2,~需要的器材:一个黑白棋盘格的标定板,一个相机拍摄的不同角度或距离的棋盘格图像至少三张以上。


双目校正就是通过一定的方法将两个摄像头拍摄同一个物体的图像进行处理,使得两幅图像最终达到下面的目标,同一个物体在两幅图像中的大小一样,且水平在一条直线上。需要的设备:双目摄像头(即两个同规格的摄像头水平放置左右摄像头),拍摄同一个物理的左右图像对,需要已知左右相机的内参矩阵、畸变系数、右相机相对于左相机的旋转矩阵R(通过一定的方法可将此矩阵分解成两个矩阵R1R2,即左右相机各旋转一半达到水平)。


二、针孔相机的模型:三维世界中的物体,经过相机成像系统,变成二维图像过程如下所示。


世界坐标系:就是物体在真实世界中的坐标,比如黑白棋盘格的世界坐标系定在第一个棋盘格的顶点,Zw就是垂直于棋盘格的方向。可见世界坐标系是随着物体的大小和位置变化的,单位是长度单位。

相机坐标系:以光心为相机坐标系的原点,以平行于图像的x和y方向为Xc轴和Yc轴,Zc轴和光轴平行,Xc,Yc,Zc互相垂直,单位是长度单位。

图像物理坐标系:以主光轴和图像平面交点为坐标原点,x和y方向如图所示,单位是长度单位。

图像像素坐标系:以图像的顶点为坐标原点,u和v方向平行于x和y方向,单位是以像素计。


     从世界坐标系到图像坐标系
的转换过程如下:世界坐标系通过外参矩阵转换到相机坐标系,相机坐标系通过内参矩阵转换到图像像素坐标系(这一步是通过两步完成的,一,相机坐标系通过焦距对角矩阵和畸变系数转换到图像物理坐标系,二图像物理坐标系通过像素转换矩阵转换到像素坐标系中)。转换过程和公式如下(将在接下来的文章里详细说明):


      三、opencv标定中用到的重要函数和算法以及获取矩阵的含义

findChessboardCorners()用来发现棋盘格的角点位置,这里用的是haaris角点检测方法。cornerSubPix()角点位置精确到亚像素级。

stereoCalibrate()通过角点推算出两个相机的内参矩阵M1,M2和畸变系数D1,D2,当然外参矩阵随之也就计算出来了(在图像校正中还没有用到外参),这里用到的是张正友相机标定算法。

stereoRectify()根据内参矩阵和畸变系数计算右相机相对于左相机的旋转R和平移矩阵T,并将这个旋转和平移矩阵分解成左、右相机各旋转一半的旋转R1,R2和平移矩阵T1,T2,这里用到的是bouguet极线校正的方法。

initUndistortRectifyMap()和remap()对左右相机拍摄的图像进行校正(在今后的文章中将会详细介绍实现方法和步骤)。


       四、获取了内参矩阵和畸变系数对图像进行畸变校正时,就是解决图像的畸变问题(径向畸变是因为透镜本身工艺的问题,切向畸变是由于安装问题带来的)。畸变校正的过程是这样的,将源图像像素坐标系通过内参矩阵转化成相机坐标系(和图像物理坐标系比较多了缩放和Z轴),通过畸变系数校正图像的相机坐标,校正后通过内参矩阵将相机坐标系转换成图像像素坐标系,并根据源图像坐标的像素值赋值给新的图像坐标(用插值的方法,将在后面的文章中叙述)。


       五、双目平行校正,是针对图像对应的相机坐标系进行的,那么极线校正的时候应该注意就是在四中叙述的畸变校正过程中,在转换到相机坐标系后,左右图像对应的相机坐标系分别通过旋转矩阵R1和R2进行平行极线校正。步骤如下:将源图像像素坐标系通过内参矩阵转化成相机坐标系(和图像物理坐标系比较多了缩放和Z轴),通过旋转矩阵R1和R2进行平行极线校正,然后通过畸变系数校正图像的相机坐标,校正后通过内参矩阵将相机坐标系转换成图像像素坐标系,并根据源图像坐标的像素值赋值给新的图像坐标

 

通过对应关系,每个俯视图的像素都在前向畸变视图像中有对应的位置,两者的像素值相等(使用最邻近法或线性插值等)。俯视图前方的部分边缘模糊比较严重,这是在原图中采样范围小的原因。



你可能感兴趣的:(图像识别算法)