相机标定程序

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

/*环境OpenCV2.3.1+visual studio2010

*calibdata.txt 保持标定图片的路径(根据实际设置)

*/

#include "stdafx.h"

#include "cv.h"

#include "highgui.h"

#include

#include

#include

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<<"第"<

cvNamedWindow("RePlay",1);

cvShowImage("RePlay",show);

cvWaitKey(0);

}

else

{ //找到标定板角点时

cout<<"第"<

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

{

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;

相关文档
最新文档