使用calibrateCamera时出现“拒绝访问”错误

时间:2016-12-15 16:22:28

标签: c++ opencv camera-calibration

我正在尝试使用OpenCV 3.1中的calibrateCamera函数,但在调用它时出现“拒绝访问”错误。我正在使用VS2015。

这是我的代码:

#include "stdafx.h"
#include <vector>
#include <string>
#include <iomanip>
#include <sstream>
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/calib3d/calib3d.hpp>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    int numBoards = 14;
    int numCornersHor = 7;
    int numCornersVer = 6;
    int numSquares = numCornersHor * numCornersVer;
    Size board_sz = Size(numCornersHor, numCornersVer);

    vector<vector<Point3f>> object_points;
    vector<vector<Point2f>> image_points;


    int successes = 1;
    Mat image, imageUndistorted;
    Mat tempCorners;

    stringstream f;
    vector<Point3f> obj;
    for (int j = 0; j < numSquares; j++)
        obj.push_back(Point3f(j / numCornersHor, j%numCornersHor, 0.0f));

    while (successes < numBoards) {
        f.str(""); //flush the stream every iteration
        f << "left" << setw(2) << setfill('0') << successes << ".jpg";
        cout << f.str() << endl;
        image = imread(f.str(), CV_BGR2GRAY);

        bool found = cv::findChessboardCorners(image, board_sz, tempCorners, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS);
        if (found) {
            cv::cornerSubPix(image, tempCorners, Size(11, 11), Size(-1, -1), TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.1));
            cv::drawChessboardCorners(image, board_sz, tempCorners, found);
        }
        imshow("win1", image);
        int key = waitKey();

        if (key == 27)
            return 0;

        if (key == ' ' && found != false) {
            vector<Point2f> corners;
            corners.resize(numSquares);
            corners.assign((Point2f*)tempCorners.datastart, (Point2f*)tempCorners.dataend);
            image_points.push_back(corners);
            object_points.push_back(obj);
            printf("stored!\n");
        }
        successes++;

    }
    //Calibration parameters
    Mat intrinsic = Mat(3, 3, CV_32FC1);
    intrinsic.ptr<float>(0)[0] = 1;
    intrinsic.ptr<float>(1)[1] = 1;

    Mat distCoeffs(1, 4, CV_64F, Scalar::all(0));
    distCoeffs = Mat::zeros(8, 1, CV_64F);
    vector<Mat> rvecs;
    vector<Mat> tvecs;


    cout << object_points.size() << endl;
    cout << image_points.size() << endl;
    cout << image.size() << endl;

    calibrateCamera(object_points, image_points, image.size(), intrinsic, distCoeffs, rvecs, tvecs, CALIB_USE_INTRINSIC_GUESS);

    for (int i = 1; i < 14; i++) {
        f.str(""); //flush the stream every iteration
        f << "left" << setw(2) << setfill('0') << i << ".jpg";
        image = imread(f.str(), CV_BGR2GRAY);
        undistort(image, imageUndistorted, intrinsic, distCoeffs);
        imshow("win1", image);
        imshow("win2", imageUndistorted);
        waitKey(1);
    }

    return 0;
}

0 个答案:

没有答案
相关问题