• 利用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:
    
    "
     15                     "Where: board_{w,h} are the # of internal corners in the checkerboard
    "
     16             "       width (board_w) and height (board_h)
    "
     17             "       image_list is space separated list of path/filename of checkerboard
    "
     18             "       images
    
    "
     19             "Hit 'p' to pause/unpause, ESC to quit.  After calibration, press any other key to step through the images
    
    ");
     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
    ");
     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
    ",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   }
  • 相关阅读:
    CSS3 Media Queries 片段
    针对移动设备的CSS3布局
    移动Web界面样式-CSS3
    em与px区别-CSS教程
    webApp添加到iOS桌面
    字典(dick)
    元组(Tuple)
    列表(list)
    字符串的常用方法
    运算符
  • 原文地址:https://www.cnblogs.com/freshmen/p/4541482.html
Copyright © 2020-2023  润新知