我正在使用stereoCalibrate,并且termCriteria引发错误



我该如何解决?

#include <iostream>
#include "conio.h"
#include <sstream>
#include <time.h>
#include <stdio.h>

#include <opencv2/core.hpp>
#include <opencv2/core/utility.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/calib3d.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;

Mat captura0;
Mat gray0;
Mat captura1;
Mat gray1;
Mat centers;
vector<vector<Point2f>> cornes_global0;
vector<vector<Point2f>> cornes_global1;
vector<vector<Point3f>> vector3D;
vector<Point2f> corners0;
vector<Point2f> corners1;
Size patternsize (7,10);
int key1;
int c=1;

void main () {
    VideoCapture camara0(0);
    VideoCapture camara1(1);
    if(!camara0.isOpened()){ // check if we succeeded
    cout <<"no abrio camara 0 "<<endl;
    }
    if(!camara1.isOpened()){ // check if we succeeded
    cout <<"no abrio cama 1 "<<endl;
    }
    while ( c!=15)
    {
        cout<<"Capturando "<<c<<" foto"<<endl;
        key1 = waitKey(10);
        camara0.read(captura0);
        camara1.read(captura1);
        imshow("camara 1", captura0);
        imshow("camara 2", captura1);
        if ((char)key1=='q'){
            cvtColor(captura0, gray0, CV_BGR2GRAY);
            cvtColor(captura1, gray1, CV_BGR2GRAY);
            bool patternfound0= findChessboardCorners(gray0, patternsize,corners0, CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE + CALIB_CB_FAST_CHECK );
            bool patternfound1= findChessboardCorners(gray1, patternsize,corners1, CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE + CALIB_CB_FAST_CHECK );
            cout <<"patternfound0 "<<patternfound0<<endl;
            cout <<"patternfound1 "<<patternfound1<<endl;
            if(patternfound0==1 && patternfound1==1){
                cornerSubPix(gray0, corners0,Size(11,11), Size(-1,-1),TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1));
                cornerSubPix(gray1, corners1,Size(11,11), Size(-1,-1),TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1));
                cout<<"se hallaron esquinas0  "<<patternfound0<<endl;
                cout<<"se hallaron esquinas1  "<<patternfound0<<endl;
                cornes_global0.push_back(corners0);
                cornes_global1.push_back(corners1);
                cout<<"Patrones: "<<c<<endl;
                drawChessboardCorners(captura0, patternsize, Mat(corners0), patternfound0);
                drawChessboardCorners(captura1, patternsize, Mat(corners1), patternfound1);
                imshow("graficando esquinas0", captura0);
                imshow("graficando esquinas1", captura1);


            }
            c++; // cantidad de pares de imagenes tomadas
        }

    }
    vector3D.resize(c);
    //vector3D.clear();
    for (int k = 0; k < c; k++)         // rellenamos el array de arrays de puntos 3f con la distancia de cada rectangulo
    {                                   //del tablero de ajedrez,en eje Z, ponemos todo 0
        for (int i = 0; i < 10; i++)    // 10 esquinas internas en eje Y
        {
            for (int j = 0; j < 7; j++)  // 7 esquinas internas en eje X
            {
                vector3D[k].push_back(Point3f(i*23.0, j*23.0, 0.0));
                cout<<"la "<<k<<vector3D[k]<<endl;
            }
        }
    }
    Mat cameraMatrix1 = Mat::eye(3,3,CV_64FC1);
    Mat cameraMatrix2 = Mat::eye(3,3,CV_64FC1);
    Mat distCoeffs1;
    Mat distCoeffs2;
    Mat R, T, E, F;
    Size imageSize = captura1.size();
    cout<< "Calibrando camara..."<<endl;
    int64 t = getTickCount();
     double rms =stereoCalibrate(vector3D, cornes_global0, cornes_global1, cameraMatrix1,distCoeffs1,cameraMatrix2,distCoeffs2, imageSize, R, T, E, F,
         TermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 100, 1e-5),CV_CALIB_FIX_ASPECT_RATIO + CV_CALIB_FIX_ASPECT_RATIO +CV_CALIB_ZERO_TANGENT_DIST+
         CV_CALIB_SAME_FOCAL_LENGTH+ CV_CALIB_FIX_K3 + CV_CALIB_FIX_K4 + CV_CALIB_FIX_K5);
     cout<<"ok "<<endl;
     t=getTickCount() -t;


getch();
}

最佳答案

您可能正在使用OpenCV 3.0,其中flagscriteria has been swapped的顺序。

您需要将标记放在词条标准之前。您的编译器告诉您它无法将TermCriteria转换为int,因为它期望使用flags(实际上是int)。

08-16 02:06