利用cvFindExtrinsicCameraParams2求取相机外参数

cvFindExtrinsicCameraParams2函数的定义:

1 void cvFindExtrinsicCameraParams2( const CvMat* object_points,
2                                    const CvMat* image_points,
3                                    const CvMat* intrinsic_matrix,
4                                    const CvMat* distortion_coeffs,
5                                    CvMat* rotation_vector,
6                                    CvMat* translation_vector );

  1 #include <cv.h>
  2 #include <highgui.h>
  3 #include <stdio.h>
  4 #include <stdlib.h>
  5 
  6 int n_boards = 0; //Will be set by input list
  7 const int board_dt = 10;
  8 int board_w;
  9 int board_h;
 10 
 11 
 12 void help()
 13 {
 14     printf("Calibration from disk. Call convention:\n\n"
 15                     "Where: board_{w,h} are the # of internal corners in the checkerboard\n"
 16             "       width (board_w) and height (board_h)\n"
 17             "       image_list is space separated list of path/filename of checkerboard\n"
 18             "       images\n\n"
 19             "Hit 'p' to pause/unpause, ESC to quit.  After calibration, press any other key to step through the images\n\n");
 20 }
 21 
 22 int main(int argc, char* argv[])
 23 {
 24   
 25   CvCapture* capture;// = cvCreateCameraCapture( 0 );
 26  // assert( capture );
 27 
 28     if(argc != 4)
 29     {
 30         help();
 31         return -1;
 32     }
 33     help();
 34     board_w = atoi(argv[1]);
 35     board_h = atoi(argv[2]);
 36     int board_n  = board_w * board_h;
 37     CvSize board_sz = cvSize( board_w, board_h );
 38     FILE *fptr = fopen(argv[3],"r");
 39     char names[2048];
 40     //COUNT THE NUMBER OF IMAGES:
 41     while(fscanf(fptr,"%s ",names)==1)
 42     {
 43         n_boards++;
 44     }
 45     rewind(fptr);
 46 
 47   cvNamedWindow( "Calibration" );
 48   //ALLOCATE STORAGE
 49   CvMat* image_points      = cvCreateMat(board_n,2,CV_32FC1);
 50   CvMat* object_points     = cvCreateMat(board_n,3,CV_32FC1);
 51   //CvMat* point_counts      = cvCreateMat(1,CV_32SC1);
 52 
 53 
 54   CvMat *intrinsic = (CvMat*)cvLoad("Intrinsicsr.xml");
 55   CvMat *distortion = (CvMat*)cvLoad("Distortionr.xml");
 56   CvMat* rotation_vector=cvCreateMat(3,1,CV_32FC1);
 57   CvMat* translation_vector=cvCreateMat(3,1,CV_32FC1);
 58   CvMat* rotation_mat=cvCreateMat(3,3,CV_32FC1);
 59   CvMat* jacobian=cvCreateMat(3,1,CV_32FC1);
 60 
 61 
 62 
 63   IplImage* image = 0;// = cvQueryFrame( capture );
 64   IplImage* gray_image = 0; //for subpixel
 65   CvPoint2D32f* corners = new CvPoint2D32f[ board_n ];
 66   int corner_count;
 67   
 68       fscanf(fptr,"%s ",names);
 69       image = cvLoadImage( names);
 70       if(gray_image == 0  && image) //We'll need this for subpixel accurate stuff
 71           gray_image = cvCreateImage(cvGetSize(image),8,1);
 72 
 73       if(!image)
 74           printf("null image\n");
 75 
 76       int found = cvFindChessboardCorners(
 77         image,
 78         board_sz,
 79         corners,
 80         &corner_count, 
 81         CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS
 82               );
 83     
 84       //Get Subpixel accuracy on those corners
 85       cvCvtColor(image, gray_image, CV_BGR2GRAY);
 86       cvFindCornerSubPix(gray_image, corners, corner_count, 
 87               cvSize(11,11),cvSize(-1,-1), cvTermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 30, 0.1 ));
 88       //Draw it
 89 
 90       cvDrawChessboardCorners(image, board_sz, corners, corner_count, found);
 91       cvShowImage( "Calibration", image );
 92        if( corner_count == board_n ) 
 93           printf("Found = %d for %s\n",found,names);
 94         for( int i=0; i<board_n; ++i )
 95           {
 96            CV_MAT_ELEM(*image_points, float,i,0) = corners[i].x;
 97            CV_MAT_ELEM(*image_points, float,i,1) = corners[i].y;
 98            CV_MAT_ELEM(*object_points,float,i,0) = i/board_w;
 99            CV_MAT_ELEM(*object_points,float,i,1) = i%board_w;
100            CV_MAT_ELEM(*object_points,float,i,2) = 0.0f;
101           }
102     
103         cvFindExtrinsicCameraParams2(
104                             object_points,image_points,intrinsic,distortion,rotation_vector,translation_vector
105                             );
106         cvRodrigues2(
107           rotation_vector,rotation_mat,jacobian=NULL
108                      );
109 cvSave("Rotationr.xml",rotation_mat);
110 cvSave("Translationr.xml",translation_vector);      
111   }

 

posted on 2015-05-31 15:36  Curnane  阅读(7280)  评论(0编辑  收藏  举报

导航