c++ - 校准期间 OpencV 错误

标签 c++ opencv camera-calibration calibration

这是我的校准代码:

   void calibrate()
 {
    int numBoards = 21;
    int board_w = 6;
    int board_h = 9;
    Size board_sz = Size(board_w, board_h);
    int board_n = board_w*board_h;
    vector<vector<Point3f> > object_points;
    vector<vector<Point2f> > imagePoints1, imagePoints2;
    vector<Point2f> corners1, corners2;
    vector<Point3f> obj;
    for (int j=0; j<board_n; j++)
    {
        obj.push_back(Point3f(j/board_w, j%board_w, 0.0f));
    }
    Mat img1, img2, gray1, gray2;
    VideoCapture cap1(0);// = VideoCapture(0);
    VideoCapture cap2(1);// = VideoCapture(1);
    int success = 0, k = 0;
    bool found1 = false, found2 = false;
    namedWindow("left 1");
    namedWindow("right 1");
    while (success < numBoards)
    {
        cap1 >> img1;
        cap2 >> img2;
        //resize(img1, img1, Size(320, 280));
        //resize(img2, img2, Size(320, 280));
        //waitKey(0);
        cvtColor(img1, gray1, CV_BGR2GRAY);
        cvtColor(img2, gray2, CV_BGR2GRAY);


        found1 = findChessboardCorners(img1, board_sz, corners1, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS);
        found2 = findChessboardCorners(img2, board_sz, corners2, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS);
        if (found1)
        {
            cornerSubPix(gray1, corners1, Size(11, 11), Size(-1, -1), TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.1));
            drawChessboardCorners(gray1, board_sz, corners1, found1);
        }
        if (found2)
        {
            cornerSubPix(gray2, corners2, Size(11, 11), Size(-1, -1), TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.1));
            drawChessboardCorners(gray2, board_sz, corners2, found2);
        }
        imshow("left 1", img1);
        imshow("right 1", img2);
        k = waitKey(2);

        if(found1 && found2) cout<<"succeeded: "<<success<<endl;

        if ( found1  && found2)
        {
            imagePoints1.push_back(corners1);
            imagePoints2.push_back(corners2);
            object_points.push_back(obj);
            printf ("Corners stored\n");
            cout<<"Obj points size: "<<object_points.size()<<endl;
            cout<<"Image1 points size: "<<imagePoints1.size()<<endl;
            cout<<"Image2 points size: "<<imagePoints2.size()<<endl;
            success++;
            if (success >= numBoards)
            {
                break;
            }
        }
    }
    destroyAllWindows();
    printf("Starting Calibration\n");
    Mat CM1 = Mat(3, 3, CV_64FC1);
    Mat CM2 = Mat(3, 3, CV_64FC1);
    Mat D1, D2;
    Mat R, T, E, F;
    double calibErr = stereoCalibrate(object_points, imagePoints1, imagePoints2,
    CM1, D1, CM2, D2, img1.size(), R, T, E, F,
    cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 100, 1e-5),
    CV_CALIB_SAME_FOCAL_LENGTH | CV_CALIB_ZERO_TANGENT_DIST);
    FileStorage fs1("mystereocalib.yml", FileStorage::WRITE);
    fs1 << "CM1" << CM1;
    fs1 << "CM2" << CM2;
    fs1 << "D1" << D1;
    fs1 << "D2" << D2;
    fs1 << "R" << R;
    fs1 << "T" << T;
    fs1 << "E" << E;
    fs1 << "F" << F;
    fs1<<"Error"<<calibErr;
    printf("Done Calibration\n");
    printf("Calibration error: %f\n", calibErr);
    printf("Starting Rectification\n");
    Mat R1, R2, P1, P2, Q;
    stereoRectify(CM1, D1, CM2, D2, img1.size(), R, T, R1, R2, P1, P2, Q);
    fs1 << "R1" << R1;
    fs1 << "R2" << R2;
    fs1 << "P1" << P1;
    fs1 << "P2" << P2;
    fs1 << "Q" << Q;
    printf("Done Rectification\n");
    printf("Applying Undistort\n");
    Mat map1x, map1y, map2x, map2y;
    Mat imgU1, imgU2;
    initUndistortRectifyMap(CM1, D1, R1, P1, img1.size(), CV_32FC1, map1x, map1y);
    initUndistortRectifyMap(CM2, D2, R2, P2, img2.size(), CV_32FC1, map2x, map2y);
    printf("Undistort complete\n");

    cap1.release();
    cap2.release();
    return;
 }

我收到此错误:

OpenCV Error: Assertion failed (ni >= 0) in cv::collectCalibrationData, file ..\ ......\opencv\modules\calib3d\src\calibration.cpp, line 3169

我在其他计算机上运行了此代码,并且运行良好。怎么了?

最佳答案

问题是我使用 vs2012 的 vc10 文件夹中的 openCV dll 文件,当我更改为 vc11 时它可以工作。

关于c++ - 校准期间 OpencV 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28471279/

相关文章:

python - 在 opencv 中突出显示所有可能的圆圈(气泡纸选择)

c++ - 多态性 c++,当对一个对象进行更改时,所有对象都会更改

c++ - 在openCV中访问特定像素的强度值(灰度图像)

c++ - Windows 7 上的 AbortSystemShutdown 不起作用

ios - 没有调用 cvGet2D 的匹配函数

python - Easy单目相机自标定算法

opencv - 使用 Opencv 进行广角镜头校准

python - Python 上 OpenCV 中的 StereoCalibration

c++ - Qt designer如何抓取信息

c++ - 如何在模板中对字符串数据类型执行几组不同的指令?