请推荐一本书,详细介绍摄像机标定原理和摄像机畸变的

(学习笔记)摄像机模型与标定——相机模型
我的图书馆
(学习笔记)摄像机模型与标定——相机模型
下面理解部分错误,过几天进行修改。
在计算机视觉中,我们就是利用相机模型将三维空间点与二维图像点联系起来的。在实际中,往往有数学模型来描述摄像机模型,摄像机模型有很多,但是一般分为针孔模型(线性模型)和非线性模型。
1、线性模型
可用针孔模型来近似表示任一点P(Xc,Yc,Zc)在像平面的投影位置,也就是说,任一点P(Xc,Yc,Zc)的投影点p(x,y)都是OP(即光心(投影中心)与点P(Xc,Yc,Zc)的连线)与像平面的交点如上一篇文章中的图2.2。对应比例关系可得:
(说明:Xc的c下表表示camera相机,上述公式是在相机坐标系内,利用三角形相似原理,即x/f=Xc/Z,其中上述公式的单位为毫米,f表示焦距单位毫米)
上式可以用齐次坐标与矩阵的形式表示为:
将上一篇文章中的(2.3)和(2.4)代入(2.6)式就可以得到点P的世界坐标与其投影坐标(u,v)之间的关系为:
(说明:上述公式中完成了从世界坐标系到图像坐标系的转变,中间经过了相机坐标系的过度,Xw中的w表示world世界,单位为毫米,而u,v是的 单位为像素,即完成了从毫米——像素的转换。)
其中ax=f/dx,ay=f/dy;M是3×4的矩阵—投影矩阵,M1完全由相机的内参数ax,ay,u0,v0决定,(u0,v0)为主点坐标,ax,ay分别表示图像u轴和v轴上的尺度因子,M2则完全由相机的外部参数决定。而相机标定就是确定相机的内外参数。
由式(2.7)可知,若已知相机的内外参数,则相当于已知投影矩阵M.当已知M和空间点P的坐标:矢量Xw=(Xw,Yw,Zw,1)T,(矢量Xw上面有一个矢量标识杠,T表示矢量的转置)。式(2.7)可以给出三个方程,消去Zc就可以得到其投影点p的坐标(u,v)(其实也就是我用一个相机就可以拍摄一个物体的图片了)。但是由于M为3×4不可逆矩阵,当 点P的投影坐标(u,v)和投影矩阵M为已知时,我们只能得到关于Xw,Yw,Zw的两个线性方程,即射线OP的方程,由上一篇图2.2我们可以看出,位于射线OP上的所有空间点的投影点(即图像点)都是p点。所以不能唯一确定空间点P的世界坐标矢量Xw.
所以,为了得到空间物体的三维世界坐标,就必须有两个或更多的相机构成立体视觉系统模型才能实现。
2、非线性相机模型
在实际的成像过程中,考虑镜头的失真,一般都存在非线性畸变,所以线性模型不能准确描述成像几何关系。非线性畸可用下列公式描述:
若考虑非线性畸变,则对相机标定时需要使用非线性优化算法。而有研究表明引入过多的非线性参入(如离心畸变和薄棱畸变)不仅不能提高精度,还会引起解的不稳定。一般情况下径向畸变就足以描述非线性畸变,所有本课题只是考虑径向畸变。则将式(2.9)中的径向畸变代入式(2.8)可得:
OpenCV中讲解:
从制作上讲,从制作一个”球形“透镜比制作一个数学上理想的透镜更容易。故产生了径向畸变。
从机械方面讲,也很难把透镜和成像仪保持平衡。故产生了切向畸变。
1、径向畸变
对径向畸变,成像仪中心(光学中心)是畸变为0,随着向边缘移动,畸变越来越严重。故我们可以用在r=0处的泰勒级数展开的前几项来定量描述。
对于便宜的网络摄像机,我们通常使用前两项,其中通常第一项为k1,而第二项为k2。对畸变很大的摄像机,比如鱼眼透镜,我们使用第三个径向畸变项k3。通常成像仪某点的径向位置按下式调节:
这里(x,y)是畸变点在成像仪上的原始位置,(xcorrected,ycorrected)表示矫正后的新位置。
2、切向畸变
切向畸变是由于透镜制造上的缺陷使得透镜本身与图像平面不平行而产生的。径向畸变可以有两个额外的参数p1和p2来描述,如下:
因此总共有5个我们需要的畸变参数。由于在OpenCV程序中5个参数是必需的,所以它们被放置到一个畸变向量中,这是一个5×1的矩阵,按顺序依次包含k1,k2,p1,p2和k3。
3、平行双目立体视觉模型
通过针孔成像模型的分析可知,为了由像点坐标唯一的确定世界三维坐标,就必须通过两个或者多个相机来共同完成。通过两个相隔一定距离的相机来实现对3D场景的成像,就是双目成像,也称为立体视觉成像。相机拍摄景物时,先把两部相机的光轴汇聚于感兴趣的物体上,则两个光轴的交点称为汇聚点,而该点到基线中心的距离称为汇聚距离。当汇聚的距离有限时,双目立体视觉系统统称为汇聚式双目立体视觉模型;当汇聚距离无线远时,双目立体视觉系统就被成为平行式双目立体视觉模型。本文研究的是平行双目立体视觉系统,下面着重介绍一下平行双目立体视觉模型。
如图2.3所示,当目标距离远远大于焦距时,可假定透镜中心与像平面的距离等于摄像机的焦距f(=OlCl=OrCr)。两光轴平行且距离(即基线)为2h。世界坐标系定义为OXYZ,左右图像平面都与相机平面XOY平行,其中Ol、Or分别为左图像与右图像的中心(即左右图像局部坐标系的原点,Xl,Xr分别表示左右相机局部坐标系的X轴),Cl和Cr分别为左右相机的光心,Z轴表示到摄像机(在Z=0处)的距离。X轴表示“水平”距离(Y轴朝负面而去,没有出现,即满足右手坐标准则)。X=0是右相机光心位置。光心即投影中心。
假设三维空间点P(X,Y,Z)的像在左、右两个像平面上的投影分别是Pl(xl,yl)和Pr(xr,yr)(其中xl,yl,xr,yr分别表示投影点在每个图像局部坐标系即2.1节所讲的图像坐标系O1xy中的坐标)。由小孔成像原理可知:P,Cl,Pl三点共线,则由三角相似,可得:
(这里我只是把内容以图片的形式贴出来,不在手写了,论文中下面部分存在是错误的)
下面内容摘自:西安工业大学 &基于双目立体视觉的图像匹配与三维重建 &张海波
5、基于双目立体视觉技术的三维重建
摄像机通过透视变换将物体的三维信息转换为二维图像,因为二维图像中的点与三维物体上的点可以通过某种对应关系相互转换,也就是说,可以从不同方向拍摄的同一空间点的两幅图像中的依据该对应关系反推出三维物体的立体空间位置。这就是双目立体视觉中三维信息获取的过程。两幅图像通过立体匹配可得到各特征点的视差信息,根据视差信息确定各点的深度信息,最终获得被测物体的三维信息。
5.1 双目立体视觉三维测量原理
如图5.1所示,两台摄像机的镜头中心或光学中心之间的距离称为双目视觉系统的基线B,利用双目视觉成像系统可以确定具有像平面坐标点(x1,y1)和(x2,y2)的三维空间点W的世界坐标。
1)两台摄像机相同且它们的摄像机坐标系统各对应轴精确平行(光轴平行)
图5.2给出了两台摄像机镜头连线所在平面(XZ平面)。将世界坐标系设置在第一台摄像机坐标系上,即世界坐标系和第一台摄像机的摄像机坐标系重合。
根据摄像机坐标系与世界坐标系重合情况下的透视变换公式,三维空间点W的X轴坐标表示为:
式中X1和Z1为三维空间点形在世界坐标系(此时世界坐标系与第一个摄像机坐标系重合)中的X轴和Z轴坐标。同理,如果将世界坐标系设置在第二台摄像机上,则W点在X轴的坐标可表示为:
因为基线长度是B且三维空间点W的Z轴坐标对两台摄像机坐标系统是一样的,所以有:
将式(5.3)带入式(5.1)和式(5.2),得
式(5.6)把三维空间点与像平面之间的距离Z,即三维信息中的深度信息,与视差D(三维点对应的像坐标x2和x1之差)直接联系起来。视差的大小直接与深度有关,所以视差包含了物体的三维空间信息。通过视差就可以求得三维空间点到摄像机的距离,确定三维空间点在世界坐标系中的坐标。
如果视差D可以确定并且已知两台摄像机之间的基线距离和摄像机的焦距,很容易计算出三维空间点W的Z轴坐标。另外Z轴坐标确定后点W的世界坐标X,Y轴坐标可用(x1,y1)和(x2,y2)借助透视变换得到,即:
这样,通过三维空间点在两台摄像机的成像视差,可求出空间点的三维坐标。因此,对于两台摄像机平面上的任意一点,只要能够在另一台摄像机平面上找到对应的匹配点(即两者是空间同一点在两台摄像机面上的像点),就可以通过视差确定出该点的三维空间点。
(说明:对于上述公式,我们如果设置相机1为参考世界坐标系,则空间三维点的计算通过X1,Y1的表达式进行计算,反之对于相机2也是同样的道理)。
个人理解部分:
在上图,我们选择左图像的中心O1为世界坐标原点。M表示世界坐标系中的一点,p1和p2表示该点经过透镜投影到画布上的位置。设p1点为(x1,y1),p2点为(x2,y2),(这里点p1和点p2均是在世界坐标系中的坐标,即相对于O1点的坐标,不要为上面的标号所迷糊,切记!因为我们下面的推导就是针对如此的)M点为(X,Y,Z)。我们知道OpenCV坐标系中图中R1和R2为图像平面的原点,即相当于p1,p2的参考点的同时变化。这里,我们知道两个图像分辨率是一样的,即两个图像的平面是一样的大小,我们应用的相似三角形的知识,故我们只需要确保在列出的比例关系中,能够保存长度是正的就可以了。
首先我们要证明一点,上图中直线O1p1和直线MO3是平行的,利用高中所学的知识:
我们知道了O1p1和MO3是平行的,那么就可以知道三角形O1p1D和三角形MO3A相似,又因为线段O1p1和线段MO3的比值等于线段p1C1和线段C1O3的比值,即等于f/Z-f。
从上图我们知道,点p1的x1,y1均小于0。我们现在要列出点p1和点p2的坐标,以及额外的已知参数与真实点M坐标之间的关系。由线段p1D=0-x1,线段O3A=X,那么我们就可以得到如下的一个公式:
同理我们对于点p1的y1坐标,也进行相似变换。即线段O1D=0-y1,线段MA=Y。那么我们可以得到如下的公式:
接下来我们要求解p2点的坐标x2,y2和M点坐标之间的关系,我们同样的利用三角形相似来找它们坐标之间的关系,我们同样可知道三角形O2p2E和三角形MO4A是相似的。
那么线段Ep2=x2-B,线段AO4=B-X,那么他们之间的比例还是满足f/Z-f,得到如下的公式:
总上所述,我们得到X,Y,Z坐标的计算公式:
为了方便下面的理解,我们附如下图:
我们知道上面的x1,y1,x2,y2的坐标均是针对世界坐标原点在O1处的情况,但是我们一般知道的是OpenCV图像中两个点的q1和q2的坐标,分别为(x11,y11),(x22,y22)。
我们就需要寻找x11,y11,x22,y22和x1,y1,x2,y2之间的关系。我们第一副图像大小为W*H,W表示OpenCV中X方向的长度,H表示OpenCV中Y方向的长度,那么点(W/2,H/2)就近似于图像的中间,即认为是世界坐标原点O1,由于分辨率相同,第二幅图像也有同样的大小。那么:
x1=x11-W/2;
y1=H/2-y11;
x2-x1=x22-x11+B
带入上述三个公式得:
那么我们,我们规定上述的f,x11,y11,B,单位均为像素,那么我们就可以得到M点以像素为单位的世界坐标,然后里面利用像素和毫米的关系可以得到真实的三维点的坐标,当然这里的坐标是有参考坐标系的。
再如,你或许可以在网上下载到下面的一篇文章:
上述文章中,打问号的部分应该是错误的,所谓的焦点就是光透过透镜汇聚的点就称为焦点。所以上述的三维世界原点的坐标应该是选了左相机的透镜中心,这样上述公式正好,和我上面推导的相吻合。即L和B是等价的,由于选择的参考系,沿着Z方向平移了f距离,所以我公式中的Z-f就是上图中的Z。还应注意上图中的z和Z是一样的,书写错误而已。我上面推导的计算Z的公式,我这里为了强调一下,我重新将其写下来:
我们这里的Z是图像平面中心到世界三维点的距离。然而我们经常看到如下的形式:
上述公式中的Z表示的是摄像机透镜中心到世界三维点的距离(也就是过三维点与相机平行的平面和相机平面,两个平面之间的距离)
,,这里我们约束f,B单位均为像素,x22,x11就是点在图像中的坐标,即OpenCV坐标系的下的坐标。如果我们想获取实际的距离,那么我们将像素转化为米制单位就好了。
OpenCV中的数学模型:
上述的数学模型是通过下面的模型获得的:
上图中,我们将图像平面关于针孔平面成镜像,因此OpenCV中的数学模型中的求解出来的Z,就是物体平面到针孔平面(透镜平面)之间的距离。
4、双目立体视觉三维测量数学模型
在计算机视觉中采用双目视觉方法进行三维重建,是指由两幅二维图像恢复物体三维几何形状的方法。三维测量和重建是紧随着摄像机标定之后关键的一步,可对视场中的点,线或曲线构成的轨迹或物体的轮廓进行定位和形状恢复。
如图5.4所示,对于空间物体表面任意一点P,如果用摄像机C1观察,它在摄像机C1的图像点为p1,但无法由p1知道P的三维位置。事实上,O1P连线上的任意一点的图像点都可认为是p1,因此通过p1的位置,只能确定出空间点位于O1P1连线上的某一位置,无法知道P点的深度,如果用C1,C2两台摄像机同时观察P点,并且在摄像机C1图像上点p1与在摄像机C2图像上点p2是空间同一点P的像点,则P点的位置是唯一确定的,为射线O1p1和O2p2上的交点。
假定已检测出p1和p2为空间点P在两台摄像机上对应的图像点。在两台摄像机都已标定的情况下,它们的投影矩阵分别为M1与M2,由摄像机模型
关于如何求解投影矩阵,OpenCV中有,下面给出一个截图,讲述了大题的操作步骤:
1、有时候感觉参考了几篇下载的论文,看一些原理,里面出现的错误,弄的自己稀里糊涂,后来发现Learning OpenCV书中自带的要详细,而且也不会出现错误,好比上面我们在关于利用几何变换来求解三维空间点时,OpenCV书中给出了一个很好的图:
上图摄像机坐标系以左摄像机的投影中心为原点。通过上图,我们可以很容易的找到三角形之间的相似关系,也可以在理想的情况下,通过相似关系来求解三维点的坐标。
喜欢该文的人也喜欢摄像机标定_图文_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
文档贡献者
北邮在线成立于2009年,是由北京邮电大学、...
评价文档:
暂无相关推荐文档
摄像机标定
大小:310.83KB
登录百度文库,专享文档复制特权,积分每天免费拿! 上传我的文档
 上传文档
 下载
 收藏
粉丝量:54
该文档贡献者很忙,什么也没留下。
 下载此文档
摄像机标定与畸变图像矫正算法的设计与实现
下载积分:1400
内容提示:摄像机标定与畸变图像矫正算法的设计与实现
文档格式:PDF|
浏览次数:126|
上传日期: 08:30:12|
文档星级:
全文阅读已结束,如果下载本文需要使用
 1400 积分
下载此文档
该用户还上传了这些文档
摄像机标定与畸变图像矫正算法的设计与实现
关注微信公众号posts - 86,&
comments - 37,&
trackbacks - 0
之前做过摄像机标定的研究,不过现在忘了好多,昨天下午又捡起来,好好复习一下(主要是学习opencv一书内容)。
摄像机标定基本知识:
摄像机标定误差包括内参(4个)、畸变参数(径向和切向共5个)、外参(平移和旋转共6个)。
误差参数分析:摄像机模型采用针孔模型成像模型,由于中心轴安装问题,这就造成了精度误差,就是所谓的相机内参数误差,使用一个3X3的矩阵表示(A) [fx 0 0 0 0 1].,有四个未知参数;另由于针孔成像采光效率不高,使用了透镜,这就造成的畸变误差:
径向畸变:这是由于透镜先天条件原因(透镜形状),成像仪中心(光学中心)的畸变为0,随着向边缘移动,畸变越厉害。这里有3个参数,k1,k2,k3其中k3是可选参数。
切向畸变:这是摄像机安装过程造成的,如当透镜不完全平行于图像平面的时候产生的。
旋转和平移主要针对外参数,旋转3个角度和平移3个方向6个参数。
棋盘就不介绍了。主要是提取角点,便于后面计算,opencv函数都有函数。书上p423有原理介绍,感兴趣的朋友可以参考书上内容。
opencv实现过程及主要函数介绍:
1.首先获得数据源(视频或图像),我读取的一段自己录的视频;
2.初始化单帧棋盘数据,如6X4,并对棋盘操作提取角点;
用到的函数说明:&
CVAPI(int) cvFindChessboardCorners( const void* image, CvSize pattern_size,
CvPoint2D32f* corners,
int* corner_count CV_DEFAULT(NULL),
int flags CV_DEFAULT(CV_CALIB_CB_ADAPTIVE_THRESH+CV_CALIB_CB_NORMALIZE_IMAGE) );
这个函数式找到内角点位置:
输入的棋盘图,必须是8位的灰度或者彩色图像。
pattern_size
棋盘图中每行和每列角点的个数。
检测到的角点
corner_count
输出,角点的个数。如果不是NULL,函数将检测到的角点的个数存储于此变量。
各种操作标志,可以是0或者下面值的组合:
CV_CALIB_CB_ADAPTIVE_THRESH - 使用自适应阈值(通过平均图像亮度计算得到)将图像转换为黑白图,而不是一个固定的阈值。
CV_CALIB_CB_NORMALIZE_IMAGE - 在利用固定阈值或者自适应的阈值进行二值化之前,先使用cvNormalizeHist来均衡化图像亮度。
CV_CALIB_CB_FILTER_QUADS - 使用其他的准则(如轮廓面积,周长,方形形状)来去除在轮廓检测阶段检测到的错误方块。
void cvFindCornerSubPix(const CvArr* image,CvPoint2D32f* corners,int count,CvSize win,CvSize zero_zone,CvTermCriteria criteria)
函数 cvFindCornerSubPix 通过迭代来发现具有子象素精度的角点位置:
输入的图像,必须是8位的灰度或者彩色图像。
输入角点的初始坐标,也存储精确的输出坐标。
搜索窗口的一半尺寸。如果win=(5,5)那么使用(5*2+1)&(5*2+1)=11&11大小的搜索窗口
死区的一半尺寸,死区为不对搜索区的中央位置做求和运算的区域。它是用来避免自相关矩阵出现的某些可能的奇异性。当值为(-1,-1)表示没有死区。
求角点的迭代过程的终止条件。即角点位置的确定,要么迭代数大于某个设定值,或者是精确懂达到某个设定值。criteria可以是最大迭代数目,或者是设定的精确度,也可以是它们的组合。
3.摄像机标定求参数,我们目前求内参和畸变参数进行图像校正;
用到的函数说明:
void cvCalibrateCamera2( const CvMat* object_points, const CvMat* image_points, const CvMat*point_counts, CvSize image_size, CvMat* intrinsic_matrix, CvMat* distortion_coeffs, CvMat* rotation_vectors=NULL, CvMat* translation_vectors=NULL, int flags=0 );
标定函数,求摄像机内参和外参数:
object_points
定标点的世界坐标,为3xN或者Nx3的矩阵,这里N是所有视图中点的总数。
image_points
定标点的图像坐标,为2xN或者Nx2的矩阵,这里N是所有视图中点的总数。
point_counts
向量,指定不同视图里点的数目,1xM或者Mx1向量,M是视图数目。
image_size
图像大小,只用在初始化内参数时。
intrinsic_matrix
输出内参矩阵(A),如果指定CV_CALIB_USE_INTRINSIC_GUESS和(或)CV_CALIB_FIX_ASPECT_RATION,fx、 fy、 cx和cy部分或者全部必须被初始化。
distortion_coeffs
输出大小为4x1或者1x4的向量,里面为形变参数[k1, k2, p1, p2]。
rotation_vectors
输出大小为3xM或者Mx3的矩阵,里面为旋转向量(旋转矩阵的紧凑表示方式,具体参考函数cvRodrigues2)
translation_vectors
输出大小为3xM或Mx3的矩阵,里面为平移向量。
不同的标志,可以是0,或者下面值的组合:
CV_CALIB_USE_INTRINSIC_GUESS - 内参数矩阵包含fx,fy,cx和cy的初始值。否则,(cx, cy)被初始化到图像中心(这儿用到图像大小),焦距用最小平方差方式计算得到。注意,如果内部参数已知,没有必要使用这个函数,使用cvFindExtrinsicCameraParams2则可。
CV_CALIB_FIX_PRINCIPAL_POINT - 主点在全局优化过程中不变,一直在中心位置或者在其他指定的位置(当CV_CALIB_USE_INTRINSIC_GUESS设置的时候)。
CV_CALIB_FIX_ASPECT_RATIO - 优化过程中认为fx和fy中只有一个独立变量,保持比例fx/fy不变,fx/fy的值跟内参数矩阵初始化时的值一样。在这种情况下, (fx, fy)的实际初始值或者从输入内存矩阵中读取(当CV_CALIB_USE_INTRINSIC_GUESS被指定时),或者采用估计值(后者情况中fx和fy可能被设置为任意值,只有比值被使用)。
CV_CALIB_ZERO_TANGENT_DIST & 切向形变参数(p1, p2)被设置为0,其值在优化过程中保持为0。
4.矫正,利用上步求得的参数对图像进行矫正。
用到的函数说明,有两种方法进行矫正,下面都介绍一下:
a.使用cvInitUndistortMap()和cvRemap()来处理,前者用来计算畸变映射,后者把求得的映射应用到图像。
void cvInitUndistortMap( const CvMat* intrinsic_matrix, const CvMat* distortion_coeffs, CvArr* mapx, CvArr* mapy );
这个函数计算畸变映射,其中intrinsic_matrix摄像机内参数矩阵(A) [fx 0 0 0 0 1].distortion_coeffs形变系数向量[k1, k2, p1, p2,k3],大小为5x1或者1x5。mapx为x坐标的对应矩阵。mapy为y坐标的对应矩阵。
void cvRemap( const CvArr* src, CvArr* dst,const CvArr* mapx, const CvArr* mapy,int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,CvScalar fillval=cvScalarAll(0) );
对图像进行普通几何变换,求得矫正图像:
&&&& src &&&& 输入图像. dst 输出图像. & mapx x坐标的映射 (32fC1
image). mapy y坐标的映射 (32fC1 image). flags 插值方法和以下开关选项的组合: &
CV_WARP_FILL_OUTLIERS - 填充边界外的像素. 如果输出图像的部分象素落在变换后的边界外,那么它们的值设定为 fillval。
函数cvInitUndistortMap预先计算非形变对应-正确图像的每个像素在形变图像里的坐标。这个对应可以传递给cvRemap函数(跟输入和输出图像一起)。
b.使用cvUndistort2()这个函数一次完成所有事项,不推荐。
CVAPI(void) cvUndistort2( const CvArr* src, CvArr* dst,
const CvMat* camera_matrix,
const CvMat* distortion_coeffs,
const CvMat* new_camera_matrix CV_DEFAULT(0) );
函数说明:
&&& 其中,src为输入图像,dst为输出图像.,camera_matrix摄像机内参数矩阵(A) [fx 0 0 0 0 1],distortion_coeffs形变系数向量[k1, k2, p1, p2,k3],大小为5x1或者1x5。
建议还是使用第一种算法,因为计算畸变映射是一个耗时的操作,当畸变映射不变的时候,使用第一种效率更高。
本人实验效果如下:
& & & &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
代码这里就不留了,opencv也有类似的源码,有需要的朋友留下联系方式可以发给你们,共勉!
阅读(...) 评论()

我要回帖

更多关于 matlab摄像机标定 的文章

 

随机推荐