基于OpenCV的摄像机标定方法的实现
- 格式:pdf
- 大小:279.67 KB
- 文档页数:5
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的摄像机标定算法的研究与实现作者:孙昆穆森邱桂苹赵倩来源:《电子世界》2012年第14期【摘要】摄像机标定是计算机视觉中的一个重要问题。
本文介绍了标定的基本原理,详尽阐述了使用二维模板的标定算法,重点分析了如何借助开源软件OpenCV实现该算法。
实验结果显示,使用OpenCV中的相关函数,可以方便地进行数学计算,简单有效地完成摄像机标定。
【关键词】摄像机标定;内部参数;单应性矩阵;OpenCV1.引言计算机视觉的基本任务之一是从摄像机获取的图像信息出发计算三维空间中物体的几何信息,并由此重建和识别物体。
而空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系是由摄像机成像的几何模型决定的,这些几何模型参数就是摄像机参数。
摄像机标定是确定摄像机内外参数的一个过程,其中内参数的标定是指确定摄像机固有的、与位置参数无关的内部几何与光学参数,包括图像中心坐标(也称主点坐标)、图像纵横比、相机的有效焦距和透镜的畸变失真系数等;外参数的标定是确定摄像机坐标系相对某一世界坐标系的三维位置和方向关系。
目前,摄像机标定技术主要有两种实现方法:(1)基于标定物的方法:需要尺寸已知的标定参照物,通过建立标定物上三维坐标已知点与其图像点之间的对应,利用一定的算法获得摄像机的内外参数。
标定物可以是三维的,也可以是二维共面的。
三维标定物条件下,只需一幅图像就可以求出摄像机的全部内外参数。
但三维标定物的加工和维护比较困难。
二维共面标定物加工维护简单,但一幅图像不足以标出所有的摄像机参数,因此需要简化摄像机模型,或者从不同角度获取多幅图像来同时标出所有的参数。
当应用场合要求的精度很高而且摄像机的参数不经常变化时,这种标定法应为首选。
(2)自标定法:不需要标定物,仅依靠多幅图像对应点之间的关系直接进行标定。
利用了摄像机内部参数自身的约束,而与场景和摄像机运动无关。
该方法非常灵活,但不是很成熟,由于未知参数太多,很难得到稳定的结果。
相机标定过程(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,这个类是作为迭代算法的终⽌条件的,这个类在参考⼿册⾥介绍的很简单,我查了些资料,这⾥介绍⼀下。
学习笔记:使⽤opencv做双⽬测距(相机标定+⽴体匹配+测距).最近在做双⽬测距,觉得有必要记录点东西,所以我的第⼀篇博客就这么诞⽣啦~双⽬测距属于⽴体视觉这⼀块,我觉得应该有很多⼈踩过这个坑了,但⽹上的资料依旧是云⾥雾⾥的,要么是理论讲⼀⼤堆,最后发现还不知道怎么做,要么就是直接代码⼀贴,让你懵逼。
所以今天我想做的,是尽量给⼤家⼀个明确的阐述,并且能够上⼿做出来。
⼀、标定⾸先我们要对摄像头做标定,具体的公式推导在learning opencv中有详细的解释,这⾥顺带提⼀句,这本书虽然确实⽼,但有些理论、算法类的东西⾥⾯还是讲的很不错的,必要的时候可以去看看。
Q1:为什么要做摄像头标定?A: 标定的⽬的是为了消除畸变以及得到内外参数矩阵,内参数矩阵可以理解为焦距相关,它是⼀个从平⾯到像素的转换,焦距不变它就不变,所以确定以后就可以重复使⽤,⽽外参数矩阵反映的是摄像机坐标系与世界坐标系的转换,⾄于畸变参数,⼀般也包含在内参数矩阵中。
从作⽤上来看,内参数矩阵是为了得到镜头的信息,并消除畸变,使得到的图像更为准确,外参数矩阵是为了得到相机相对于世界坐标的联系,是为了最终的测距。
ps1:关于畸变,⼤家可以看到⾃⼰摄像头的拍摄的画⾯,在看矩形物体的时候,边⾓处会有明显的畸变现象,⽽矫正的⽬的就是修复这个。
ps2:我们知道双⽬测距的时候两个相机需要平⾏放置,但事实上这个是很难做到的,所以就需要⽴体校正得到两个相机之间的旋转平移矩阵,也就是外参数矩阵。
Q2:如何做摄像头的标定?A:这⾥可以直接⽤opencv⾥⾯的sample,在opencv/sources/sample/cpp⾥⾯,有个calibration.cpp的⽂件,这是单⽬的标定,是可以直接编译使⽤的,这⾥要注意⼏点:1.棋盘棋盘也就是标定板是要预先打印好的,你打印的棋盘的样式决定了后⾯参数的填写,具体要求也不是很严谨,清晰能⽤就⾏。
之所⽤棋盘是因为他检测⾓点很⽅便,and..你没得选。
基于OpenCV的红外与可见光双摄像机标定方法研究任贵文【摘要】With the development of infrared thermal imaging technology , as well as the advantages of non-con-tact temperature measurement , study of infrared thermal imaging technology is also increasing , And the fusion of in-frared and visible images become the focus of current research , integration of the main difficulty is the calibration of infrared and visible light cameras , for image registration .Based on the versatile camera calibration technique , in the VS2013 environment , combined with the OpenCV open source computer vision library , we developed a set of calibration system for infrared and visible light cameras .The system overcomes the disadvantages of Infrared Image camera can not take clear checkerboard images , and achieving fast , accurate real-time infrared and visible light cameras calibration .%随着红外热成像技术的不断发展,以及其非接触性测温的优点,人们对红外热成像技术的研究也越来越多;其中,红外与可见光图像的融合成为目前研究的热点;融合的主要难点是对红外和可见光摄像机的参数标定,已达到图像配准的目的。
opencv 标定参数使用OpenCV是一个开源的计算机视觉库,广泛应用于图像处理和计算机视觉任务中。
在许多计算机视觉应用中,相机的标定是一个重要的步骤,用于确定相机内部和外部参数,以便准确地测量和分析图像中的物体。
本文将介绍使用OpenCV进行相机标定的参数设置。
相机标定是将相机的内参和外参参数进行估计的过程。
内参包括焦距、主点坐标和畸变参数等,而外参则包括相机的位置和朝向参数。
在进行相机标定之前,需要准备一组已知的三维空间点和对应的二维图像点对,这些点对即为标定板上的特征点。
在OpenCV中,相机标定的参数设置包括标定板的尺寸、标定板上特征点的尺寸、待标定相机的图像尺寸等。
首先,标定板的尺寸是指标定板上特征点的行列数,通过设置这些参数可以提供更准确的标定结果。
其次,标定板上特征点的尺寸也需要根据实际情况进行设置,通常选择较大的特征点尺寸可以提高标定的精度。
最后,待标定相机的图像尺寸也需要根据实际情况进行设置,以确保标定结果的准确性。
在进行相机标定之前,还需要设置一些与标定相关的参数,例如用于检测标定板的方法、标定板上特征点的检测阈值等。
OpenCV提供了多种方法用于检测标定板,例如使用棋盘格或圆点阵列等。
根据实际情况选择合适的检测方法可以提高标定的准确性。
此外,还可以设置标定板上特征点的检测阈值,通过调整这个参数可以提高标定的鲁棒性。
在进行相机标定时,还需要设置一些与优化相关的参数,例如优化算法的类型、最大迭代次数等。
OpenCV提供了多种优化算法,例如Levenberg-Marquardt算法、高斯牛顿算法等。
根据实际情况选择合适的优化算法可以提高标定的精度。
此外,还可以设置最大迭代次数,通过增加迭代次数可以提高标定的收敛性。
在进行相机标定时,还需要设置一些与畸变矫正相关的参数,例如是否进行畸变矫正、畸变矫正的类型等。
OpenCV提供了多种畸变矫正方法,例如简单的多项式模型和更复杂的鱼眼模型等。
opencv的相机标定方法
OpenCV提供了多种相机标定方法,其中最常用的是棋盘格标
定法。
下面是使用棋盘格标定相机的步骤:
1. 准备一副棋盘格图片,棋盘格的每个方格必须是完整的黑白交替的。
2. 使用摄像机拍摄多幅图片,确保棋盘格图片处于不同的位置和角度,同时保持棋盘格在整个图像中都可见。
3. 初始化标定板格点的三维坐标数组和图像中对应点的二维坐标数组。
4. 使用OpenCV的函数`findChessboardCorners()`在每个图像中
查找棋盘格的角点,并将其保存在图像对应的二维坐标数组中。
5. 使用OpenCV的函数`drawChessboardCorners()`在每个图像
上绘制出检测到的角点。
6. 使用OpenCV的函数`calibrateCamera()`计算相机的畸变系数和相机矩阵。
7. 使用OpenCV的函数`undistort()`去除图像的畸变。
8. 使用OpenCV的函数`imshow()`显示校正前后的图像进行对比。
9. 使用OpenCV的函数`getOptimalNewCameraMatrix()`获取校正后图像的新相机矩阵。
10. 使用OpenCV的函数`initUndistortRectifyMap()`获取校正后图像的映射矩阵。
11. 使用OpenCV的函数`remap()`将原始图像映射到校正后图像。
通过以上方法,可以完成相机的标定和校正,得到更准确的图像处理结果。