2016-06-05 11 views
0

Wie konnte ich den Fehler beheben?keine geeignete Konvertierungsfunktion von "CvTermCriteria" zu "int" existiert

Ich benutze Programm, das für OpenCV 2.x gemacht, aber ich kompiliere es auf OpenCV 3.0, und Fehler erschien. Ich ändere CvTermCriteria zu TermCriteria :: TermCriteria, aber das funktioniert nicht. Wie kann ich CvTermCriteria ändern, um int zu sein?

Hoffe jemand könnte mir helfen. Dank

Fehler bei diesem Teil erschienen:

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); 

Dies ist der Quellcode:

//--------------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

Bitte zeigen Sie den Code .... Sehen Sie, wie man [mcve] – Miki

Antwort

0

tauschen die beiden letzten Parameter von stereoCalibrate


In OpenCV> = 3,0 , die Signatur von stereoCalibrate geändert, und müssen Sie sim Vertauschen Sie die letzten beiden Parameter, flags und criteria.

Veraltet C-Version, OpenCV < 3,0

C: Doppel cvStereoCalibrate (const CvMat * object_points, const CvMat * image_points1, const CvMat * image_points2, Konst CvMat * npoints, CvMat * camera_matrix1, CvMat * dist_coeffs1, CvMat * Kamera_Matrix2, CvMat * dist_coeffs2, CvSize Bildgröße, 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++ - Version, OpenCV < 3,0

C++: Doppel stereoCalibrate (InputArrayOfArrays objectPoints, InputArrayOfArrays imagePoints1, InputArrayOfArrays imagePoints2, InputOutputArray cameraMatrix1, InputOutputArray distCoeffs1, InputOutputArray cameraMatrix2, InputOutputArray distCoeffs2, Größe image, Output R, Output T, Output E, Output F, TermCriteria Kriterien = TermCriteria (TermCriteria :: COUNT + TermCriteria :: EPS, 30, 1e-6), int Flags = CALIB_FIX_INTRINSIC)

C++ Version, OpenCV> = 3.0

Doppel cv :: stereoCalibrate (InputArrayOfArrays objectPoints, InputArrayOfArrays imagePoints1, InputArrayOfArrays imagePoints2, InputOutputArray cameraMatrix1, InputOutputArray distCoeffs1, InputOutputArray cameraMatrix2, InputOutputArray distCoeffs2, Größe image, Output R, Output T , AusgabeArray E, AusgabeArray F, int Kennzeichen = CALIB_FIX_INTRINSIC, TermCriteria Kriterien = TermCriteria (TermCriteria :: COUNT + TermCriter ia :: EPS, 30, 1e-6) )


Ihr Code wird unter Verwendung von C api, die obsolet ist. Sie sollten jetzt wirklich überlegen, C++ API zu verwenden.

+0

Ja, es funktioniert, aber jetzt hat einen anderen Fehler. Ich denke etwas stimmt nicht mit dem Header. Der Fehler ist oben: –

+0

Fehler LNK2019: nicht aufgelöstes externes Symbol "public: void __thiscall CBlobResult :: Filter (Klasse CBlobResult &, int, Klasse COperadorBlob *, int, double, double)" (? Filter @ CBlobResult @@ QAEXAAV1 @ HPAVCOperadorBlob @ @ HNN @ Z) referenziert in der Funktion "public: void __thiscall StereoFunktionen :: stereoDetect (void)" (? StereoDetect @ StereoFunctions @@ QAEXXZ) –

+0

Dieser andere Fehler hat nichts mit der Frage zu tun ... Also bitte eine neue Frage stellen über das. Wenn meine Antwort das in dieser Frage angegebene Problem löst, dann akzeptieren Sie bitte die Antwort. – Miki