用C++写一段张氏标定法程序
时间: 2023-08-16 09:09:36 浏览: 90
以下是一个简单的C++实现张氏标定法的程序示例:
```c++
#include <iostream>
#include <opencv2/opencv.hpp> // 引入OpenCV库
using namespace std;
using namespace cv;
int main()
{
// 读取标定图像
vector<vector<Point2f>> image_points; // 存储每幅图像的角点
vector<vector<Point3f>> object_points; // 存储每幅图像的物理坐标
Size image_size; // 图像尺寸
// 设置棋盘格参数
int board_width = 9; // 棋盘格横向内角点数
int board_height = 6; // 棋盘格纵向内角点数
float square_size = 25; // 棋盘格单个方块大小,单位mm
// 构建棋盘格物理坐标
vector<Point3f> object_corners;
for (int i = 0; i < board_height; i++) {
for (int j = 0; j < board_width; j++) {
object_corners.push_back(Point3f(j * square_size, i * square_size, 0));
}
}
// 遍历标定图像并检测角点
Mat gray_image;
vector<Point2f> corners;
vector<String> image_files; // 存储标定图像文件路径
glob("calibration_images/*.jpg", image_files); // 使用glob函数读取所有jpg图像
for (int i = 0; i < image_files.size(); i++) {
Mat image = imread(image_files[i]);
cvtColor(image, gray_image, COLOR_BGR2GRAY);
// 检测棋盘格角点
bool found = findChessboardCorners(image, Size(board_width, board_height), corners);
if (found) {
cornerSubPix(gray_image, corners, Size(11, 11), Size(-1, -1), TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 30, 0.1));
drawChessboardCorners(image, Size(board_width, board_height), corners, found);
image_points.push_back(corners);
object_points.push_back(object_corners);
image_size = image.size();
}
imshow("Chessboard Corners", image);
waitKey(0);
}
destroyAllWindows();
// 进行相机标定
Mat camera_matrix = Mat::eye(3, 3, CV_64F);
Mat dist_coeffs = Mat::zeros(5, 1, CV_64F);
vector<Mat> rvecs, tvecs;
calibrateCamera(object_points, image_points, image_size, camera_matrix, dist_coeffs, rvecs, tvecs);
// 输出标定结果
cout << "Camera Matrix:" << endl << camera_matrix << endl;
cout << "Distortion Coefficients:" << endl << dist_coeffs << endl;
return 0;
}
```
这个程序实现了以下功能:
1. 读取指定目录下的所有标定图像。
2. 检测每幅图像中的棋盘格角点,并提取出物理坐标和图像坐标。
3. 使用提取的物理坐标和图像坐标进行相机标定。
4. 输出相机内参矩阵和畸变系数。
需要注意的是,这个程序仅实现了相机的标定过程,如果需要将标定结果应用到机器人视觉中,还需要进行相应的坐标变换和图像处理等操作。
阅读全文