OpenCV  4.10.0
开源计算机视觉
正在加载...
正在搜索...
无匹配项
使用方格状棋盘格进行相机校准

目录

上一教程: 创建校准模式
下一教程: 使用 OpenCV 进行摄像机校准

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

本教程的目标是学习如何在给定一组棋盘格图像的情况下校准摄像机。

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

  • 在 CMake 配置中设置 BUILD_EXAMPLES 为 ON,以便用示例编译 OpenCV。
  • 转到 bin 文件夹,并使用 imagelist_creator 创建一个 XML/YAML 图像列表。
  • 然后,运行校准示例以获取摄像机参数。使用等于 3 厘米的正方形大小。

姿态估计

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

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

  • 创建空的控制台项目。加载一张测试图像
    Mat img = imread(argv[1], IMREAD_GRAYSCALE);
    
  • 使用 findChessboard 函数在此图像中检测棋盘格
    bool found = findChessboardCorners( img, boardSize, ptvec, CALIB_CB_ADAPTIVE_THRESH );
    
  • 现在,编写一个函数生成任何坐标系中棋盘格 3D 坐标的 vector<Point3f> 数组。为简单起见,让我们选择这样一个系统,即棋盘格的一个角位于原点,棋盘位于平面 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 范数来计算任意两个点(角点的端点)之间的距离。