OpenCV 4.11.0
开源计算机视觉库
加载中…
搜索中…
无匹配项
使用方形棋盘格进行相机标定

目录

上一篇教程: 创建标定图案
下一篇教程: 使用OpenCV进行相机标定

原作者Victor Eruhimov
兼容性OpenCV >= 4.0

本教程的目标是学习如何根据一组棋盘格图像对相机进行标定。

测试数据: 使用您 data/chess 文件夹中的图像。

  • 在 cmake 配置中将 BUILD_EXAMPLES 设置为 ON,编译包含示例的 OpenCV。
  • 转到 bin 文件夹,并使用 imagelist_creator 创建图像的 XML/YAML 列表。
  • 然后,运行标定示例以获取相机参数。使用 3cm 的方格大小。

姿态估计

现在,让我们编写代码,该代码检测图像中的棋盘格并找到它与相机的距离。您可以将此方法应用于任何具有已知 3D 几何形状的对象;您可以在图像中检测到该对象。

测试数据: 使用 data 文件夹中的 chess_test*.jpg 图像。

  • 创建一个空的控制台项目。加载测试图像
    Mat img = imread(argv[1], IMREAD_GRAYSCALE);
    
  • 使用 findChessboard 函数检测图像中的棋盘格
    bool found = findChessboardCorners( img, boardSize, ptvec, CALIB_CB_ADAPTIVE_THRESH );
    
  • 现在,编写一个函数,该函数生成一个 vector<Point3f> 数组,其中包含任何坐标系中棋盘格的 3D 坐标。为简单起见,让我们选择一个系统,其中棋盘格的一个角位于原点,并且棋盘位于平面 *z = 0*
  • 从 XML/YAML 文件读取相机参数
    FileStorage fs( filename, FileStorage::READ );
    Mat intrinsics, distortion;
    fs["camera_matrix"] >> intrinsics;
    fs["distortion_coefficients"] >> distortion;
    
  • 现在,我们可以通过运行 `solvePnP` 来查找棋盘格姿态
    vector<Point3f> boardPoints;
    // fill the array
    ...
    
    solvePnP(Mat(boardPoints), Mat(foundBoardCorners), cameraMatrix,
                         distCoeffs, rvec, tvec, false);
    
  • 计算重投影误差,就像在标定示例中所做的那样(参见 opencv/samples/cpp/calibration.cpp,函数 computeReprojectionErrors)。

问题:您将如何计算从相机原点到任何一个角的距离?答案:由于我们的图像位于 3D 空间中,首先我们将计算相对相机姿态。这将给我们提供 3D 到 2D 的对应关系。接下来,我们可以应用简单的 L2 范数来计算任意点(角的端点)之间的距离。