标签:blog http color os io 文件 for 2014
资源下载见:http://download.csdn.net/detail/zhouyelihua/7726907
在Vs2012中只要直接按f5就可以直接对资源中采集的图像进行标定。
而我们将最后的结果以.xml的形式存储下来。这个在工程文件下可以直接找到的
其中外参数,中旋转矩阵存在rotation.xml
位移向量存在translation.xml
内参数:内部矩阵存在Intrinsics.xml
畸变系数存在Distortion.xml
具体程序如下:(改自于<learning opencv>)
#include <cv.h> #include <highgui.h> #include <stdio.h> #include <stdlib.h> int n_boards = 0; //Will be set by input list const int board_dt = 10; int board_w; int board_h; void help(){ printf("Calibration from disk. Call convention:\n\n" " ch11_ex11_1_fromdisk board_w board_h image_list\n\n" "Where: board_{w,h} are the # of internal corners in the checkerboard\n" " width (board_w) and height (board_h)\n" " image_list is space separated list of path/filename of checkerboard\n" " images\n\n" "Hit 'p' to pause/unpause, ESC to quit. After calibration, press any other key to step through the images\n\n"); } int main() { CvCapture* capture; board_w =12; board_h = 12; int board_n = board_w * board_h; CvSize board_sz = cvSize( board_w, board_h ); FILE *fptr = fopen("..\\ConsoleApplication26\\sb.txt","r"); char names[2048]; //COUNT THE NUMBER OF IMAGES: while(fscanf(fptr,"%s ",names)==1){ n_boards++; } rewind(fptr); cvNamedWindow( "Calibration" ); //ALLOCATE STORAGE CvMat* image_points = cvCreateMat(n_boards*board_n,2,CV_32FC1); CvMat* object_points = cvCreateMat(n_boards*board_n,3,CV_32FC1); CvMat* point_counts = cvCreateMat(n_boards,1,CV_32SC1); CvMat* rotation = cvCreateMat(3,1,CV_32FC1); CvMat* translation_vector = cvCreateMat(3,1,CV_32FC1); CvMat* rotation_mat_final = cvCreateMat(3,3,CV_32FC1); CvMat* intrinsic_matrix = cvCreateMat(3,3,CV_32FC1); CvMat* distortion_coeffs = cvCreateMat(4,1,CV_32FC1); IplImage* image = 0;// = cvQueryFrame( capture ); IplImage* gray_image = 0; //for subpixel CvPoint2D32f* corners = new CvPoint2D32f[ board_n ]; int corner_count; int successes = 0; int step; for( int frame=0; frame<n_boards; frame++ ) { fscanf(fptr,"%s ",names); if(image){ cvReleaseImage(&image); image = 0; } image = cvLoadImage( names); if(gray_image == 0 && image) //We'll need this for subpixel accurate stuff gray_image = cvCreateImage(cvGetSize(image),8,1); if(!image) printf("null image\n"); int found = cvFindChessboardCorners( image, board_sz, corners, &corner_count, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS ); //Get Subpixel accuracy on those corners cvCvtColor(image, gray_image, CV_BGR2GRAY); cvFindCornerSubPix(gray_image, corners, corner_count, cvSize(11,11),cvSize(-1,-1), cvTermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 30, 0.1 )); //Draw it cvDrawChessboardCorners(image, board_sz, corners, corner_count, found); cvShowImage( "Calibration", image ); // If we got a good board, add it to our data // if( corner_count == board_n ) { step = successes*board_n; // printf("Found = %d for %s\n",found,names); for( int i=step, j=0; j<board_n; ++i,++j ) { /// CV_MAT_ELEM(*image_points, CvPoint2D32f,0,i) = cvPoint2D32f(corners[j].x,corners[j].y); /// CV_MAT_ELEM(*object_points,CvPoint3D32f,0,i) = cvPoint3D32f(j/board_w, j%board_w, 0.0f); CV_MAT_ELEM(*image_points, float,i,0) = corners[j].x; CV_MAT_ELEM(*image_points, float,i,1) = corners[j].y; CV_MAT_ELEM(*object_points,float,i,0) = j/board_w; CV_MAT_ELEM(*object_points,float,i,1) = j%board_w; CV_MAT_ELEM(*object_points,float,i,2) = 0.0f; } // CV_MAT_ELEM(*point_counts, int,0,successes) = board_n; CV_MAT_ELEM(*point_counts, int,successes,0) = board_n; successes++; } // if( successes == n_boards ) break; int c = cvWaitKey(15); if(c == 'p') { c = 0; while(c != 'p' && c != 27){ c = cvWaitKey(250); } } if(c == 27) return 0; } printf("successes = %d, n_boards=%d\n",successes,n_boards); //ALLOCATE MATRICES ACCORDING TO HOW MANY IMAGES WE FOUND CHESSBOARDS ON /// CvMat* image_points2 = cvCreateMat(1,successes*board_n,CV_32FC2); /// CvMat* object_points2 = cvCreateMat(1,successes*board_n,CV_32FC3); /// CvMat* point_counts2 = cvCreateMat(1,successes,CV_32SC1); CvMat* object_points2 = cvCreateMat(successes*board_n,3,CV_32FC1); CvMat* image_points2 = cvCreateMat(successes*board_n,2,CV_32FC1); CvMat* point_counts2 = cvCreateMat(successes,1,CV_32SC1); //TRANSFER THE POINTS INTO THE CORRECT SIZE MATRICES for(int i = 0; i<successes*board_n; ++i){ /// CV_MAT_ELEM(*image_points2, CvPoint2D32f,0,i) = CV_MAT_ELEM(*image_points, CvPoint2D32f,0,i); /// CV_MAT_ELEM(*object_points2,CvPoint3D32f,0,i) = CV_MAT_ELEM(*object_points,CvPoint3D32f,0,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,0, i) = CV_MAT_ELEM(*point_counts, int,0,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); // cvWaitKey();//Now we have to reallocate the matrices // return 0; // At this point we have all of the chessboard corners we need. // // Initialize the intrinsic matrix such that the two focal // lengths have a ratio of 1.0 // CV_MAT_ELEM( *intrinsic_matrix, float, 0, 0 ) = 1.0f; CV_MAT_ELEM( *intrinsic_matrix, float, 1, 1 ) = 1.0f; printf("cvCalibrateCamera2\n"); cvCalibrateCamera2( object_points2, image_points2, point_counts2, cvGetSize( image ), intrinsic_matrix, distortion_coeffs, NULL, NULL, 0//CV_CALIB_FIX_ASPECT_RATIO ); cvFindExtrinsicCameraParams2( object_points2, image_points2, intrinsic_matrix,distortion_coeffs, rotation,translation_vector ); // Save our work cvRodrigues2(rotation,rotation_mat_final); cvSave("rotation.xml",rotation_mat_final); cvSave("translation.xml",translation_vector); cvSave("Intrinsics.xml",intrinsic_matrix); cvSave("Distortion.xml",distortion_coeffs); // Load test CvMat *intrinsic = (CvMat*)cvLoad("Intrinsics.xml"); CvMat *distortion = (CvMat*)cvLoad("Distortion.xml"); // Build the undistort map which we will use for all // subsequent frames. // IplImage* mapx = cvCreateImage( cvGetSize(image), IPL_DEPTH_32F, 1 ); IplImage* mapy = cvCreateImage( cvGetSize(image), IPL_DEPTH_32F, 1 ); printf("cvInitUndistortMap\n"); cvInitUndistortMap( intrinsic, distortion, mapx, mapy ); // Just run the camera to the screen, now only showing the undistorted // image. // rewind(fptr); cvNamedWindow( "Undistort" ); printf("\n\nPress any key to step through the images, ESC to quit\n\n"); while(fscanf(fptr,"%s ",names)==1){ if(image){ cvReleaseImage(&image); image = 0; } image = cvLoadImage( names); IplImage *t = cvCloneImage(image); cvShowImage( "Calibration", image ); cvRemap( t, image, mapx, mapy ); cvReleaseImage(&t); // cvUndistort2( cvShowImage("Undistort", image); if((cvWaitKey()&0x7F) == 27) break; } return 0; }
标签:blog http color os io 文件 for 2014
原文地址:http://blog.csdn.net/zhouyelihua/article/details/38421377