1. 相机标定基础原理与项目概述
在计算机视觉和摄影测量领域,相机标定是获取相机内参和畸变参数的关键步骤。这个C++项目实现了一套完整的相机标定与校正系统,基于OpenCV库开发,适用于工业检测、机器人视觉、三维重建等需要精确图像数据的场景。
1.1 相机成像模型解析
相机标定的核心是建立三维世界坐标与二维图像坐标之间的数学关系。常用的针孔相机模型包含以下关键参数:
- 内参矩阵(Intrinsic Matrix):包含焦距(fx,fy)和主点(cx,cy)
- 畸变系数(Distortion Coefficients):描述径向畸变(k1,k2,k3)和切向畸变(p1,p2)
- 外参矩阵(Extrinsic Parameters):相机在世界坐标系中的位置和方向
本项目采用张正友标定法,通过多角度拍摄棋盘格图案,利用最小二乘法求解最优相机参数。这种方法在保证精度的同时,操作简便,是工业界最常用的标定方法。
1.2 项目架构设计
项目的模块化设计使其具有高度可扩展性:
code复制CameraCalibration/
├── CMakeLists.txt # 项目构建配置
├── include/
│ └── camera_calibration.h # 核心类声明
├── src/
│ ├── camera_calibration.cpp # 类实现
│ └── main.cpp # 示例使用代码
└── calibration_images/ # 标定图像存储目录
这种结构分离了接口与实现,便于维护和集成到其他项目中。CMake构建系统确保跨平台兼容性,而OpenCV依赖则提供了强大的图像处理基础。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心类实现详解
2.1 配置参数与标定结果结构体
CameraCalibration类通过两个核心结构体管理标定过程:
cpp复制struct CalibrationConfig {
// 棋盘格参数
int boardWidth = 9; // 内角点列数
int boardHeight = 6; // 内角点行数
float squareSize = 25.0f; // 方格实际尺寸(mm)
// 角点检测参数
bool useAdaptiveThreshold = true; // 自适应阈值
bool useNormalizeImage = true; // 图像归一化
// 标定选项
bool fixPrincipalPoint = false; // 是否固定主点
bool zeroTangentDist = false; // 是否忽略切向畸变
};
struct CalibrationResult {
cv::Mat cameraMatrix; // 3x3内参矩阵
cv::Mat distCoeffs; // 畸变系数向量
double totalRMSError; // 重投影误差
bool isValid = false; // 标定结果有效性标志
};
这些参数设计考虑了实际应用场景:
- 棋盘格尺寸需根据实际标定板配置
- squareSize决定了标定结果的物理尺度
- 自适应阈值提升不同光照条件下的角点检测鲁棒性
2.2 角点检测实现
精确的角点检测是标
