返回

OpenCV中的相机校准、失真和内外参:实用指南

人工智能

相机校准:计算机视觉的基石

引言

在计算机视觉领域,相机校准就像砌筑房屋时的地基,至关重要。它纠正镜头失真,获取相机的内外参数,这些参数对于三维重建、立体成像和增强现实等技术至关重要。

理解相机失真

想象你用一个凸透镜拍摄一张照片,直线物体在图像中可能会弯曲或变形,这就是相机失真。它是由镜头的几何缺陷引起的,可分为径向失真(线段从图像中心向外弯曲)和切向失真(线段沿图像边缘弯曲)。

相机内外参数

相机参数决定了相机在三维空间中的位置和方向。

  • 内外参: 相机坐标系与世界坐标系之间的关系。
  • 外参: 定义相机的旋转和位移。
  • 内参: 相机的内部几何结构,包括焦距、主点和畸变系数。

相机校准的过程

相机校准是获取内外参数和畸变系数的过程。通常使用棋盘格图案或标定板等具有已知几何形状的物体。

OpenCV 中的相机校准

OpenCV 提供了丰富的相机校准函数,包括:

  • cv::calibrateCamera:计算内外参数和失真系数。
  • cv::undistort:使用校准参数对图像进行失真校正。
  • cv::stereoCalibrate:校准立体相机并计算内外参数。

步骤指南

  1. 收集图像: 拍摄具有标定板或棋盘格图案的多张图像。
  2. 角点检测: 使用 OpenCV 的 cv::findChessboardCorners 函数检测图像中的角点。
  3. 世界坐标提取: 计算标定板或棋盘格图案在世界坐标系中的位置。
  4. 相机校准: 使用 cv::calibrateCamera 函数计算内外参数和畸变系数。
  5. 失真校正: 使用 cv::undistort 函数对图像进行失真校正。

示例代码

#include <opencv2/opencv.hpp>

int main() {
  // 收集图像和角点
  std::vector<cv::Mat> images;
  std::vector<std::vector<cv::Point2f>> imagePoints;
  // ...

  // 世界坐标
  std::vector<std::vector<cv::Point3f>> objectPoints;
  // ...

  // 校准相机
  cv::Mat cameraMatrix, distCoeffs;
  cv::calibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix, distCoeffs);

  // 失真校正
  cv::Mat undistortedImage;
  cv::undistort(image, undistortedImage, cameraMatrix, distCoeffs);

  // ...
}

结论

相机校准是计算机视觉的基石,可提供相机的准确参数,用于各种应用。通过利用 OpenCV 的强大功能,我们可以轻松高效地执行相机校准。

常见问题解答

  1. 为什么相机校准很重要?

    • 相机校准纠正失真并获取相机参数,这些参数对于准确的三维重建和物体识别至关重要。
  2. 如何检测图像中的角点?

    • OpenCV 提供 cv::findChessboardCorners 函数,用于检测标定板或棋盘格图案上的角点。
  3. 我需要多少图像来进行校准?

    • 通常需要 10-20 张图像才能获得准确的校准结果。
  4. 校准参数可以随时间变化吗?

    • 是的,相机参数可能会随着时间的推移而改变,因此定期重新校准以获得最佳精度很重要。
  5. OpenCV 以外,还有其他相机校准工具吗?

    • 是的,还有其他工具,例如 MATLAB 的相机校准工具箱和 Halcon 的相机校准模块。