定义参数
初始化标定需要用的参数
// 定义用来保存导入的图片
Mat image_in;
// 定义用来保存文件路径的容器
vector<string> filelist;
// 定义用来保存旋转和平移矩阵的容器
vector<Mat> rvecs, tvecs;
// 定义相机矩阵,畸变矩阵
Mat cameraMatrix;
Mat distCoeffs;
//棋盘格尺寸
Size sizea(11, 8);
//棋盘格角点距离
Size ChessboardPoint(40, 40);
int flags = 0;
// 定义保存图像二维角点的容器
vector<Point2f> corners;
// 定义保存图像三维角点的容器
vector<vector<Point2f> > corners2;
// 定义保存图像二维和三维角点的容器
vector<Point3f> worldPoints;
vector<vector<Point3f> > worldPoints2;
读取标定图片
for (int i = 1; i < 9; i++) {
stringstream str;
str << PATH << setw(2) << setfill('0') << i << ".bmp";
// 保存所有图片的路径,放入容器filelist中
filelist.push_back(str.str());
image_in = imread(str.str());
}
生成真实的棋盘三维坐标
//***********************生成一组object_points*************************
for (int j = 0; j < sizea.height; j++) {
for (int k = 0; k < sizea.width; k++) {
worldPoints.push_back(Point3f(j*ChessboardPoint.height, k*ChessboardPoint.width, 0.0f));
}
}
找棋盘角点
//***************************找角点××××××××××××××××××××××××××××××××
for (int i = 0; i < filelist.size(); i++) {
//cout <<filelist[i]<<endl;
// 一张张读入图片;
image_in = imread(filelist[i]);
// 找图片的角点,参数分别为:
// 输入图片,图片内角点数(不算棋盘格最外层的角点),输出角点,求解方式
bool found = findChessboardCorners(image_in, sizea, corners, CALIB_CB_ADAPTIVE_THRESH | CALIB_CB_NORMALIZE_IMAGE);
// 将找到的角点放入容器中;
corners2.push_back(corners);
//画出角点
drawChessboardCorners(image_in, sizea, corners, found);
//显示图像
imshow("test", image_in);
// 图像刷新等待时间,单位ms
waitKey(100);
// 世界坐标系的二维vector 放入三维vector
worldPoints2.push_back(worldPoints);
}
标定内参矩阵和畸变
calibrateCamera(worldPoints2, corners2, image_in.size(), cameraMatrix, distCoeffs, rvecs, tvecs);
旋转向量转换成旋转矩阵
Mat rotationMatrix;
cv::Rodrigues(rvecs, rotationMatrix);
程序链接:
相机标定