C++之opencv 标定方法
时间: 2025-07-06 19:48:38 浏览: 6
### C++ OpenCV相机标定方法教程
#### 准备工作
为了使用OpenCV进行相机标定,需要准备一系列棋盘格图像。这些图像是用于检测角点并计算内参矩阵和畸变系数的基础。
```cpp
#include <opencv2/opencv.hpp>
#include <vector>
// 定义棋盘尺寸
int board_w = 9;
int board_h = 6;
std::vector<std::vector<cv::Point3f>> object_points;
std::vector<std::vector<cv::Point2f>> image_points;
std::vector<cv::String> images;
```
此部分代码初始化了必要的变量来存储对象点(世界坐标系中的三维点)和图像点(二维像素位置),以及待处理的图片列表[^1]。
#### 加载图像与角点检测
通过遍历所有输入图像文件路径,并尝试从中提取角点:
```cpp
for (size_t i = 0; i < images.size(); ++i) {
cv::Mat img = cv::imread(images[i]);
std::vector<cv::Point2f> corners;
bool found = cv::findChessboardCorners(img, cv::Size(board_w, board_h), corners);
if (!found) continue;
// 改善亚像素精度
cv::cornerSubPix(img, corners, cv::Size(11, 11), cv::Size(-1,-1),
cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 30, 0.1));
image_points.push_back(corners);
// 构建对应的世界坐标系下的物体点
std::vector<cv::Point3f> objp;
for(int j=0;j<board_h;++j){
for(int k=0;k<board_w;++k){
objp.emplace_back(k,j,0);
}
}
object_points.push_back(objp);
}
```
上述过程会读取每张图像,寻找其中是否存在有效的棋盘模式,并利用`cornerSubPix()`函数提高找到角落的位置准确性[^2]。
#### 执行标定操作
当收集足够的有效样本后,可以调用`calibrateCamera()`来进行实际的参数估计:
```cpp
cv::Mat camera_matrix, dist_coeffs, rvecs, tvecs;
double rms = cv::calibrateCamera(object_points, image_points,
img.size(), camera_matrix, dist_coeffs,
rvecs, tvecs);
std::cout << "RMS re-projection error: " << rms << "\n";
std::cout << "Camera matrix:\n" << camera_matrix << "\n\n";
std::cout << "Distortion coefficients:\n" << dist_coeffs << "\n";
```
这段程序执行完整的相机模型校准流程,输出重投影误差、内部参数矩阵及镜头失真向量等重要信息[^3]。
阅读全文
相关推荐

















