利用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   }

 

转载于:https://www.cnblogs.com/freshmen/p/4541482.html

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值