calibrateCamera
在 OpenCV 中,calibrateCamera
函数用于进行相机标定,估计相机的内参和外参。相机标定的目的是确定相机在三维空间中的位置和方向,以及其光学特性。
函数原型
double cv::calibrateCamera(
const std::vector<std::vector<cv::Point3f>>& objectPoints,
const std::vector<std::vector<cv::Point2f>>& imagePoints,
cv::Size imageSize,
cv::Mat& cameraMatrix,
cv::Mat& distCoeffs,
std::vector<cv::Mat>& rvecs,
std::vector<cv::Mat>& tvecs,
int flags = 0,
cv::TermCriteria criteria = cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 30, DBL_EPSILON)
);
参数说明
-
objectPoints
:- 三维空间中的点坐标,通常是一个三维标定板的点坐标,使用世界坐标系表示。每个图像的点集为一组。
-
imagePoints
:- 对应于图像中的点坐标,通常是通过特征检测(如角点检测)获得的。
-
imageSize
:- 图像的大小(宽度,高度),通常为
cv::Size(width, height)
。
- 图像的大小(宽度,高度),通常为
-
cameraMatrix
:- 输出参数,表示相机内参矩阵。初始化时可以使用
cv::Mat::eye(3, 3, CV_64F)
。
- 输出参数,表示相机内参矩阵。初始化时可以使用
-
distCoeffs
:- 输出参数,表示相机的畸变系数,通常为一个 5 或 8 元素的向量。
-
rvecs
:- 输出参数,表示每个图像的旋转向量,描述相机在世界坐标系中的方向。
-
tvecs
:- 输出参数,表示每个图像的平移向量,描述相机在世界坐标系中的位置。
-
flags
:- 可选参数,用于指定标定过程中的选项,例如是否使用初始估计。
-
criteria
:- 终止条件,用于控制迭代的停止条件。
返回值
- 返回相机重投影误差,通常用于评估标定的准确性。
示例代码
下面是一个使用 calibrateCamera
的简单示例:
#include <opencv2/opencv.hpp>
#include <vector>
#include <iostream>
int main() {
// 设定标定板的每个角点的三维坐标
std::vector<std::vector<cv::Point3f>> objectPoints; // 3D点
std::vector<std::vector<cv::Point2f>> imagePoints; // 2D点
// 假设我们有 10 张图像,每张图像都检测到角点
for (int i = 0; i < 10; ++i) {
std::vector<cv::Point3f> obj;
for (int j = 0; j < 6; ++j) {
// 6x9 的角点
for (int k = 0; k < 9; ++k) {
obj.emplace_back(k * 20.0f, j * 20.0f, 0.0f); // 每个点间隔 20 单位
}
}
objectPoints