当前位置:文档之家› 相机标定程序

相机标定程序

/*环境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;}。

相关主题