没有合适的从“CvTermCriteria”到“int”的转换函数

时间:2016-06-05 12:29:09

标签: opencv3.0 camera-calibration calibration

我该如何解决错误?

我使用为OpenCV 2.x制作的程序,但我在OpenCV 3.0上编译它,并出现错误。 我将CvTermCriteria更改为TermCriteria :: TermCriteria,但那不起作用。 我怎么能把CvTermCriteria改成int?

希望有人能帮助我。感谢

此部分出现错误:

cvStereoCalibrate( &_objectPoints, &_imagePoints1, &_imagePoints2, &_npoints,&_M1calib, &_D1, &_M2calib, &_D2,imageSize, &_R, &_Tcalib, &_E, &_F, 
    cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 100, 1e-5),
    CV_CALIB_FIX_ASPECT_RATIO+CV_CALIB_ZERO_TANGENT_DIST + CV_CALIB_SAME_FOCAL_LENGTH );

这是源代码:

//--------------Compute for calibration-------------------
    N = n_boards*n;
    objectPoints.resize(N);
    for( i = 0; i < ny; i++ )
        for(j = 0; j < nx; j++ )   objectPoints[i*nx + j] = cvPoint3D32f(i*squareSize, j*squareSize, 0);
    for( i = 1; i < n_boards; i++ ) copy( objectPoints.begin(), objectPoints.begin() + n, objectPoints.begin() + i*n );
    npoints.resize(n_boards,n);

    CvMat _objectPoints = cvMat(1, N, CV_32FC3, &objectPoints[0] );
    CvMat _imagePoints1 = cvMat(1, N, CV_32FC2, &points[0][0] );
    CvMat _imagePoints2 = cvMat(1, N, CV_32FC2, &points[1][0] );
    CvMat _npoints = cvMat(1, npoints.size(), CV_32S, &npoints[0] );
    cvSetIdentity(&_M1calib);
    cvSetIdentity(&_M2calib);
    cvZero(&_D1);
    cvZero(&_D2);

    printf("\nRunning stereo calibration ...");
    fflush(stdout);
    cvStereoCalibrate( &_objectPoints, &_imagePoints1, &_imagePoints2, &_npoints,&_M1calib, &_D1, &_M2calib, &_D2,imageSize, &_R, &_Tcalib, &_E, &_F, 
    cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 100, 1e-5),
    CV_CALIB_FIX_ASPECT_RATIO+CV_CALIB_ZERO_TANGENT_DIST + CV_CALIB_SAME_FOCAL_LENGTH );


    printf("\nDone Calibration");

    cvUndistortPoints( &_imagePoints1, &_imagePoints1,&_M1calib, &_D1, 0, &_M1calib );
    cvUndistortPoints( &_imagePoints2, &_imagePoints2,&_M2calib, &_D2, 0, &_M2calib );


    CvMat* mx1calib = cvCreateMat( imageSize.height,imageSize.width, CV_32F );
    CvMat* my1calib = cvCreateMat( imageSize.height,imageSize.width, CV_32F );
    CvMat* mx2calib = cvCreateMat( imageSize.height,imageSize.width, CV_32F );
    CvMat* my2calib = cvCreateMat( imageSize.height,imageSize.width, CV_32F );

    double R1[3][3], R2[3][3], P1[3][4], P2[3][4];
    CvMat _R1 = cvMat(3, 3, CV_64F, R1);
    CvMat _R2 = cvMat(3, 3, CV_64F, R2);

        CvMat _P1 = cvMat(3, 4, CV_64F, P1);
        CvMat _P2 = cvMat(3, 4, CV_64F, P2);
        cvStereoRectify( &_M1calib, &_M2calib, &_D1, &_D2, imageSize,&_R, &_Tcalib,&_R1, &_R2, &_P1, &_P2, &_Qcalib,0/*CV_CALIB_ZERO_DISPARITY*/ );

        cvInitUndistortRectifyMap(&_M1calib,&_D1,&_R1,&_P1,mx1calib,my1calib);
        cvInitUndistortRectifyMap(&_M2calib,&_D2,&_R2,&_P2,mx2calib,my2calib);

        printf("\nSaving matries for later use ...\n");
        cvSave("CalibFile//M1.yml",&_M1calib);
    //  cvSave("CalibFile//D1.yml",&_D1);
    //  cvSave("CalibFile//R1.yml",&_R1);
    //  cvSave("CalibFile//P1.yml",&_P1);

        cvSave("CalibFile//M2.yml",&_M2calib);
    //  cvSave("CalibFile//D2.yml",&_D2);
    //  cvSave("CalibFile//R2.yml",&_R2);
    //  cvSave("CalibFile//P2.yml",&_P2);

        cvSave("CalibFile//Q.yml",&_Qcalib);
        cvSave("CalibFile//T.yml",&_Tcalib);
        cvSave("CalibFile//mx1.yml",mx1calib);
        cvSave("CalibFile//my1.yml",my1calib);
        cvSave("CalibFile//mx2.yml",mx2calib);
        cvSave("CalibFile//my2.yml",my2calib);

1 个答案:

答案 0 :(得分:0)

交换stereoCalibrate

的最后两个参数

在OpenCV&gt; = 3.0中,stereoCalibrate的签名发生了变化,而则需要简单地交换最后两个参数flagscriteria

  

过时的C版本,OpenCV&lt; 3.0

     

C:double cvStereoCalibrate(const CvMat * object_points,const CvMat * image_points1,const CvMat * image_points2,const CvMat * npoints,CvMat * camera_matrix1,CvMat * dist_coeffs1,CvMat * camera_matrix2,CvMat * dist_coeffs2,CvSize image_size,CvMat * R ,CvMat * T,CvMat * E = 0,CvMat * F = 0,CvTermCriteria term_crit = cvTermCriteria(CV_TERMCRIT_ITER + CV_TERMCRIT_EPS,30,1e-6),int flags = CV_CALIB_FIX_INTRINSIC)

     

C ++版本,OpenCV&lt; 3.0

     

C ++:双stereoCalibrate(InputArrayOfArrays objectPoints,InputArrayOfArrays imagePoints1,InputArrayOfArrays imagePoints2,InputOutputArray cameraMatrix1,InputOutputArray distCoeffs1,InputOutputArray cameraMatrix2,InputOutputArray distCoeffs2,尺寸IMAGESIZE,OutputArray R,OutputArray T,OutputArray E,OutputArray楼TermCriteria标准= TermCriteria(TermCriteria :: COUNT + TermCriteria :: EPS,30,1e-6),int flags = CALIB_FIX_INTRINSIC)

     

C ++版本,OpenCV&gt; = 3.0

     

double cv :: stereoCalibrate(InputArrayOfArrays objectPoints,   InputArrayOfArrays imagePoints1,   InputArrayOfArrays imagePoints2,   InputOutputArray cameraMatrix1,   InputOutputArray distCoeffs1,   InputOutputArray cameraMatrix2,   InputOutputArray distCoeffs2,   尺寸imageSize,   OutputArray R,   OutputArray T,   OutputArray E,   OutputArray F,   int flags = CALIB_FIX_INTRINSIC,   TermCriteria criteria = TermCriteria(TermCriteria :: COUNT + TermCriteria :: EPS,30,1e-6)   )

您的代码使用的是已过时。你现在应该考虑使用C ++ api。