我正在尝试使用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;
}