相机标定程序
- 格式:docx
- 大小:21.47 KB
- 文档页数:8
visionmaster标定流程摘要:1.引言2.Visionmaster 标定流程概述3.Visionmaster 标定流程步骤详解3.1 准备阶段3.2 采集图像3.3 特征点检测3.4 特征点匹配3.5 标定参数计算3.6 标定结果验证4.Visionmaster 标定流程的优点与局限性5.结论正文:【引言】在计算机视觉领域,相机标定是一个重要的环节。
通过相机标定,我们可以获取相机的内部参数,从而将相机捕捉到的二维图像映射到三维世界坐标系中。
Visionmaster 是一款广泛应用于相机标定的软件,其标定流程具有较高的精度和可靠性。
本文将对Visionmaster 的标定流程进行详细介绍。
【Visionmaster 标定流程概述】Visionmaster 相机标定流程主要包括以下几个步骤:准备阶段、采集图像、特征点检测、特征点匹配、标定参数计算和标定结果验证。
整个流程采用基于棋盘格的标定方法,具有操作简单、结果精确等特点。
【Visionmaster 标定流程步骤详解】【3.1 准备阶段】在标定流程开始之前,需要准备一个棋盘格,并将其放置在拍摄场景中。
棋盘格通常由黑白相间的正方形组成,以便于后续的图像处理。
【3.2 采集图像】使用相机拍摄包含棋盘格的场景,并获取一系列图像。
为了提高标定精度,建议采集多张图像,并在不同角度和光照条件下进行拍摄。
【3.3 特征点检测】对采集到的图像进行特征点检测,以便于后续的特征点匹配。
Visionmaster 支持多种特征点检测算法,如SIFT、SURF 和ORB 等。
【3.4 特征点匹配】在检测到特征点后,需要对不同图像间的特征点进行匹配。
Visionmaster 提供了一些特征点匹配算法,如暴力匹配、FLANN 匹配等。
通过匹配,可以得到一系列匹配较好的特征点对。
【3.5 标定参数计算】根据匹配到的特征点对,可以计算出相机的内部参数,如焦距、光心坐标等。
Visionmaster 采用基于最小二乘法的方法计算标定参数,可以获得较高的精度。
相机标定的步骤介绍相机标定是计算机视觉领域中的重要技术之一,用于计算相机的内参数和外参数。
通过相机标定,可以准确地测量3D物体的位置和尺寸,提高图像处理算法的精度和鲁棒性。
本文将介绍相机标定的步骤,包括相机标定的背景知识、标定板的选择和布置、图像采集和提取角点信息、计算相机的内参数和外参数等内容。
背景知识在进行相机标定之前,需要了解以下几个关键概念:1.相机内参数:包括焦距、主点坐标和径向畸变等参数,用于描述相机的成像特性。
2.相机外参数:包括相机的旋转矩阵和平移向量,用于描述相机在三维空间中的位置和姿态。
3.畸变模型:常用的有径向畸变和切向畸变,用来描述相机成像时的畸变特性。
标定板的选择和布置选择合适的标定板非常重要,常见的标定板有棋盘格、圆网格等。
1.棋盘格标定板:优点是结构简单,易于制作和辨识。
缺点是对光照条件和角度较敏感。
2.圆网格标定板:优点是对光照条件和角度不敏感,稳定性较好。
缺点是制作和辨识相对复杂。
无论选择哪种标定板,都需要确保标定板的样式规整、边缘清晰,以及标定板相对于相机位置的固定。
图像采集和提取角点信息进行相机标定前,需要采集一组包含标定板的图像,并从图像中提取出角点信息。
1.图像采集:应尽量保证光照均匀、避免阴影和反光等干扰因素。
拍摄时应覆盖不同姿态、角度和距离的标定板样本。
2.角点提取:利用图像处理算法,提取标定板图像上的角点信息。
常用的算法有Harris角点检测、Shi-Tomasi角点检测等。
对于每一张标定板图像,需要提取出角点的像素坐标,并与标定板上的物理坐标进行对应。
标定板上的物理坐标可以通过测量标定板尺寸得到。
标定参数计算通过采集的图像和提取的角点信息,可以利用数学模型计算相机的内参数和外参数。
1.内参数计算:通过最小二乘法或非线性优化等方法,根据已知的角点坐标和标定板上的物理坐标,求解出相机的焦距、主点坐标和径向畸变等参数。
2.外参数计算:利用求解PnP问题的算法,根据已知的角点坐标和标定板上的物理坐标,求解出相机的旋转矩阵和平移向量。
机器人视觉相机的标定流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!机器人视觉相机的标定流程一般包括以下步骤:1. 准备标定板选择合适的标定板,标定板的尺寸和图案应根据相机的视野和精度要求进行选择。
相机标定过程(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,这个类是作为迭代算法的终⽌条件的,这个类在参考⼿册⾥介绍的很简单,我查了些资料,这⾥介绍⼀下。
工业相机标定是指对工业相机进行参数校准和调整,以确保图像获取的准确性和精度。
以下是一般工业相机标定的步骤:
相机内部参数标定:这包括对相机的焦距、主点坐标、畸变等内部参数进行标定。
常用的方法是使用标定板,将标定板置于相机前方,采集多个不同位置和角度的图像,然后通过图像处理算法计算得出内部参数。
相机外部参数标定:这包括对相机的位置、姿态和视角等外部参数进行标定。
常用的方法是使用标定板或者特征点,在已知世界坐标系下,采集多个不同位置和角度的图像,通过图像处理算法计算得出外部参数。
畸变校正:在相机内部参数标定的过程中,通常会得到相机的畸变参数,包括径向畸变和切向畸变。
通过应用畸变校正算法,可以将图像中的畸变进行校正,使得图像中的物体形状更准确。
图像尺度校正:在进行相机标定时,通常会获得一个尺度因子,用于将图像中的像素坐标映射到真实世界中的实际坐标。
通过应用图像尺度校正算法,可以将图像中的像素坐标转换为实际物理坐标,实现准确的测量和定位。
标定结果评估:对标定结果进行评估,包括重投影误差的计算和评估。
重投影误差是指将标定后的相机参数应用于标定图像,并计算重投影点与实际点之间的误差。
评估结果可以帮助确定标定的准确性和可靠性。
如何使用相机标定法提高拍摄效果相机标定法是一种基于数学模型的技术,可用于提高相机拍摄的
精度和稳定性。
根据相机标定法,我们可以校准相机的参数,包括焦距、畸变、旋转和平移等,以便获得更加准确、清晰的图像。
以下是使用相机标定法提高拍摄效果的步骤。
第一步:准备标定板
标定板是进行相机标定法的必要条件。
标定板通常包括黑白方格、圆形和椭圆形等,用于计算相机镜头的畸变和旋转参数等。
标定板必
须在拍摄时保持平整,其边缘必须对齐平面或垂直面。
同时,标定板
必须避免反光和色差等问题,以免干扰标定结果。
第二步:拍摄标定板
使用相机拍摄标定板时,保持相机位置不变,按照不同的拍摄角度、方向和距离进行拍摄,以获得不同场景下的标定图像。
拍摄时,
要注意避免图像失真和运动模糊等问题。
第三步:标定相机
通过标定板的拍摄图像,可以使用相机标定算法计算相机的内外
参数,包括相机的内部参数矩阵、外部参数旋转矩阵和平移矩阵等。
一旦获得了相机的参数,就可以使用这些参数来进行相机镜头的畸变
校正、图像矫正和增强等操作,提高拍摄的精度和稳定性。
第四步:应用标定参数
一旦获得了相机的标定参数,可以将其应用于实际拍摄中。
在拍摄时,将相机的参数设置为标定参数即可。
使用标定参数拍摄得到的图像将具有更高的准确性、清晰度和稳定性,更加符合实际场景。
总之,相机标定法是一种非常有用的相机技术,可以优化相机拍摄的质量和效果,特别适用于需要高精度、高稳定度的应用领域。
如果您想要提高相机拍摄的精度和稳定性,相机标定法是您需要了解和掌握的知识。
halcon相机标定方法【实用版3篇】《halcon相机标定方法》篇1Halcon相机标定方法可以采用以下步骤:1. 确定畸变系数。
畸变系数表示相机成像过程中的畸变程度,其值介于0和0.00001之间。
在标定过程中,需要确定畸变系数。
2. 确定标定板。
标定板是用于相机标定的已知几何信息的板状物体。
标定板通常由一系列等边直角三角形组成,每条边上都有四个角,共12个点。
这些角可以用于计算相机的内部参数和畸变系数。
3. 获取标定板图像。
获取标定板图像并将其输入到Halcon中。
4. 提取角点信息。
使用Halcon中的“find_features”函数来提取标定板图像中的角点信息。
该函数将自动检测图像中的角点,并返回其坐标和类型。
5. 计算相机内部参数。
使用提取的角点信息,结合Halcon中的“find_feature_points”函数和“find_feature_matches”函数,可以计算相机的内部参数和畸变系数。
6. 验证标定结果。
为了验证标定结果,可以使用Halcon中的“check_calib”函数来检查相机内部参数和畸变系数是否正确。
以上是Halcon相机标定的基本步骤。
《halcon相机标定方法》篇2Halcon相机标定方法有:1. 传统六点标定法。
这种方法是通过一个平面上的六个点的位置来确定整个平面的几何参数,进而求得相机的内参数。
2. 棋盘格标定法。
棋盘格标定法是通过棋盘格上两组对应点的几何约束,解算出相机的畸变系数。
3. 标定板标定法。
《halcon相机标定方法》篇3Halcon相机标定方法有以下几个步骤:1. 建立棋盘格点在Halcon中,建立棋盘格点需要指定格点在图像中的实际坐标,这样可以正确计算出畸变系数。
如果只指定棋盘格在图像中的尺寸和数量,那么在畸变计算时会返回默认的(通常是不可靠的)畸变系数。
建立棋盘格点的方法如下:`2x2 to picture :诤友棋盘格(squareSize:[20,20], gridNum:25)`2. 确定相机位置和方向这里有两种方法:方法一:建立一个动态的目标,不断改变目标与相机的距离和角度,然后计算目标的成像位置,从而得到相机的位置和方向。
相机标定拍摄方法相机标定是计算机视觉中的重要任务,它主要是通过确定相机的内部参数和外部参数来将图像中的物体从二维图像坐标变换到三维世界坐标,从而实现对物体的精确测量和三维重构。
相机标定的关键是通过拍摄特定的标定板或者标定物体来获取一组已知的图像特征点,并利用这些特征点进行参数估计。
以下是一种常见的相机标定拍摄方法,包括准备工作、标定板的选择、图像采集、特征提取和参数估计等步骤。
准备工作:1.确保相机处于稳定的状态,并解除相机上的自动设置,如自动对焦、自动曝光和自动白平衡等。
2.准备一个标定板或者标定物体,要求表面上具有明显的特征,如棋盘格、圆点阵列或灰度平面等。
3. 安装相机标定软件或库,如OpenCV,以便进行后续图像处理和参数估计。
标定板的选择:1.标定板的尺寸应该足够大,以填满相机视野中的大部分区域。
2.标定板的形状和特征应该容易检测和提取。
3.标定板的材质和颜色应该与实际应用场景保持一致,以确保标定结果在实际应用中的准确性。
图像采集:1.将标定板放置在相机视野内,确保标定板平面与相机成像平面平行。
2.对相机进行适当的调整,以使标定板的特征点在图像中呈现出良好的分辨率和对比度。
3.拍摄一系列包含标定板的图像,尽量覆盖不同的角度、距离和姿态。
特征提取:1.对于棋盘格标定板,利用图像处理算法提取棋盘格角点,得到图像中的特征点坐标。
2.对于其他类型的标定板,如圆点阵列或灰度平面,同样利用图像处理算法提取特征点坐标。
参数估计:1.利用提取到的图像特征点坐标和已知的标定板或物体的实际尺寸,进行相机内部参数的估计,如焦距、畸变系数和主点偏移等。
2.利用估计的相机内部参数和图像特征点坐标,进行相机的外部参数估计,如相机位置和姿态。
相机标定的最终目标是得到精确的相机内外参数,以便在应用中实现准确的物体测量和三维重构。
标定结果可以用于矫正图像畸变、进行物体测量和姿态估计等任务。
需要注意的是,相机标定过程中的数据采集和图像处理需要一定的专业知识和经验。
/*环境OpenCV2.3.1+visual studio2010*calibdata.txt 保持标定图片的路径(根据实际设置)*/#include "stdafx.h"#include "cv.h"#include "highgui.h"#include <string>#include <iostream>#include <fstream>using namespace std;int main(){IplImage * show; //RePlay图像指针cvNamedWindow("RePlay",1);int number_image_copy=7; //复制图像帧数CvSize board_size=cvSize(5,7); //标定板角点数CvSize2D32f square_size=cvSize2D32f(10,10); //假设我的每个标定方格长宽都是1.82厘米float square_length=square_size.width; //方格长度float square_height=square_size.height; //方格高度int board_width=board_size.width; //每行角点数int board_height=board_size.height; //每列角点数int total_per_image=board_width*board_height; //每张图片角点总数int count; //存储每帧图像中实际识别的角点数int found;//识别标定板角点的标志位int step; //存储步长,step=successes*total_per_image;int successes=0; //存储成功找到标定板上所有角点的图像帧数int a=1; //临时变量,表示在操作第a帧图像const int NImages = 7;//图片总数CvMat *rotation_vectors;CvMat *translation_vectors;CvPoint2D32f * image_points_buf = new CvPoint2D32f[total_per_image]; //存储角点图像坐标的数组CvMat * image_points=cvCreateMat(NImages*total_per_image,2,CV_32FC1); //存储角点的图像坐标的矩阵CvMat * object_points=cvCreateMat(NImages*total_per_image,3,CV_32FC1); //存储角点的三维坐标的矩阵CvMat * point_counts=cvCreateMat(NImages,1,CV_32SC1); //存储每帧图像的识别的角点数CvMat * intrinsic_matrix=cvCreateMat(3,3,CV_32FC1);//内参数矩阵CvMat * distortion_coeffs=cvCreateMat(5,1,CV_32FC1); //畸变系数rotation_vectors = cvCreateMat(NImages,3,CV_32FC1);//旋转矩阵translation_vectors = cvCreateMat(NImages,3,CV_32FC1);//平移矩阵ifstream fin("calibdata.txt"); /* 定标所用图像文件的路径*/while(a<=number_image_copy){//sprintf_s (filename,"%d.jpg",a);string filename;getline(fin,filename);show=cvLoadImage(filename.c_str(),1);//寻找棋盘图的内角点位置found=cvFindChessboardCorners(show,board_size,image_points_buf,&count,CV_CALIB_CB_ADAPTIVE_THRESH|CV_CALIB_CB_FILTER_QUADS);if (found==0){ //如果没找到标定板角点时cout<<"第"<<a<<"帧图片无法找到棋盘格所有角点!\n\n";cvNamedWindow("RePlay",1);cvShowImage("RePlay",show);cvWaitKey(0);}else{ //找到标定板角点时cout<<"第"<<a<<"帧图像成功获得"<<count<<"个角点...\n";cvNamedWindow("RePlay",1);IplImage * gray_image= cvCreateImage(cvGetSize(show),8,1);cvCvtColor(show,gray_image,CV_BGR2GRAY);cout<<"获取源图像灰度图过程完成...\n";cvFindCornerSubPix(gray_image,image_points_buf,count,cvSize(11,11),cvSize(-1,-1),cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER,30,0.1));cout<<"灰度图亚像素化过程完成...\n";cvDrawChessboardCorners(show,board_size,image_points_buf,count,found);cout<<"在源图像上绘制角点过程完成...\n\n";cvShowImage("RePlay",show);cvWaitKey(0);}if(total_per_image==count){step=successes*total_per_image; //计算存储相应坐标数据的步长for(int i=step,j=0;j<total_per_image;++i,++j){CV_MAT_ELEM(*image_points, float,i,0)=image_points_buf[j].x;CV_MAT_ELEM(*image_points, float,i,1)=image_points_buf[j].y;CV_MAT_ELEM(*object_points,float,i,0)=(float)((j/board_width)*square_length);CV_MAT_ELEM(*object_points,float,i,1)=(float)((j%board_width)*square_height);CV_MAT_ELEM(*object_points,float,i,2)=0.0f;}CV_MAT_ELEM(*point_counts,int,successes,0)=total_per_image;successes++;}a++;}cvReleaseImage(&show);cvDestroyWindow("RePlay");cout<<"*********************************************\n";cout<<NImages<<"帧图片中,标定成功的图片为"<<successes<<"帧...\n";cout<<NImages<<"帧图片中,标定失败的图片为"<<NImages-successes<<"帧...\n\n";cout<<"*********************************************\n\n";cout<<"按任意键开始计算摄像机内参数...\n\n";/*CvCapture* capture1;capture1 = cvCreateCameraCapture(0);*/IplImage * show_colie;show_colie = cvLoadImage("D:\\openCV\\my_own_code\\Calibration3\\Calibration3\\image\\chess4.jpg",1);CvMat * object_points2 = cvCreateMat(successes*total_per_image,3,CV_32FC1);CvMat * image_points2 = cvCreateMat(successes*total_per_image,2,CV_32FC1);CvMat * point_counts2 = cvCreateMat(successes,1,CV_32SC1);for(int i=0;i<successes*total_per_image;++i){CV_MAT_ELEM(*image_points2, float,i,0)=CV_MAT_ELEM(*image_points, float,i,0);CV_MAT_ELEM(*image_points2, float,i,1)=CV_MAT_ELEM(*image_points, float,i,1);CV_MAT_ELEM(*object_points2,float,i,0)=CV_MAT_ELEM(*object_points,float,i,0);CV_MAT_ELEM(*object_points2,float,i,1)=CV_MAT_ELEM(*object_points,float,i,1);CV_MAT_ELEM(*object_points2,float,i,2)=CV_MAT_ELEM(*object_points,float,i,2);}for(int i=0;i<successes;++i){CV_MAT_ELEM(*point_counts2,int,i,0) = CV_MAT_ELEM(*point_counts,int,i,0);}cvReleaseMat(&object_points);cvReleaseMat(&image_points);cvReleaseMat(&point_counts);CV_MAT_ELEM(*intrinsic_matrix,float,0,0)=1.0f;CV_MAT_ELEM(*intrinsic_matrix,float,1,1)=1.0f;cvCalibrateCamera2(object_points2,image_points2,point_counts2,cvGetSize(show_colie), intrinsic_matrix,distortion_coeffs,rotation_vectors,translation_vectors,0);cout<<"摄像机内参数矩阵为:\n";cout<<CV_MAT_ELEM(*intrinsic_matrix,float,0,0)<<""<<CV_MAT_ELEM(*intrinsic_matrix,float,0,1)<<" "<<CV_MAT_ELEM(*intrinsic_matrix,float,0,2)<<"\n\n";cout<<CV_MAT_ELEM(*intrinsic_matrix,float,1,0)<<""<<CV_MAT_ELEM(*intrinsic_matrix,float,1,1)<<" "<<CV_MAT_ELEM(*intrinsic_matrix,float,1,2)<<"\n\n";cout<<CV_MAT_ELEM(*intrinsic_matrix,float,2,0)<<""<<CV_MAT_ELEM(*intrinsic_matrix,float,2,1)<<" "<<CV_MAT_ELEM(*intrinsic_matrix,float,2,2)<<"\n\n";cout<<"畸变系数矩阵为:\n";cout<<CV_MAT_ELEM(*distortion_coeffs,float,0,0)<<""<<CV_MAT_ELEM(*distortion_coeffs,float,1,0)<<" "<<CV_MAT_ELEM(*distortion_coeffs,float,2,0)<<" "<<CV_MAT_ELEM(*distortion_coeffs,float,3,0)<<" "<<CV_MAT_ELEM(*distortion_coeffs,float,4,0)<<"\n\n";cvSave("Intrinsics.xml",intrinsic_matrix);cvSave("Distortion.xml",distortion_coeffs);cout<<"摄像机矩阵、畸变系数向量已经分别存储在名为Intrinsics.xml、Distortion.xml 文档中\n\n";for(int ii = 0; ii < NImages; ++ii){ float tranv[3] = {0.0};float rotv[3] = {0.0};for ( int i = 0; i < 3; i++){tranv[i] = ((float*)(translation_vectors->data.ptr+ii*translation_vectors->step))[i];rotv[i] = ((float*)(rotation_vectors->data.ptr+rotation_vectors->step))[i];}cout << "第" << ii+1 << "幅图的外参数" << endl;printf("ROTATION VECTOR 旋转向量: \n");printf("[ %6.4f %6.4f %6.4f ] \n", rotv[0], rotv[1], rotv[2]);printf("TRANSLATION VECTOR 平移向量: \n");printf("[ %6.4f %6.4f %6.4f ] \n", tranv[0], tranv[1], tranv[2]);printf("-----------------------------------------\n");}CvMat * intrinsic=(CvMat *)cvLoad("Intrinsics.xml");CvMat * distortion=(CvMat *)cvLoad("Distortion.xml");IplImage * mapx=cvCreateImage(cvGetSize(show_colie),IPL_DEPTH_32F,1);IplImage * mapy=cvCreateImage(cvGetSize(show_colie),IPL_DEPTH_32F,1);cvInitUndistortMap(intrinsic,distortion,mapx,mapy);cvNamedWindow("原始图像",1);cvNamedWindow("非畸变图像",1);cout<<"按‘E’键退出显示...\n\n";/*while(show_colie){*/IplImage * clone=cvCloneImage(show_colie);cvShowImage("原始图像",show_colie);cvRemap(clone,show_colie,mapx,mapy);cvReleaseImage(&clone);cvShowImage("非畸变图像",show_colie);cvWaitKey(0);/*if(cvWaitKey(10)=='e'){break;}*//*show_colie=cvQueryFrame(capture1);}*/return 0;}。