2014-11-08 70 views
0

我正在学习如何使用openCV来校准摄像头。 我有一些关于如何使用C代码,而不是在C++中使用cvcalibrateCamera2函数的问题)cvcalibrateCamera2 in 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 

如果我更换cvcalibrateCamera2的第9个参数0由CV_CALIB_USE_INTRINSIC_GUESS,它将使

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或者通过相机连续拍摄照片。这样,我不知道如何适应我的代码。

在此先感谢。

回答

0

由于您没有给您拨打cvCalibrateCamera2的任何物品或图像点,您的校准失败。 您的矩阵object_points应该包含校准模式角坐标,并且image_points应该包含corners中的对应值。

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

这就是说,除非你有非常的很好的理由不使用C++接口,我强烈建议切换到它。

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。 事情是这样的我猜测:

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

在我而言这有助于。