一种基于OpenCV的摄像机标定新方法
OpenCV相机标定坐标系详解

OpenCV相机标定坐标系详解在OpenCV中,可以使⽤calibrateCamera函数,通过多个视⾓的2D/3D对应,求解出该相机的内参数和每⼀个视⾓的外参数。
使⽤C++接⼝时的输⼊参数如下:objectPoints - 每⼀个视⾓中,关键点的世界坐标系。
可以使⽤vector < vector <Point3f> >类型,第⼀层vector表⽰每⼀个视⾓,第⼆层vector表⽰每⼀个点。
如果使⽤OpenCV⾃带的棋盘格,可以直接传⼊交叉点(不包括边⾓)的实际坐标,以物理世界尺度(例如毫⽶)为单位。
写坐标时,要保证z轴为0,按照先x变化,后y变化,从⼩到⼤的顺序来写。
如果⽹格尺⼨为5厘⽶,写作:(0,0,0),(5,0,0), (10,0,0)...(0,5,0), (5,5,0), (10,5,0),...如下图例⼦,x⽅向是8个交叉点,y⽅向3个较差点。
imagePoints - 每⼀个视⾓中,关键点的图像坐标系。
可以使⽤vector < vector <Point2f> >类型。
这个值可以通过findChessboardCorners函数从图像中获得。
注意:传⼊findChessboardCorners函数的patternSize参数,要和objectPoints 中的⾏列数统⼀。
imageSize - 图像尺⼨。
flags - 参数。
决定是否使⽤初始值,扭曲参数个数等。
输出参数如下:cameraMatrix - 3*3的摄像机内矩阵。
distCoeffs - 4*1(具体尺⼨取决于flags)。
对图像坐标系进⾏进⼀步扭曲。
这两个参数是内参数,可以把摄像机坐标系转换成图像坐标系。
rvecs - 每⼀个视图的旋转向量。
vector<Mat>类型,每个vec为3*1,可以⽤Rodrigues函数转换为3*3的旋转矩阵。
tvecs - 每⼀个视图的平移向量。
opencv calibratecameracharuco工作原理

opencv calibratecameracharuco工作原理OpenCV是一个开源计算机视觉库,其中的calibrateCameraCharuco函数用于相机标定。
此函数的工作原理如下:相机标定是计算机视觉中的重要任务之一,它用于估计相机的内参矩阵和畸变参数。
内参矩阵包含了相机的焦距、光心等信息,而畸变参数用于补偿镜头失真引起的图像畸变。
Charuco是Chessboard和ArUco Marker的结合体。
Charuco棋盘是一种具有一些特殊标记的人工印刷棋盘,它可以提供更高的位姿精度和更好的平面几何稳定性。
ArUco Marker是一种能够被计算机自动识别的二维码。
calibrateCameraCharuco函数的工作原理如下:1. 准备相机和Charuco棋盘:使用相机拍摄一系列具有不同位姿的Charuco棋盘图像。
这些图像应涵盖场景中所有感兴趣的视角和深度范围。
2. 检测Charuco角点:使用OpenCV的detectMarkers函数检测Charuco棋盘图像上的角点。
3. 检测角点中的虚拟像素:使用interpolateCornersCharuco函数提取Charuco棋盘上的虚拟像素坐标。
4. 收集标定数据:将实际世界中的Charuco角点坐标和对应的虚拟像素坐标传递给calibrateCameraCharuco函数。
5. 进行相机标定:calibrateCameraCharuco函数通过最小化重投影误差来估计相机的内参矩阵和畸变参数。
重投影误差是指从图像上检测到的角点重新投影到实际世界角点的误差。
6. 输出结果:calibrateCameraCharuco函数将相机的内参矩阵和畸变参数作为输出,并可以将这些参数应用于后续的相机校正和图像处理任务中。
总结而言,calibrateCameraCharuco函数通过使用Charuco棋盘和ArUco Marker 来提供高精度的相机标定。
鱼眼相机外参标定函数 opencv

鱼眼相机外参标定函数 opencv鱼眼相机外参标定函数 OpenCV鱼眼相机是一种广角摄像头,由于其光学结构的特殊性,导致重要的成像参数与其他相机不同。
因此,鱼眼相机的标定与校正是摄影学和计算机视觉领域的一个重要研究领域。
本文介绍了OpenCV中鱼眼相机外参标定函数的使用和操作方法。
鱼眼相机的成像原理是一种广角投影模型,与标准透视投影模型不同,鱼眼相机的成像有很大的失真,导致了相机成像参数的独特性。
鱼眼相机的标定包括内参标定与外参标定。
内参标定是通过拍摄多个不同的图案来确定焦距、光斑偏移、球形变形等参数。
而外参标定则是使用鱼眼相机拍摄标准平面或球面上的图案,并通过拟合重建图案来确定相机的姿态和位置。
OpenCV提供了一系列鱼眼相机标定函数,这些函数主要包括fisheye::calibrate和fisheye::stereoCalibrate等。
这些函数的使用与普通相机的标定类似,但是需要指定鱼眼相机的投影模型类型和特定的参数。
在调用这些函数之前,需要准备好标定所需的图像和相应的图案,并通过手动或自动的方式确定一些参数,例如相机和标志的大小、布局和位置。
在进行鱼眼相机外参标定时,需要首先调用cv::calibrateCamera函数对相机内参进行标定,得到相机的投影矩阵和畸变系数。
接着,我们需要准备一组标定图案,并使用鱼眼相机拍摄标定图案获得图像与3D世界坐标之间的关系。
OpenCV中提供的fisheye::findChessboardCorners 函数可以自动从鱼眼相机图像中检测棋盘格标定图案的角点。
之后,我们需要使用cv::solvePnP进行姿态估计,将像素坐标系映射为相机坐标系。
最后,通过fisheye::calibrate函数拟合反投影误差,得到相机的外参,包括旋转矩阵和平移矩阵。
值得一提的是,鱼眼相机的标定和校对是一个非常耗时的过程,需要耐心细致的操作。
同时,鱼眼相机的投影模型与其他相机不同,因此需要特殊的算法和处理方式。
学习笔记:使用opencv做双目测距(相机标定+立体匹配+测距).

学习笔记:使⽤opencv做双⽬测距(相机标定+⽴体匹配+测距).最近在做双⽬测距,觉得有必要记录点东西,所以我的第⼀篇博客就这么诞⽣啦~双⽬测距属于⽴体视觉这⼀块,我觉得应该有很多⼈踩过这个坑了,但⽹上的资料依旧是云⾥雾⾥的,要么是理论讲⼀⼤堆,最后发现还不知道怎么做,要么就是直接代码⼀贴,让你懵逼。
所以今天我想做的,是尽量给⼤家⼀个明确的阐述,并且能够上⼿做出来。
⼀、标定⾸先我们要对摄像头做标定,具体的公式推导在learning opencv中有详细的解释,这⾥顺带提⼀句,这本书虽然确实⽼,但有些理论、算法类的东西⾥⾯还是讲的很不错的,必要的时候可以去看看。
Q1:为什么要做摄像头标定?A: 标定的⽬的是为了消除畸变以及得到内外参数矩阵,内参数矩阵可以理解为焦距相关,它是⼀个从平⾯到像素的转换,焦距不变它就不变,所以确定以后就可以重复使⽤,⽽外参数矩阵反映的是摄像机坐标系与世界坐标系的转换,⾄于畸变参数,⼀般也包含在内参数矩阵中。
从作⽤上来看,内参数矩阵是为了得到镜头的信息,并消除畸变,使得到的图像更为准确,外参数矩阵是为了得到相机相对于世界坐标的联系,是为了最终的测距。
ps1:关于畸变,⼤家可以看到⾃⼰摄像头的拍摄的画⾯,在看矩形物体的时候,边⾓处会有明显的畸变现象,⽽矫正的⽬的就是修复这个。
ps2:我们知道双⽬测距的时候两个相机需要平⾏放置,但事实上这个是很难做到的,所以就需要⽴体校正得到两个相机之间的旋转平移矩阵,也就是外参数矩阵。
Q2:如何做摄像头的标定?A:这⾥可以直接⽤opencv⾥⾯的sample,在opencv/sources/sample/cpp⾥⾯,有个calibration.cpp的⽂件,这是单⽬的标定,是可以直接编译使⽤的,这⾥要注意⼏点:1.棋盘棋盘也就是标定板是要预先打印好的,你打印的棋盘的样式决定了后⾯参数的填写,具体要求也不是很严谨,清晰能⽤就⾏。
之所⽤棋盘是因为他检测⾓点很⽅便,and..你没得选。
摄像机标定的几种方法

摄像机标定的几种方法摄像机标定是计算机视觉和机器视觉领域中的一项重要技术,用于确定相机的内参矩阵和外参矩阵,从而实现图像的准确测量与三维重建。
本文将介绍几种常用的摄像机标定方法,包括直接线性变换(DLT)、Zhang的标定法、Tsai的标定法、径向畸变模型等。
1.直接线性变换(DLT)方法:直接线性变换方法是摄像机标定最基础的方法之一,通过在物体平面上放置多个已知几何形状的标定物体,测量它们的图像坐标和真实坐标,通过最小二乘法求解相机的投影矩阵。
DLT方法简单直接,但对噪声敏感,容易产生误差。
2. Zhang的标定法:Zhang的标定法是一种常用的摄像机标定方法,通过在平面上放置一系列平行的标定板,根据不同位置姿态下的标定板的图像坐标和物理坐标,运用最小二乘法求解相机的内参矩阵和外参矩阵。
Zhang的标定法提高了标定的精度和稳定性,但要求标定板在不同位置姿态下具有较大的变化。
3. Tsai的标定法:Tsai的标定法是一种基于摄像机的投影模型的标定方法,通过摄像机的旋转和平移矩阵,以及曲率和径向畸变的参数,对图像坐标和物理坐标之间的映射关系进行数学推导和求解。
Tsai的标定法可以对畸变进行校正,提高图像测量的精度。
4. Kalibr工具包:Kalibr是一个开源的摄像机标定和多传感器校准工具包,结合了多种摄像机标定方法,例如DLT、Tsai、Zhang等。
Kalibr工具包不仅可以标定单目相机,还可以标定双目和多目视觉系统,对相机的内参、外参、畸变等参数进行标定和优化,同时还能进行相机的手眼标定、IMU与相机的联合标定等。
5. Di Zhang的自标定方法:Di Zhang提出了一种基于相对边界点的自标定方法,通过提取图像中的特定点边界,通过对这些边界点位置的检测与分析,实现对相机内参和外参的求解。
这种方法不需要使用标定板等外部标定物体,只需要相机自身可以看到的物体边界即可进行标定。
6.径向畸变模型:径向畸变是摄像机成像中常见的一种畸变形式,主要表现为物体边缘呈弯曲的形式。
OpenCV机器人手眼标定(九点标定法)

OpenCV机器⼈⼿眼标定(九点标定法) 对于初学者⽽⾔,对相机的标定经常模糊不清。
不知道机器坐标与相机坐标如何转换,两个坐标系⼜是如何建⽴? 我们通常是利⽤张⽒标定法,针对于相机的畸变进⾏标定,利⽤校正得到的参数对图形进⾏处理后再呈现出来。
这个⽅法⽹上⽤的⼈很多,资料也较为全⾯。
这⾥就不做说明了。
本⽂主要是针对机械⼿的⼿眼标定,⼀般⽽⾔⽬前相机的畸变较⼩,精度也较为准确,使⽤该⽅法进⾏标定也能得到较好的效果。
⾸先,对于九点标定⽽⾔。
我们使⽤到的是OpenCv中的estimateRigidTransform 函数。
函数定义如下:Mat estimateRigidTransform(InputArraysrc,InputArraydst,boolfullAffine)前两个参数,可以是:src=srcImage (变换之前的图⽚Mat) dst=transImage(变换之后的图⽚Mat)也可以: src=array(变换之前的关键点Array) dst=array(变换之后的关键点Array)第三个参数: 1(全仿射变换,包括:rotation, translation, scaling,shearing,reflection)其主要原理为:如果我们有⼀个点变换之前是[x,y,1],变换后是[x’,y’,1] 则fullAffine表⽰如下:TX=Y展开后表⽰如果我们想求这【a-f】 6个变量需要有6个⽅程,也就是3组点。
但是⽐三个点多呢?⽐如:20个点。
那就是⽤最⼩⽅差。
标定步骤1、⾸先我们需要准备⼀块,标定板。
如果条件不⾜,可以使⽤⽩纸画上九个圆进⾏代替。
2、相机位置,机械⼿位置全部固定好,标定针固定在机械⼿上,固定好后不能够再移动。
标定针的位置⼀定要与夹⼿或吸盘之内的⼯具同⼀位置⾼度。
3、将标定板放到相机下⽅,位置区域要与机械⼿⼯作的区域⼀样,包括⾼度必须尽量⼀致,这是标定准确度的关键。
基于OpenCV的Matlab标定实现研究

C res 以用 于 检 测 标 定 板 图 像 的 角 点 以 及 角 度 , 值 通 过 最 小化 得 到 。通 过 设 为 O 可 以 on r 可 q , 建 立 系统 方程 如下 : 点数量。 函数 输 入 必须 是 8位 的灰 色 的灰 色 或 彩 色 图 像, 同时可 以根 据 函数 标 志位 n g 选 项 , 择 对 输 as 选 入 图像 的处 理 准则 。 处理 准则 有 : ) 用 自适 应 其 A使
O
0
1 ●●
, ●, ●j
+
] ● ●
_● !
一
— . ...... . .。. .....L .... . .
图 1标定系统的坐标系
巧
1t y ,:
Z
”
1图像 坐 标 系 : l所示 的 坐标 系 ( i Y 和 . 图 OX ) (0 v o u )均 为 图像 坐标 系 ,ou )为 图像像 素坐 标 (0 v 系 . OX ( i Y)为 图像 物 理 坐 标 系 或 图像 实 际 坐 标 系。
Y2 I Y3 1
L
考 虑到镜 头 的径 向崎变 和切 向崎 变 的公 式 变
形为:
—...。.....L . . . .... . . . . . . .
y Z
1● ●●● ●●, ●j
=
—.........L ... . R . . . .... . . .
: (+ k r ) 2 。 + ( 2 ’ 1 r + 2 + ’ , + x )
Y’ y (+k k r ) 2 2 ‘ + ( 2 ’ ' 1 f + 2 + p Y’ , + y )
r 。
“=
OpenCV相机标定findChessboardCorners()与cornerSubPi。。。

OpenCV相机标定findChessboardCorners()与cornerSubPi。
OpenCV 官⽅⽂档findChessboardCorners():Finds the positions of internal corners of the chessboard.bool cv::findChessboardCorners( InputArray image, Size patternSize, OutputArray corners, int flags = CALIB_CB_ADAPTIVE_THRESH+CALIB_CB_NORMALIZE_IMAGE )Python:retval, corners = cv.findChessboardCorners(image, patternSize[, corners[, flags]])Parametersimage Source chessboard view. It must be an 8-bit grayscale or color image.patternSizeNumber of inner corners per a chessboard row and column ( patternSize = cvSize(points_per_row,points_per_colum) = cvSize(columns,rows)). corners Output array of detected corners.flags Various operation flags that can be zero or a combination of the following values:CALIB_CB_ADAPTIVE_THRESH Use adaptive thresholding to convert the image to black and white, rather than a fixed threshold level (computed from the average image brightness CALIB_CB_NORMALIZE_IMAGE Normalize the image gamma with equalizeHist before applying fixed or adaptive thresholding.CALIB_CB_FILTER_QUADS Use additional criteria (like contour area, perimeter, square-like shape) to filter out false quads extracted at the contour retrieval stage.CALIB_CB_FAST_CHECK Run a fast check on the image that looks for chessboard corners, and shortcut the call if none is found. This can drastically speed up the call in the degene no chessboard is observed.The function attempts to determine whether the input image is a view of the chessboard pattern and locate the internal chessboard corners. The function returns a non-zero value if all of the corners are found and they are placed in a certain order (row by row, left to right in every row). Otherwise, if the function fails to find all the corners or reorder them, it returns 0. For example, a regular chessboard has 8 x 8 squares and 7 x 7 internal corners, that is, points where the black squares touch each other. The detected coordinates are approximate, and to determine their positions more accurately, the function calls cornerSubPix. You also may use the function cornerSubPix with different parameters if returned coordinates are not accurate enough.cornerSubPix():Refines the corner locations.Python: cv2.cornerSubPix(image, corners, winSize, zeroZone, criteria)Parameter:image Input imagecornersInitial coordinates of the input corners and refined coordinates provided for outputwinSize Half of the side length of the search window. For example, if winSize=Size(5,5) , then a 5*2+1 x 5*2+1 = 11 x 11 search window is used.zeroZone Half of the size of the dead region in the middle of the search zone over which the summation in the formula below is not done. It is used sometimes to avoid possible singularities of the autocorrelation matrix. The value of (-1,-1) indicates that there is no such a size.criteria Criteria for termination of the iterative process of corner refinement. That is, the process of corner position refinement stops either after criteria.maxCount iterations or when the corner position moves by less than criteria.epsilon on some iteration.。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
www.opticsjournal.net中国光学期刊网
ARTICLE|论文一种基于OpenCV的摄像机标定新方法ANovelMethodofCameraCalibrationBasedonOpenCV
李明金熊显名张绍兵(桂林电子科技大学电子工程学院,广西桂林541004)LiMingjinXiongXianmingZhangShaobing(SchoolofElectronicEngineering,GuilinUniversityofElectronicTechnology,Guilin,Guangxi541004,China)
摘要针对基于计算机视觉技术的空间方位测量系统研制过程中摄像机标定问题,分析了通用摄像机模型,深入
讨论了镜头的径向畸变和切向畸变对标定精度的影响以及相应的解决办法。介绍了2D平面标定靶标制作规范,给出了一种改进型SUSAN算子进行角点亚像素检测的方法,该方法具有速度快、定位精度高等优点。在VC++6.0环境下调用OpenCV1.0库函数实现了摄像机的标定,在实现过程中充分利用了OpenCV库函数,提高了标定精度和计算效率。关键词摄像机标定;改进型SUSAN算子;OpenCV;镜头畸变;内部参数
AbstractForthecameracalibrationprobleminresearchofspatialpositionmeasurementsystembasedon
computervisiontechnology,thegeneralcameramodelisanalysed,theinfluencesandsolutionsoflensradialdistortionandtangentialdistortionarediscussed.A2Dplanarpatternisbuilt,andanimprovedSUSANoperatorforsub-pixelcornerdetectionisproposed,whichhashighspeedandpositioningaccuracy.ThecameracalibrationusingthelibraryfunctionsofOpenCV1.0inVC++6.0isachieved,whichimprovesthecalibrationaccuracyandcalculationefficiency.Keywordscameracalibration;improvedSUSANoperator;OpenCV;lensdistortion;intrinsicparameter中图分类号:O436doi:10.3788/LOP20094612.0099
1引言基于计算机视觉技术的空间方位测量系统的一个主要任务是根据摄像机获取的图像信息计算三维空间中物体的几何信息。图像上每一点的亮度反映了空间物体表面某点反射光的强度,而该点在图像上的几何位置则与空间物体表面相应点的几何位置有关。这些位置的相互关系由摄像机成像的几何模型所决定,这些几何模型的参数就是摄像机参数,实验与计算这些参数的过程称为摄像机标定[1]。
摄像机标定技术在视觉测量研究中占有非常重
要的地位,是视觉测量工作中开展其他方面研究的基础。目前摄像机标定方法主要分为两大类:传统的摄像机标定方法和摄像机自标定方法。传统的摄像机标定方法,以利用最优化理论的标定算法和透视变换矩阵算法等为代表,这类算法通过建立参照物上三维坐标已知点与其图像点之间的对应关系来计算摄像机的内外参数,精确度高但计算复杂。摄像机自标定方法则不需要标定参照物,直接利用从图像序列中得到的约束关系来计算摄像机的内外参数,但自标定的精确度没有传统标定的高[2,3]。本文在传统摄像机标定的
99论文|ARTICLE激光与光电子学进展2009.12基础上,借助于OpenCV强大的函数库给出了一种基于改进型SUSAN算子[4]进行角点检测的摄像机标定算法,该算法思路清晰,标定精度较高。OpenCV是英特尔公司开发的开放型计算机视觉类库。它在数字图像处理和计算机视觉方面具有强大的功能,可轻松实现物体轮廓跟踪图像的几何处理、形态学处理图像特征提取、背景分离、主动轮廓算法、摄像机的校正、姿势的识别等众多操作[4]。OpenCV中的摄像机标定模块为用户提供了良好的接口,同时支持MS-Windows,Linux平台,具有良好的跨平台移植性,用户可以直接在组件的层次上实现个性化的标定应用,是实际工程当中理想的二次开发工具。2摄像机模型及内外参数为了更好地描述摄像机光学成像过程,根据世界坐标系、摄像机坐标系、像平面坐标系和计算机图像坐标系之间的相互关系[1],本文首先给出了摄像机的通用模型,如图1所示。其中XYZ坐标系为世界坐标系,xyz坐标系为摄像机坐标系,x′y′坐标系为像平面坐标系,uv坐标系为计算机图像坐标系。由于透镜、成像平面与透镜光轴在空间位置上存在偏差等原因,像点、光心和物点并不能保证在同一条直线上,实际中的成像模型并不满足线性关系,而是一种非线性关系,需要引入透镜畸变,定义为x=xd+dx(x,y),y=yd+dy(x,y),(1)式中xd和yd分别表示实际的图像点的坐标,dx和dy表示非线性畸变值的X,Y轴分量。OpenCV中的非线性畸变,定义为dx(x,y)=k1x(x2+y2)+p2(3x2+y2)+2p1xy,dy(x,y)=k2y(x2+y2)+p1(3x2+y2)+2p2xy,(2)式中k1,k2为径向畸变,p1,p2为切向畸变。确定畸变系数是摄像机标定的重要步骤之一。根据通用摄像机模型及其具体的成像模型,考虑摄像机可能出现的各种畸变,三维空间点w(X,Y,Z)的齐次坐标(X,Y,Z,1)在世界坐标系中投影到图像平面上像素坐标系(u,v)的过程为
zcuv1=agu000bv000010RT0001xwywzw1=A·M·Xw=P·Xw,
(3)式中zc为任意比例因子a=f/dx,b=f/dy,f为摄像机的焦距,dx,dy为每一个像素在x轴与y轴方向上的物理尺寸,g是图像坐标轴偏斜度参数,(u0,v0)为摄像机光轴平面交点在图像直角坐标系中的坐标,R为摄像机坐标系相对于世界坐标系的3×3的旋转矩阵,T为摄像机坐标系相对于世界坐标系的3×1平移矩阵,A为摄像机内参数矩阵(内参数矩阵只与摄像机内部结构有关,一旦计算出来,在焦距一定的情况下可以被重复使用),M为摄像机外参数矩阵,P为投影矩阵。
3摄像机标定方法和标定系统实现3.1一种基于改进型SUSAN算子的棋盘格角点亚像素检测在基于2D平面靶标的摄像机标定中,角点位置提取对后续摄像机标定的精度产生重要影响[5],OpenCV中用于角点检测的cvFindChessboardCorners()函数得到的只是一个大概的坐标,不能很好地满足更高精度的摄像机标定,针对这个问题采用了一种改进型SUSAN算子对棋盘格平面模板亚像素级角点进行检测并提取其坐标。首先用sobel算子检测图像边缘,然后对图像边缘处的像素进行SUSAN角点检测,最后用灰度平方重心法[6]进行亚像素角点定位,角点灰度的重心(x0,y0)为
x0=(i,j)∈MΣiw(i,j)(i,j)∈MΣw(i,j),y0=(i,j)∈MΣjw(i,j)
(i,j)∈MΣw(i,j)
,(4)
式中w(i,j)为权值,M是用改进后的SUSAN算子检测到的角点邻域。该方法运算速度快,可以有效地实现角点亚像素定位,其重投影平均误差为0.215pixel。3.2标定系统实现3.2.1标定靶标的制作及其图像拍摄规范在OpenCV中利用这种改进型SUSAN算子进行
图1通用摄像机模型
100www.opticsjournal.net中国光学期刊网
ARTICLE|论文图2摄像机标定算法流程框图角点亚像素检测的摄像机标定方法,同样采用棋盘格平面模板作为标定的靶标。由于靶标的不平整度对标定精度造成的影响远大于随机噪声造成的影响,为了能更好地对角点进行检测,需要对该标定靶标做如下约定:用高质量的纸张在高清晰的激光打印机中打印出棋盘格平面靶标,并粘贴在特制的平面玻璃板上,在棋盘格平面标定模板边缘保留至少一个棋盘格宽的白色空白区域,在对模板进行拍摄时其最好与图像平面成45°角;由于采用最小二乘法进行拟、合迭代,拍摄的图越多,标定的结果就越精确,因此要在光线充足的情况下在不同的角度拍摄至少8幅以上的图像[5]。
3.2.2标定程序的分析及实现OpenCV提供了很多摄像机标定及三维重建方面的库函数,运用这些库函数及OpenCV编程规范,结合改进型SUSAN算子对棋盘格角点进行亚像素检测的方法,中给出摄像机标定算法的流程框图,如图2所示。
读取从摄像机传输进来的多帧标定图像时,用到可以方便存取图像中像素值的IplImage结构,CvPoint2D32f结构用来定义基于二维浮点型的坐标点,CvMat结构用来定义标定用的多通道矩阵;cvLoadImage()函数用来从文件中打开对象;为了提高角点检测的效率和精度,仍然采用cvFindChessboardCorners()函数对输入的图像进行筛选,选出符合标定用的图像,并用cvDrawChessboardCorners()函数在图上画出角点;用cvCreateMat()函数为摄像机的内外部参数、畸变系数、角点在世界坐标系的坐标值以及在图像坐标系中的坐标值开辟内存存储空间。然后用改进型的SUANSAN算子对筛选出的标定图片进行角点的检测,得到标定角点的图像坐标值;将角点在世界坐标系中的坐标值和在图像坐标系中的坐标值经结构转化后传递给cv2CalibrateCameras()函数,初始化所有的输入参数后计算得到摄像机的内参数矩阵、畸变系数向量和每幅标定图像的外参数矩阵;当得到内参数和畸变系数后将这些数值传递给Undistort2()函数,完成对图像的变换,从而抵消掉径向畸变和切向畸变对图像的影响,并用cvShowImage()函数将变换过的图像显示出来,通过对比变换前后的图像判断变换后的图像畸变减小的程度,从而初步验证求得的内参数和畸变系数的可靠性。在进行误差分析时,通过上述求得的内参数和外参数运用cvProjectPoints2()计算出三维角点投影到二维图像平面上的坐标值,再用函数cvNorm()比较计算出的投影坐标与通过角点提取到的投影坐标,从而得到一个误差值;最后将检测出的角点坐标,摄像机的内外参数矩阵、镜头的畸变系数写入到文本文件中并保存下来,当完成上述工作后一定要注意用cvReleaseMat()函数释放前面用cvCreateMat()函数开辟的内存空间,防止内存泄露。