2014-11-08 36 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; 

在我而言這有助於。