OpenCV (五十八) 单目相机标定 张正友相机标定

时间:2025-04-11 07:02:32
#include <opencv2\> #include <fstream> #include <iostream> #include <vector> using namespace std; using namespace cv; int main() { //读取所有图像 vector<Mat> imgs; string imageName; ifstream fin("");//文本流读取txt文本 while (getline(fin, imageName))//读取文本中每一行数据,即每个图片的名称,并以字符串形式存入imageName; { Mat img = imread(imageName); imgs.push_back(img); } Size board_size = Size(9, 6); //方格标定板内角点数目(高,宽),行列数最好不等,以便于确定棋盘格的方向 vector<vector<Point2f>> imgsPoints; for (int i = 0; i < imgs.size(); i++) { Mat img1 = imgs[i]; Mat gray1; cvtColor(img1, gray1, COLOR_BGR2GRAY); vector<Point2f> img1_points; findChessboardCorners(gray1, board_size, img1_points); //计算方格标定板角点 find4QuadCornerSubpix(gray1, img1_points, Size(5, 5)); //细化方格标定板角点坐标 bool pattern = true; drawChessboardCorners(img1, board_size, img1_points, pattern); imshow("img1", img1); waitKey(0); imgsPoints.push_back(img1_points); } //生成棋盘格每个内角点的空间三维坐标 Size squareSize = Size(10, 10); //棋盘格每个方格的真实尺寸 vector<vector<Point3f>> objectPoints; for (int i = 0; i < imgsPoints.size(); i++)//N张图片的像素坐标系下的二维坐标点 { vector<Point3f> tempPointSet; for (int j = 0; j < board_size.height; j++) { for (int k = 0; k < board_size.width; k++) { Point3f realPoint; // 假设标定板为世界坐标系的z平面,即z=0 realPoint.x = j * squareSize.width; realPoint.y = k * squareSize.height; realPoint.z = 0; tempPointSet.push_back(realPoint); } } objectPoints.push_back(tempPointSet); } ///* 初始化每幅图像中的角点数量,假定每幅图像中都可以看到完整的标定板 */ //vector<int> point_number; //for (int i = 0; i<(); i++) //{ // point_number.push_back(board_size.width*board_size.height); //} //图像尺寸 Size imageSize; imageSize.width = imgs[0].cols; imageSize.height = imgs[0].rows; Mat cameraMatrix = Mat(3, 3, CV_32FC1, Scalar::all(0)); //摄像机内参数矩阵 Mat distCoeffs = Mat(1, 5, CV_32FC1, Scalar::all(0)); //摄像机的5个畸变系数:k1,k2,p1,p2,k3 vector<Mat> rvecs; //每幅图像的旋转向量 vector<Mat> tvecs; //每张图像的平移量 calibrateCamera(objectPoints, imgsPoints, imageSize, cameraMatrix, distCoeffs, rvecs, tvecs, 0); cout << "相机的内参矩阵=" << endl << cameraMatrix << endl; cout << "相机畸变系数" << distCoeffs << endl; waitKey(0); return 0; }