摄像机定标opencv程序

2018-12-17 16:48

#include \#include #include #include

using namespace cvut; using namespace std;

#pragma comment(lib,\#pragma comment(lib,\#pragma comment(lib,\

void main() {

ifstream fin(\定标所用图像文件的路径 */

ofstream fout(\保存定标结果的文件 */

读取每一幅图像,从中提取出角点,然后对角点进行亚像素精确化

*************************************************************************/ cout<<\开始提取角点………………\int image_count=0; /* 图像数量 */ CvSize image_size; /* 图像的尺寸 */

CvSize board_size = cvSize(5,7); /* 定标板上每行、列的角点数 */ CvPoint2D32f*

image_points_buf

=

new

/************************************************************************

CvPoint2D32f[board_size.width*board_size.height]; /* 缓存每幅图像上检测到的角点 */

Seq image_points_seq; /* 保存检测到的所有角点 */

string filename;

while (getline(fin,filename)) {

image_count++; int count;

Image view(filename); if (image_count == 1) { }

/* 提取角点 */

if (0 == cvFindChessboardCorners( view.cvimage, board_size, {

cout<<\exit(1);

image_size.width = view.size().width; image_size.height = view.size().height;

image_points_buf, &count, CV_CALIB_CB_ADAPTIVE_THRESH ))

} else {

}

}

Image view_gray(view.size(),8,1); rgb2gray(view,view_gray); /* 亚像素精确化 */ cvFindCornerSubPix(

view_gray.cvimage,

image_points_buf,

count,

cvSize(11,11),

cvSize(-1,-1), cvTermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 30,

0.1 ));

image_points_seq.push_back(image_points_buf,count); /* 在图像上显示角点位置 */

cvDrawChessboardCorners( view.cvimage, board_size, image_points_buf, view.show(\cvWaitKey(); view.close();

count, 1);

delete []image_points_buf; cout<<\角点提取完成!\\n\

/************************************************************************ 摄像机定标

*************************************************************************/ cout<<\开始定标………………\

CvSize square_size = cvSize(10,10); /* 实际测量得到的定标板上每个棋盘格的大小 */ Matrix object_points(1,board_size.width*board_size.height*image_count,3); Matrix image_points(1,image_points_seq.cvseq->total,2); /* 保存提取的所有Matrix point_counts(1,image_count,1); /* 每幅图像中角点的数量 */ Matrix intrinsic_matrix(3,3,1); /* 摄像机内参数矩阵 */

Matrix distortion_coeffs(1,4,1); /* 摄像机的4个畸变系数:k1,k2,p1,p2 */ Matrix rotation_vectors(1,image_count,3); /* 每幅图像的旋转向量 */ Matrix translation_vectors(1,image_count,3); /* 每幅图像的平移向量 */

/* 保存定标板上角点的三维坐标 */ 角点 */

/* 初始化定标板上角点的三维坐标 */ int i,j,t;

for (t=0;t

for (i=0;i

for (j=0;j

/* 假设定标板放在世界坐标系中z=0的平面上 */

object_points(0,t*board_size.height*board_size.width+i*board_size.width+j,0) =

i*square_size.width;

0; */

object_points(0,t*board_size.height*board_size.width+i*board_size.width+j,1) =

j*square_size.height;

object_points(0,t*board_size.height*board_size.width+i*board_size.width+j,2) = }

/* 将角点的存储结构转换成矩阵形式 */

for (i=0;itotal;i++) { }

/* 初始化每幅图像中的角点数量,这里我们假设每幅图像中都可以看到完整的定标板 */ for (i=0;i

/* 开始定标 */

cvCalibrateCamera2(object_points.cvmat,

/************************************************************************ 对定标结果进行评价

*************************************************************************/ cout<<\开始评价定标结果………………\\n\

double total_err = 0.0; /* 所有图像的平均误差的总和 */ double err = 0.0; /* 每幅图像的平均误差 */

Matrix image_points2(1,point_counts(0,0,0),2); /* 保存重新计算得到的投影点

image_points.cvmat, image_size,

distortion_coeffs.cvmat, translation_vectors.cvmat, 0);

point_counts(0,i) = board_size.width*board_size.height; image_points(0,i,0) = image_points_seq[i].x; image_points(0,i,1) = image_points_seq[i].y; }

}

point_counts.cvmat, intrinsic_matrix.cvmat, rotation_vectors.cvmat,

cout<<\定标完成!\\n\

cout<<\每幅图像的定标误差:\\n\fout<<\每幅图像的定标误差:\\n\for (i=0;i

at,

/* 通过得到的摄像机内外参数,对空间的三维点进行重新投影计算,得到新的投影点 */

cvProjectPoints2(object_points.get_cols(i*point_counts(0,0,0),(i+1)*point_count

err

rotation_vectors.get_col(i).cvmat, translation_vectors.get_col(i).cvmat, intrinsic_matrix.cvmat, distortion_coeffs.cvmat, image_points2.cvmat, 0,0,0,0);

=

s(0,0,0)-1).cvmat,

/* 计算新的投影点和旧的投影点之间的误差*/

cvNorm(image_points.get_cols(i*point_counts(0,0,0),(i+1)*point_counts(0,0,0)-1).cvm

}

cout<<\总体平均误差:\像素\fout<<\总体平均误差:\像素\cout<<\评价完成!\\n\

/************************************************************************ 保存定标结果

*************************************************************************/ cout<<\开始保存定标结果………………\

Matrix rotation_vector(3,1); /* 保存每幅图像的旋转向量 */ Matrix rotation_matrix(3,3); /* 保存每幅图像的旋转矩阵 */

fout<<\相机内参数矩阵:\\n\fout<

fout<

fout<<\第\幅图像的旋转向量:\\n\fout<

/* 将旋转向量转换为相对应的旋转矩阵 */

cvRodrigues2(rotation_vector.cvmat,rotation_matrix.cvmat);

rotation_vector(j,0,0) = rotation_vectors(0,i,j);

image_points2.cvmat, CV_L1);

total_err += err/=point_counts(0,0,0);

cout<<\第\幅图像的平均误差:\像素\fout<<\第\幅图像的平均误差:\像素\

}

}

fout<<\第\幅图像的旋转矩阵:\\n\fout<

fout<<\第\幅图像的平移向量:\\n\fout<

cout<<\完成保存\\n\


摄像机定标opencv程序.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:初一上期末数学培优强化训练16(教师版)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: