cv校准C中的相机2

时间:2014-11-08 14:46:04

标签: c opencv camera-calibration

我正在学习如何使用openCV校准相机。 我有一些关于如何在C中使用cvcalibrateCamera2函数的问题,而不是在C ++中)

问题是,在找到棋盘角后,我想得出内在函数和失真矩阵。 有我的代码:

  IplImage *SrcImage, *GrayImage, *NewImage;
  SrcImage = cvLoadImage(argv[1]);     // RGB
  GrayImage = cvLoadImage(argv[1],0);
  int corner_row=6; //interior number of row corners
  int corner_col=8; //interior number of column corners
  int corner_n=corner_row*corner_col;
  CvSize pattern_size=cvSize(corner_row,corner_col);
  CvPoint2D32f* corners = new CvPoint2D32f[corner_n];
  int corner_count;

  int found=cvFindChessboardCorners(
        GrayImage,
        pattern_size,
        corners,
        &corner_count,
        CV_CALIB_CB_ADAPTIVE_THRESH|CV_CALIB_CB_FILTER_QUADS);

  cvDrawChessboardCorners(
        SrcImage,
        pattern_size,
        corners,
        corner_count,
        found);

  CvMat *object_points = cvCreateMat(corner_n, 3, CV_32FC1);
  CvMat *image_points = cvCreateMat(corner_n, 2, CV_32FC1);
  CvMat *point_counts = cvCreateMat(1, 1, CV_32SC1);
  CvMat *distortion = cvCreateMat(5,1,CV_32FC1);
  CvMat *cameraMatrix = cvCreateMat(3,3,CV_32FC1); 
  cvSet(point_counts,cvScalar(corner_n));

  CV_MAT_ELEM( *cameraMatrix, float, 0, 0 ) = 1.0;
  CV_MAT_ELEM( *cameraMatrix, float, 1, 1 ) = 1.0;

  cvCalibrateCamera2(object_points,image_points,point_counts,pattern_size,
                     cameraMatrix,distortion,NULL,NULL,0);

当我运行它时,会产生这样的错误

For non-planar calibration rigs the initial intrinsic matrix must be specified

如果我用CV_CALIB_USE_INTRINSIC_GUESS替换cvcalibrateCamera2'第9个参数0,它会使

One of arguments' values is out of range (The intrinsic matrix must have [fx 0 cx; 0 fy cy; 0 0 1] shape)

我真的不知道这一点,互联网上的所有资料都是通过相机使用C ++,python或连续拍摄照片。 所以,我不知道如何适应我的代码。

提前致谢。

2 个答案:

答案 0 :(得分:1)

我知道,这个问题已经过时了,但在javaCV中使用相机校准功能时出现了同样的错误。

  

如果CV_CALIB_USE_INTRINSIC_GUESS和/或CV_CALIB_FIX_ASPECT_RATIO是   指定,fx,fy,cx,cy中的部分或全部必须在之前初始化   调用该函数。   more here

正如错误消息所说,你的直觉矩阵有错误的形式。 您添加了一些参数:

CV_MAT_ELEM( *cameraMatrix, float, 0, 0 ) = 1.0;
CV_MAT_ELEM( *cameraMatrix, float, 1, 1 ) = 1.0;

这些是fxfy参数。但您还需要将1添加到第3行。 我猜是这样的事情:

CV_MAT_ELEM( *cameraMatrix, float, 2, 2 ) = 1.0;

就我而言,这有帮助。

答案 1 :(得分:0)

您的校准失败,因为您没有在致电cvCalibrateCamera2时给出任何物体或图像点。 您的矩阵object_points应包含校准图案角点坐标,image_points应包含corners中的相应值。

第一条错误消息可能是因为您的矩阵object_points未初始化且包含垃圾。这些垃圾点不在平面上,这是校准方法所要求的,除非您猜测内在函数。

那就是说,除非你非常有充分的理由不使用C ++接口,否则我强烈建议切换到它。