最新-01-30相机标定的原理与意义及opencv、matlab实现差异小结汇总

合集下载

摄像机标定的基本原理实现及性能分析_小论文

摄像机标定的基本原理实现及性能分析_小论文

摄像机标定的基本原理实现及性能分析_小论文1.采集标定图像:通过摄像机拍摄一系列已知的标定板图像,标定板上通常有明确的特征点或者标定物体,这些特征点被用来进行摄像机标定的计算。

2. 特征点提取:使用图像处理算法,如Harris角点检测或SIFT算法等,从标定图像中找到特征点,并提取其特征描述子。

3.特征点匹配:将标定板图像中的特征点与实际世界坐标点进行匹配,建立特征点之间的对应关系。

4.摄像机的内参数标定:通过已知的标定板图像和其对应的实际世界坐标点,利用摄像机模型的投影关系,计算出摄像机的内参数,包括焦距、主点和畸变参数等。

5.摄像机的外参数标定:利用摄像机的内参数和特征点的对应关系,通过最小化重投影误差的方法,估计出摄像机的外参数,包括旋转矩阵和平移矩阵。

6.误差评估:对标定结果进行误差评估和优化,例如通过重投影误差的计算和最小化、重复采样一致性算法(RANSAC)等方法,对标定的准确性进行验证和改进。

1.精度:即标定结果与实际情况之间的误差。

精度的评估通常通过计算摄像机内外参数的重投影误差来进行,重投影误差较小则说明标定结果较为准确。

2.稳定性:即标定结果对输入数据的变化的稳定性。

稳定性的评估可以通过在不同条件下进行多次标定实验,计算不同实验结果之间的差异之来进行。

3.鲁棒性:即标定方法对噪声和异常值的容忍能力。

鲁棒性的评估可以通过向标定图像中加入噪声或异常值,并观察标定结果的变化情况来进行。

4.计算效率:即标定过程所需的计算时间。

计算效率的评估可以通过记录标定过程的耗时来进行。

5.实际应用:即标定方法在实际应用中的可行性和有效性。

实际应用的评估可以通过将标定结果应用到三维重构、姿态估计等任务中,观察其效果和性能来进行。

总之,摄像机标定是计算机视觉领域中的一个重要研究课题,其基本原理是通过建立摄像机内外参数与实际世界坐标的对应关系,实现图像坐标与实际世界坐标之间的转换。

标定的实现包括采集标定图像、特征点提取与匹配、摄像机内外参数标定和误差评估等步骤。

基于MATLAB对相机标定的研究

基于MATLAB对相机标定的研究

基于MATLAB对相机标定的研究摘要:相机标定是对相机成像的逆过程求解,是建立二维图像坐标和三维世界坐标之间的对应关系,是机器视觉的重要组成部分。

文章对针孔相机成像原理进行分析,考虑相机成像过程的径向畸变和偏心畸变。

利用棋盘格标定原理,基于MATLAB对相机进行标定。

关键词:相机标定;MATLAB;二值化随着科技的迅猛发展,机器视觉越来越多的被运用到工业生产。

相机的标定是机器视觉的重要组成部分,是对由三维世界坐标到二维图像坐标的映射求解。

并广泛运用于逆向工程、空间测距、图像识别、3D电影、游戏等工程。

相机的标定方法分为两大类,分别为传统标定方法和自标定方法。

传统标定方法利用标定块的角点坐标和对应的图像坐标,计算出相机的内外参数,这种标定方法可以标定任意相机模型,标定过程复杂但是结果精确。

包括利用最优化算法的标定、考虑畸变补偿的两步法、张正友标定法。

自标定法是利用Krupp方程为相机建立绝对二次曲线曲面方程进行求解。

这种方法灵活性强,但是鲁棒性和标定结果相对较差。

1 相机的标定原理对相机进行标定首先需要建立相机的成像模型,首先利用针孔模型对相机的成像原理进行分析,然后考虑实际相机的畸变模型,利用张正友标定方法求解。

1.1 线性模型分析相机标定的针孔模型是利用小孔成像的原理来描述相机的成像模型。

针孔相机模型如下图1。

要描述针孔相机模型,需要介绍四种坐标以及这四种的坐标的相互关系。

如图1所示,世界坐标系(OW-XWYWZW)表示世界的绝对坐标,能描述相机及其物理的空间位置。

相机坐标(OC-XCYCZC)以相机的光心为坐标的原点,光轴为ZC轴,而XC、YC轴分别平行于图像坐标系的X,Y轴。

图像坐标(o-xy)是以光轴与图像平面的交点为原点,描述的成像的平面坐标。

图像像素坐标(o-uv)是图像的存储坐标,以图像左上端点为原点,以像素为单位描述图像其u、v轴分别平行于图像坐标的x、y轴。

其中fx=f/dx,dx表示像素在x轴方向的物理尺寸,f为相机的焦距。

摄像机标定技术的研究与应用

摄像机标定技术的研究与应用

摄像机标定技术的研究与应用随着科技的不断发展,摄像机应用越来越广泛,从普通家庭摄像机、监控摄像机,到行车记录仪、工业机器视觉等,摄像机已经成为了人们生活、工作中必不可少的设备。

而在摄像机的应用过程中,为了保证摄像机的准确性和稳定性,摄像机标定技术也越来越受到了研究者和工程师们的关注。

一、摄像机标定技术的意义摄像机标定技术可以通过一系列的计算和校准来对摄像机进行精度校准,使摄像机的结果准确可靠,为后续的图像处理和识别技术提供了必要的前提条件。

同时,摄像机标定技术也为摄像机的应用提供了重要的技术保障。

二、摄像机标定技术的基本原理1、摄像机内部参数标定摄像机的内部参数指的是摄像机镜头的具体参数,包括焦距、主点坐标和畸变参数等。

对于不同的摄像机,这些参数的值都是不同的。

因此,摄像机标定的第一步就是对其内部参数进行标定。

一般情况下,使用三维点对来标定这些参数的数值,通过一系列的计算和校准,得到了摄像机的一些基本参数,如焦距、主点坐标和畸变参数等。

2、摄像机外部参数标定摄像机的外部参数指的是摄像机在三维空间中的位置和方向等参数。

通过标定摄像机的外部参数,可以将摄像机与三维物体建立起关系,并从中获取一些重要的图像信息。

一般情况下,使用多组三维点对来标定这些参数的数值,通过一系列的计算和校准,得到了摄像机在三维空间中的位置和方向等参数。

三、摄像机标定技术的应用摄像机标定技术在很多领域都有着广泛的应用和意义。

1、3D重建与模拟技术通过摄像机标定技术,可以捕捉真实世界中的三维信息,进而实现三维重建与模拟技术。

例如,以飞机机身的三维重建为例,通过多组摄像机对同一物体的拍摄,运用摄像机标定技术对每一组影像进行处理,最终得到了整个机身的三维图像和模型。

这种技术可以广泛应用于航空、汽车、机器人等领域。

2、工业制造领域摄像机标定技术在机器视觉和自动化生产中也有着广泛的应用。

例如,在智能制造中,通过安装摄像机和标定器,在流程中捕获数据并计算出每一台机器的性能参数,检测实时数据来提高制造效率和操作质量等,从而达到智能制造的目的。

相机标定的来龙去脉(详解标定原理、畸变矫正原理、使用经验)

相机标定的来龙去脉(详解标定原理、畸变矫正原理、使用经验)

相机标定的来龙去脉(详解标定原理、畸变矫正原理、使用经验)1、相机标定的意义在机器视觉领域,相机的标定是一个关键的环节,它决定了机器视觉系统能否有效的定位,能否有效的计算目标物。

相机的标定基本上可以分为两种,第一种是相机的自标定;第二种是依赖于标定参照物的标定方法。

前者是相机拍摄周围物体,通过数字图像处理的方法和相关的几何计算得到相机参数,但是这种方法标定的结果误差较大,不适合于高精度应用场合。

后者是通过标定参照物,由相机成像,并通过数字图像处理的方法,以及后期的空间算术运算计算相机的内参和外参。

这种方法标定的精度高,适用于对精度要求高的应用场合。

本文主要写一写后者,至于前者,是一个研究的难点和热点,以后有空再写。

2、坐标系的变换2.1、小孔成像的原理小孔成像的原理可以用下图来说明:2.2、各个坐标系的定义为了说明白,建议先介绍图像的坐标系,再逐步推广到世界坐标系,最后说明各个坐标系是如何变化的,从而给出相机的内参和外参。

2.2.1、像素坐标系像素坐标就是像素在图像中的位置。

一般像素坐标系的左上角的顶点就是远点,水平向右是u,垂直向下是v轴。

例如,在上图中,任意一个像素点的坐标可以表示为(ui,vi)。

2.2.2、图像坐标系在像素坐标系中,每个像素的坐标是用像素来表示的,然而,像素的表示方法却不能反应图像中物体的物力尺寸,因此,有必要将像素坐标转换为图像坐标。

将像素坐标系的原点平移到图像的中心,就定为图像坐标系的原点,图像坐标系的x轴与像素坐标系的u轴平行,方向相同,而图像坐标系的y轴与像素坐标系的v轴平行,方向相同。

在图中,假设图像中心的像素坐标是(u0,v0),相机中感光器件每个像素的物力尺寸是dx * dy,那么,图像坐标系的坐标(x,y)与像素坐标系的坐标(u,v)之间的关系可以表示为:写成矩阵的形式就为改写为齐次坐标的形式2.2.3、相机坐标系相机坐标系是以相机的光轴作为Z轴,光线在相机光学系统的中心位置就是原点Oc(实际上就是透镜的中心),相机坐标系的水平轴Xc与垂直轴Yc分别于图像坐标系的X轴和Y轴平行。

相机标定方法 matlab

相机标定方法 matlab

相机标定方法 matlab相机标定是计算机视觉中的重要部分之一,它是通过测量图像上的物体点和其在相机坐标系下对应的点坐标,来估算相机内部参数和外部参数的过程。

相机内部参数通常包括焦距、主点位置和畸变参数等,它们决定了图像中的物体大小和位置。

相机外部参数包括相机的旋转和平移参数,它们决定了物体在相机坐标系下的坐标。

在 MATLAB 中,相机标定是通过图像处理工具箱中的“camera calibration”函数实现的。

在执行相机标定之前,需要准备一组称为标定板的物体,并在不同位置和姿态下拍摄多个图像。

标定板可以是长方形或正方形的棋盘格,也可以是自定义形状的物体,但是必须有已知的三维坐标和相应的二维坐标对。

以下是一个基本的相机标定流程,详细介绍了如何使用 MATLAB 实现相机标定。

1. 准备标定板需要准备一个标定板。

标定板可以是一个黑白棋盘格或自定义形状的物体。

在这里,我们将使用一个 9x7 的黑白棋盘格。

2. 采集标定图像接下来,需要拍摄多个标定图像,并记录标定板在每个图像中的位置和姿态。

对于每个图像,需要至少拍摄 10 张,以确保图像的质量和特征的稳定性。

可以使用不同的相机设置,例如不同的焦距、光圈和曝光时间等,来捕捉标定板的不同姿态。

3. 读取图像和标定板角点在 MATLAB 中,可以使用“imageDatastore”函数读取标定图像并创建一个图像数据存储对象。

接下来,可以使用“detectCheckerboardPoints”函数来检测标定板上的角点。

这个函数会返回一个 Nx2 的矩阵,其中 N 是标定板上检测到的角点数。

4. 定义标定板上角点的空间坐标现在需要定义标定板上角点的空间坐标。

这些坐标可以使用“generateCheckerboardPoints”函数自动生成。

该函数会返回一个 Nx3 的矩阵,其中N 是标定板上的角点数,每一行代表一个角点的空间坐标。

5. 进行相机标定用于相机标定的主要函数是“cameraCalibration”函数。

相机标定算法

相机标定算法

相机标定算法摄像机标定是用来计算摄像机的运动参数的重要步骤,它可以把摄像机的物理坐标系与图像坐标系(像素坐标系)相关联。

与处理传统图像不同,机器视觉要处理数字信号,因此摄像机标定是机器视觉系统中一个非常重要的环节。

本文介绍了摄像机标定的原理、方法和结果分析,并介绍了常用的摄像机标定算法及其特点,以便于更多的应用。

一、摄像机标定的原理摄像机标定是一种从照片中识别物体坐标系的方法,它的原理是基于三角测量算法,需要在机器视觉系统中提前定义了实物内部的若干个特征点,根据这些临时点的位置,就可以计算出摄像机坐标系和图像坐标系之间的关系,从而实现机器视觉系统的精确测量。

二、摄像机标定的方法摄像机标定有多种方法,一般来说,采用的方法有极小二乘法(least squares)、基于模板的方法、单应矩阵,以及深度学习法等。

1.极小二乘法(least squares)极小二乘法是用来计算实物在摄像机空间中坐标系下的坐标,它可以通过计算实物上光学特征点在摄像机坐标系下的坐标与摄像机图像上由特征点检测得到的坐标之间的差值来实现标定,从而给出摄像机的参数。

2.基于模板的方法基于模板的方法也叫多视场校正,是最常见的摄像机标定方法之一,它的原理是将位置处于固定的模板特征点投射到摄像机图像坐标系中,并结合摄像机图像坐标系中的特征点来求解摄像机的参数。

由于模板的临时点可以很容易被识别,该方法简单快捷,是机器视觉系统中常用的标定方法。

3.单应矩阵单应矩阵法是比较常用的摄像机标定算法之一,它使用了两个平面上的点对来对摄像机运动进行标定,它可以将视场中的三维空间投射到图像平面形成新的图像,从而得到摄像机运动参数及内参。

4.深度学习法深度学习法是近几年新兴的技术,它也可用于摄像机标定。

该方法主要是使用深度学习网络来识别图像中的特征点,再针对特征点及其相对位置关系来对摄像机运动参数进行标定。

优点是数据量不大,标定效果较好,但由于目前深度学习技术尚不成熟,其计算速度和准确度仍是技术上的瓶颈。

相机标定过程(opencv)+matlab参数导入opencv+matlab标定和矫正

相机标定过程(opencv)+matlab参数导入opencv+matlab标定和矫正

相机标定过程(opencv)+matlab参数导⼊opencv+matlab标定和矫正%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%⾟苦原创所得,转载请注明出处%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%start -- 摄像机标定 ---------------------------------------------->摄像机标定的数学过程如下标定事先选⽤棋盘格要注意⼀些问题,张正友论⽂中建议棋盘格数⼤于7*7。

opencv标定时候对正⽅形的棋盘格标定板是不能识别的,需要长⽅形的标定板。

张正友论⽂中建议每次拍摄标定板占50%以上,但这是对畸变并不是很⼤的普通相机⽽⾔的,对于球⾯相机是不适⽤的,相反球⾯相机标定使⽤的标定板占⽐应该较⼩⽐较好(对于格⼦并不是⾮常密的棋盘格⽽⾔),原因是因为棋盘格每个⾓点之间的距离越⼤,这段距离之间的可能发⽣畸变的点越多,如果占⽐过⼤就⽆法将形变体现在棋盘格中。

棋盘格的选⽤应该根据实际需要选⽤,对于要求精密识别的情况,则需要⾼精度的棋盘格,相应的价格也会较⾼;对于精度要求并不是很⾼的(如抓取)情况并不需要精度很⾼的标定板,也能够节省开⽀。

这⾥程序的实现是在opencv中,所以就⽤opencv的程序来说明具体的过程.注意各个版本的opencv之间的程序移植性并不好,以下程序是在opencv2.4.3下编制运⾏的,每⼀步的要⽤到的输⼊输出都做了红⾊标记.⽴体相机标定分为两个步骤,⼀个是单⽬标定(本⽂档第2步),另⼀个是双⽬标定单⽬标定获得相机的x,y轴的焦距;x,y轴的坐标原点位置;世界坐标系和平⾯坐标之间的旋转和平移矩阵,5个畸变系数双⽬标定获得两个相机成像平⾯之间的旋转和平移矩阵注意1.程序运⾏前需要插上摄像头,否则程序有可能不能正常运⾏2.单⽬标定(1).获取棋盘格图像for (int i=1; i<=19; i++)//输⼊左标定板图像{std::stringstream str;//声明输⼊输出流str << "./left" << i << ".jpg";//以名字⽅式把图像输⼊到流std::cout << str.str() << std::endl;//.str("")清除内容 .clear()清空标记位leftFileList.push_back(str.str());//.push_back从容器后向前插⼊数据leftBoardImage = cv::imread(str.str(),0);//⽤来显⽰即时输⼊的图像cv::namedWindow("left chessboard image");cv::imshow("left chessboard image",leftBoardImage);cv::waitKey(10);}(2).定义棋盘格的⾓点数⽬cv::Size boardSize(14,10)(3).程序定位提取⾓点这⾥建⽴的是理想成像平⾯(三维,第三维为0,单位为格⼦数)和图像坐标系(⼆维,单位是像素)之间的关系(a)⾸先声明两个坐标容器std::vector<cv::Point2f> imageCorners;//⼆位坐标点std::vector<cv::Point3f> objectCorners;//三维坐标点(b)初始化棋盘⾓点,令其位置位于(x,y,z)=(i,j,0),⼀个棋盘格为⼀个坐标值for (int i=0; i<boardSize.height; i++){for (int j=0; j<boardSize.width; j++){objectCorners.push_back(cv::Point3f(i, j, 0.0f));}}(c)直接使⽤opencv内函数找到⼆维⾓点坐标,并建⽴标定标定格⼦和实际坐标间的关系(像素级别)这个函数使⽤时,当标定板是长⽅形时可以找到⾓点,但是标定板是正⽅形时,就找不到,原因还未知.cv::findChessboardCorners(image, boardSize, imageCorners);(d)获得像素精度往往是不够的,还需要获得亚像素的精度cv::cornerSubPix(image,imageCorners, //输⼊/输出cv::Size(5,5),//搜索框的⼀半,表⽰在多⼤窗⼝定位⾓点cv::Size(-1,-1), //死区cv::TermCriteria(cv::TermCriteria::MAX_ITER + cv::TermCriteria::EPS,30, // max number of iterations//迭代最⼤次数0.01)); // min accuracy//最⼩精度注:TermCriteria模板类,取代了之前的CvTermCriteria,这个类是作为迭代算法的终⽌条件的,这个类在参考⼿册⾥介绍的很简单,我查了些资料,这⾥介绍⼀下。

matlab相机内参数标定原理 -回复

matlab相机内参数标定原理 -回复

matlab相机内参数标定原理-回复导语:相机内参数标定是摄影测量中的一项重要工作,它通过确定相机的内部参数来提高图像的质量和精度。

本文将介绍相机内参数标定的原理和步骤,以及在Matlab中进行相机标定的具体实现。

一、相机内参数标定的意义和概述(150字)相机内参数是指相机的内部构造和特性,包括焦距、主点位置、像素尺寸、畸变等。

标定相机的内参数可以提高图像的质量和精度,用于计算三维空间中点的坐标。

相机内参数标定是摄影测量的关键步骤之一,对于计算机视觉、机器人导航等应用领域起着重要的作用。

二、相机内参数标定的原理(300字)相机内参数标定的原理是基于针孔成像模型,即相机捕捉到的物体影像是通过相机的中心投影到成像平面上的。

由于相机存在像素尺寸不一致、镜头畸变等问题,所以需要通过标定来确定相机的内参数。

相机内参数标定主要包括焦距、主点位置、径向畸变和切向畸变等参数的确定。

其中,焦距和主点位置确定相机的相对尺度和相对位置,径向畸变参数通过拟合成像圆的畸变效果实现,切向畸变参数通过拟合成像椭圆的畸变效果实现。

标定相机的过程通常需要采集多组不同位置和姿态的标定板图像,并通过标定板上已知的特征点来计算出相机的内参数。

这些特征点通过角点检测算法获取,然后通过最小二乘法拟合得到相机的内参数矩阵。

三、Matlab相机内参数标定的步骤(600字)在Matlab中,可以使用Computer Vision Toolbox提供的函数来实现相机内参数标定。

以下是一步一步的实现过程:1. 准备标定板:选择一个标定板,常见的有棋盘格、圆点标定板等。

确保标定板的特征点能够被准确检测到。

2. 采集标定板图像:在不同位置和姿态下,使用相机采集多组标定板图像。

图像的数量越多,标定结果越准确。

3. 检测标定板角点:使用角点检测算法,如Harris角点检测或亚像素角点检测,来获取标定板图像中的特征点坐标。

4. 优化角点坐标:使用亚像素精确化算法对检测到的角点坐标进行优化,提高标定的精度。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2011-01-30相机标定的原理与意义及O p e n C V、M a t l a b实现差异小结2011-01-30 相机标定的原理与意义及OpenCV、Matlab实现差异小结分类:OpenCV点滴2011-01-30 20:35 2292人阅读评论(3) 收藏举报本文是一篇关于相机标定意义和原理的个人总结,包含了OpenCV和Matlab中常用的相机标定函数的注解。

相机标定是机器视觉的基础,标定结果的好坏直接决定了机器视觉的系统精度,作用可见一斑。

在这一年半的时间里,我个人也是随着实验和程序的进一步理解,对标定的原理和意义有了更多的想法。

同样,由于博文的关系,仍有一些朋友会常常询问标定的程序问题。

本人的2010-05-17OpenCV标定程序的问题也多次被朋友询问,由于当时对标定的认识还不够系统,因此现在认为该文对标定的意义和原理有很多误解,并在此推荐一些较好的博文拱大家学习:双目测距与三维重建的OpenCV实现问题集锦(一)图像获取与单目标定;双目测距与三维重建的OpenCV实现问题集锦(二)双目标定与双目校正;双摄像头测距的OpenCV实现;分享一些OpenCV实现立体视觉的经验;下面结合本人的毕业论文及一年半来对机器视觉的学习,对相机标定的意义和原理进行叙述。

1.单目相机模型单目相机模型中的三种坐标系关系如图1所示,相机坐标系即是以光轴中心O为原点的坐标系,其z轴满足右手法则,成像原点所代表平面即为像平面坐标系(实际应用中,均以图像左上角为坐标系原点),实际物体坐标系即为世界坐标系。

图1 单目相机模型的三坐标系统关系其中,在世界坐标系的值为,是在像平面坐标系的投影点,其相机坐标系的值为。

是相机坐标系轴与像平面夹角,一般情况下轴与像平面垂直,值为。

且相机坐标系与像平面平行,为相机的焦距。

对于从相机坐标系到像平面坐标系的变换,像平面坐标系是用像素单位来表示的,而相机坐标系则是以毫米为单位来表示,因此,要完成改变换过程就需要先得到像平面的像素单位与毫米单位之间的线性关系。

在图1中,相机光轴中心z轴方向上与像平面的交点称为投影中心,坐标为,是像素单位,而每个像素在和的物理尺寸为和,单位是像素/毫米,则像平面的像素与毫米间的线性关系如式(1):(1)根据小孔模型下投影变换原理,像平面的物理坐标对应的相机坐标系满足式(2):(2)其对应的矩阵形式为式(3):(3)联立式(1)和式(3),得到式(4)即为相机坐标系与像平面坐标系变换的矩阵。

(4)其中,即为相机的6个内参数,其组成的矩阵即为内参数矩阵。

对于从相机坐标系到世界坐标系的变换,是通过旋转矩阵R和平移矩阵T完成的,如图2所示。

图2 相机坐标系与世界坐标系的变换关系其中,平移矩阵T是三维列向量,旋转矩阵R是坐标轴依次绕和轴旋转角度和所形成的三个矩阵的总乘积。

它们的定义如式(5):(5)则矩阵R的计算公式如式(6):(6)因此,从相机坐标系到世界坐标系的变换如式(7),其中,表示,为旋转矩阵,为平移矩阵,该变换矩阵称为外参数矩阵。

(7)最后,联立式(4)和式(7)求得像平面坐标系与世界坐标系之间的变换关系,如式(8):(8)其中,即为透视投影矩阵,表示空间中三维点坐标与图像平面二维坐标之间的线性关系,表示的像平面齐次坐标值,表示的世界坐标系齐次坐标值。

基于以上几何原理和相机模型得到的图像信息和三维信息之间的关系,存在不可逆性,即可以通过已知世界坐标系的坐标值求得二维坐标值,如果要进行二维坐标到三维坐标的反求还需要其他的数学模型辅助求解。

2.Matlab标定工具箱应用1) 制作标定板,标定板尺寸为324(mm)X252(mm),即7行9列63个36mm 的正方形方格组成,如图3所示。

图3 标定方格板2) 将水平平行的左右相机同时采集标定板的不同位姿图像,共计12组位姿(对于采集的图像,位姿越多,标定结果也会越精确,建议在10组到20组之间)如图4,5所示。

图4 左相机的标定图像图5 右相机的标定图像3) 在工具箱中通过Extract grid corners提取每幅标定图像的特征点(即黑方格与白方格的交点)。

4) 进行单目标定,得到左右相机的内外参数以及畸变系数,并将参数保存到Calib_Results_left和Calib_Results_right两个mat格式的文件中。

3.Matlab标定结果与OpenCV标定结果的比较与分析Matlab标定结果:通过上节的步骤(1)-(4),可以得到如图6和7所示的左右相机的内参数、畸变系数结果。

图6 左相机的内参数和畸变系数图7 右相机的内参数和畸变系数对于左右相机由于透镜畸变造成的误差使用工具箱中的visualize_distortions 功能进行分析,可以得到左相机的畸变图,如8、9、10所示,相应的右相机畸变图,如11、12、13所示。

图8 左相机镜头畸变图图9 左相机径向畸变图图10 左相机切向畸变图对于图8到10,图中的0点即为左相机光学中心,图中的箭头显示相机图像的畸变方向。

图8左相机整体畸变模型中,该相机的左侧畸变不明显,若物体的图像在此则不易受畸变因素影响造成线条的弯曲;图9左相机径向畸变模型中,该相机的畸变系数由中心向外增大,即物体的图像越靠近图像边缘,其线条的弯曲程度就越大;图10左相机切向畸变模型中,箭头方向显示该相机切向畸变的增大方向,在相机的左侧其切向畸变与径向畸变的方向相反,使得整体畸变模型中,相机左侧的畸变较小。

图11 右相机镜头畸变图图12 右相机径向畸变图图13 右相机切向畸变图对于图11到13,图中的0点与左相机相同,即为右相机光学中心,图中的箭头显示相机图像的畸变方向。

图11右相机整体畸变模型中,该相机的中间及偏左侧畸变不明显,若物体的图像在此则不易受畸变因素影响造成线条的弯曲;图12右相机径向畸变模型中,该相机的畸变系数由中心向外增大,但右相机比左相机在光轴中心附近有更大的区域畸变很小,因此位于右侧相机光学中心的图像,其线条因受畸变造成的弯曲很小;图13右相机切向畸变模型中,箭头方向显示该相机切向畸变的增大方向,在相机的左侧其切向畸变与径向畸变的方向相反,使得整体畸变模型中,位于右相机图像左侧的线条受畸变影响较小。

OpenCV标定结果:在此列举的OpenCV标定结果是我双目视觉标定且优化后的结果,与Matlab的会有差异。

左侧相机的内参数矩阵:(9)右侧相机的内参数矩阵:(10)该式(9)-(10)与式(1)相对应。

而Matlab中的cc对应于式(1)中的相机光轴中心在图像平面的投影坐标,fc即为式(1)中的和。

至此,讲解完了OpenCV与Matlab所对应的相机标定内参数矩阵的含义。

OpenCV与Matlab标定中的差异:OpenCV的标定参数中,对于镜头畸变采用的方法是Brown博士在71年发表的文章中提到的;而Matlab中的镜头畸变参数采用基于Heikkil博士提出的方法,将非线性干扰因素引入到内外参数的求解过程。

Heikkil采用的矩阵来表示以上的两种畸变系数。

根据Brown的非线性模型,和表示镜头的径向畸变系数,通常只使用两项,只是针对即便较大的镜头(例如鱼眼镜头,其余情况下该系数值为0),而和表示切向畸变系数,由式(11)和式(12)求解该矩阵,本文的畸变系数求解伴随在相机标定过程中。

(11)其中,是像平面上的任一点坐标值,是进行径向畸变矫正后的坐标值,是作为光学中心畸变为0的点进行泰勒级数展开后得到的。

(12)其中,是像平面上的任一点坐标值,是进行切向畸变矫正后的坐标值,如式(11)的定义相同。

4.外参数的作用及其在相机标定中的意义外参数定义了如图2所示的图像平面到世界坐标系的变换关系。

而标定就是通过相机寻找图像平面中如图3所示的标定板的特征点位置,所以得到的外参数是图像平面与标定板所处平面的线性变换关系。

在我的2010-06-14基于Matlab的双目视觉定位问题研究中,通过Matlab标定工具箱产生的图4与图5就可以表达上述含义。

因此,对于不同的棋盘格标定板空间位置,必然对应于不同的外参数矩阵。

同样的,在视觉伺服中,雅可比矩阵也有同样的数学意义。

对于视觉伺服,个人认为可以看些徐德的论文入门。

5.OpenCV标定程序说明用于寻找图像中的棋盘格标定板的特征点:CvSize board_sz = cvSize( board_w, board_h );IplImage* imgLeft=cvCreateImage(cvSize(imgL->width,imgL->height),imgL->depth,imgL->nChannels);IplImage* imgRight=cvCreateImage(cvSize(imgR->width,imgR->height),imgR->depth,imgR->nChannels);CvPoint2D32f* cornersLeft = new CvPoint2D32f[ board_n ];CvPoint2D32f* cornersRight = new CvPoint2D32f[ board_n ];int corner_countLeft, corner_countRight;cvResize(imgL,imgLeft,CV_INTER_LINEAR);cvResize(imgR,imgRight,CV_INTER_LINEAR);if(frame++ % board_dt == 0) {//Find chessboard corners:int foundLeft = cvFindChessboardCorners(imgLeft, board_sz, cornersLeft, &corner_countLeft,CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS);int foundRight = cvFindChessboardCorners(imgRight, board_sz, cornersRight, &corner_countRight,CV_CALIB_CB_ADAPTIVE_THRESH |CV_CALIB_CB_FILTER_QUADS);//Get Subpixel accuracy on those cornerscvCvtColor(imgLeft, grayLeft, CV_BGR2GRAY);//if input is colorful then use thiscvCvtColor(imgRight, grayRight, CV_BGR2GRAY);cvFindCornerSubPix(grayLeft, cornersLeft, corner_countLeft,cvSize(11,11),cvSize(-1,-1),cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 30, 0.1 ));//寻找棋盘格标定板的特征点cvFindCornerSubPix(grayRight, cornersRight, corner_countRight,cvSize(11,11),cvSize(-1,-1),cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 30, 0.1 )); //寻找棋盘格标定板的特征点//画出找到的特征点cvDrawChessboardCorners(imgLeft, board_sz, cornersLeft,corner_countLeft, foundLeft);cvDrawChessboardCorners(imgRight, board_sz, cornersRight,corner_countRight, foundRight);if (corner_countLeft>=board_n && foundLeft &&corner_countRight>=board_n && foundRight){//保存特征点在图像坐标中的坐标值,用于Calibrate2和StereoCalibration 的调用step = success*board_n;for( int i=step, j=0; jCV_MAT_ELEM(*image_pointsLeft, float,i,0) = cornersLeft[j].x;CV_MAT_ELEM(*image_pointsLeft, float,i,1) = cornersLeft[j].y;CV_MAT_ELEM(*image_pointsRight, float,i,0) = cornersRight[j].x;CV_MAT_ELEM(*image_pointsRight, float,i,1) = cornersRight[j].y;CV_MAT_ELEM(*object_points,float,i,0) = (float)(j/board_w);CV_MAT_ELEM(*object_points,float,i,1) = (float)(j%board_w);CV_MAT_ELEM(*object_points,float,i,2) = 0.0f;}CV_MAT_ELEM(*point_counts, int,success,0) = board_n;}}随后调用cvCalibateCamera2和cvStereoCalibate函数进行相机的标定。

相关文档
最新文档