当前位置:文档之家› 标签摄像机标定

标签摄像机标定

标签:摄像机标定opencv标定程序的代码(完全测试好的)这个是我在win32 平台下写的程序,测试完全通过:不过要注意下面的问题:(1)opencv库是1.0的,我在vc6.0的平台使用(2)软件的设置要正确(3)图片载入的时候,使用的是批处理文件(其实就是建一个txt文件,里面写的和dos下面的操作代码一样的输入)(4)里面现在还有个问题没有解决:在得到角点坐标的时候,cvFind CornerSubPix里面的搜索区域还不明白(05)下面是我在网上搜的别人的代:测试通过的:=====================下面是我的代码:/*标定的过程:图片的加载角点的检测提取角点精确坐标参数求解利用参数对图像进行矫正*/#include<stdio.h>#include"cv.h"#include"highgui.h"#include <stdlib.h>//函数声明void PrintMat(CvMat *matrix,BOOL save_or_show,FILE *fp);int main(int argc,char **argv){int i=1;char k=0;int CurrentImage = 0;int CurrentRow = 0; //行int CurrentColumn = 0; //列int findcorner_result=0;FILE *fp; //文件指针int ChessBoardSize_w =6; //角点个数int ChessBoardSize_h =7;int width_pixel =1280; //像素int high_pixel =1024;float SquareSize=10; //棋盘大小int NImages=16;CvSize ChessBoardSize;CvSize image_pixel;int NPoints=0;int *corner_counter;float *temppoints; //这里可以使用内存动态存储管理。

CvPoint2D32f *corners; //存储角点坐标的数组//单通道灰度图像IplImage *grayimage=0;IplImage *srcimage=0; //三通道图像IplImage *result_image=0; //矫正以后的图像CvMat *intrinsic_matrix=0; //内部参数矩阵CvMat *distortion_coeffs=0; //畸变系数CvMat *rotation_vectors=0; //旋转向量CvMat *translation_vectors=0;//平移向量CvMat *points_counts=0; //图片角点数CvMat *object_points=0; //世界坐标系中角点的坐标CvMat *image_points=0; //检测到的角点坐标CvMat *temp_matrix,*rotation_matrix,*translation_matrix;//*****************************************************//数据载入、开辟空间image_pixel = cvSize(width_pixel,high_pixel); ChessBoardSize = cvSize(ChessBoardSize_w,ChessBoardSize_h);NPoints = ChessBoardSize_w*ChessBoardSize_h; corner_counter=calloc(NImages,sizeof(int)); //动态管理,记着释放空间temppoints =calloc(NImages*NPoints*3,sizeof(float));corners =calloc(NImages*NPoints,sizeof(CvPoint2D32f));if((corner_counter==0 )||(temppoints==0 )||( corners==0 ) ){return -1;}intrinsic_matrix = cvCreateMat(3,3,CV_32FC1); //内参数矩阵distortion_coeffs = cvCreateMat(1,4,CV_32FC1); //形变参数rotation_vectors = cvCreateMat(NImages,3,CV_32FC1); //旋转向量translation_vectors = cvCreateMat(NImages,3,CV_32FC1); //平移向量points_counts = cvCreateMat(NImages,1,CV_32SC1); //视图数目object_points = cvCreateMat(NImages*NPoints,3,CV_32FC1);//世界坐标系中角点的坐标image_points = cvCreateMat(NImages*NPoints,2,CV_32FC1);//检测到的坐标点坐标temp_matrix= cvCreateMat(1,3,CV_32FC1);rotation_matrix = cvCreateMat(3,3,CV_32FC1); //旋转矩阵translation_matrix = cvCreateMat(3,3,CV_32FC1); //旋转矩阵grayimage=cvCreateImage(image_pixel,IPL_DEPTH_8U,1); //单通道灰度图像result_image=cvCreateImage(image_pixel,IPL_DEPTH_8U,1); //校正以后的图像fp = fopen( "data1.txt", "w+" ); //打开文件,建立一个文件,然后写入数据fprintf(fp, "坐标数据:\n" ); //写入数据,写入文件//****************************************************//图片的加载以及角点的提取if(argc!=NImages+1){printf("图片加载有误!");return -1;}for(CurrentImage=0;CurrentImage<NImages;CurrentImage++){//加载图片if((srcimage=cvLoadImage(argv[CurrentImage+1],1))!=0){//色彩转换cvCvtColor(srcimage,grayimage,CV_BGR2GRAY);//角点检测findcorner_result=cvFindChessboardCorners(grayimage,Che ssBoardSize,&corners[CurrentImage*NPoints],&corner_counter[CurrentImage], CV_CALIB_CB_ADAPTIVE_THRESH);//画出检测到的点cvDrawChessboardCorners(srcimage,ChessBoardSize,&corners[CurrentImage*NPoints],corner_counter[CurrentImage],findcorner_result);//精确坐标位置cvFindCornerSubPix(grayimage,&corners[CurrentImage*NPo ints],corner_counter[CurrentImage],cvSize(10,10), cvSize(-1,-1),//这个搜索的范围。

?cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,500,0.003)//迭代终止条件);cvNamedWindow("image",1);cvShowImage("image",srcimage);printf("检测到的角点:%d\n",corner_counter[CurrentImage]);//fprintf(fp,"检测到的角点:%d\n",corner_counter[CurrentImage]);//for(i=0;i<corner_counter[CurrentImage];i++)//坐标输出// {// printf("第%d个角点%f %f\n",i,corners[CurrentImage*N Points+i].x,corners[CurrentImage*NPoints+i].y);//}cvWaitKey(0);printf("按任意键提取下一幅图片角点。

\n");//fprintf(fp,"按任意键提取下一幅图片角点。

\n");}}printf("角点提取结束......\n");printf("开始定标......\n");fprintf(fp,"角点提取结束......\n");fprintf(fp,"开始定标......\n");//棋盘世界坐标系坐标for(CurrentImage = 0 ; CurrentImage < NImages ; CurrentImage++)//图片{for (CurrentRow = 0; CurrentRow < ChessBoardSize_h; CurrentRow++)//行{for (CurrentColumn = 0; CurrentColumn < ChessBoardSize_w; CurrentColumn++)//列{temppoints[(CurrentImage*NPoints*3)+(CurrentRow*Ches sBoardSize_w+CurrentColumn)*3]=(float)(CurrentRow*SquareSize);temppoints[(CurrentImage*NPoints*3)+(CurrentRow*Ches sBoardSize_w+CurrentColumn)*3+1]=(float)(CurrentColumn*SquareSize);temppoints[(CurrentImage*NPoints*3)+(CurrentRow*Ches sBoardSize_w+CurrentColumn)*3+2]=0;}}}//参数求解*object_points=cvMat(NImages*NPoints,3,CV_32FC1,temppoints); //似乎这里开始有点问题。

相关主题