Skip to content

使用 ArUco 和 ChArUco 进行标定

ArUco 模块也可用于相机标定。相机标定包括获取相机的内参和畸变系数。这些参数在相机光学系统未被修改之前保持不变,因此相机标定只需进行一次。

相机标定通常使用 OpenCV 的 cv::calibrateCamera() 函数来执行。该函数需要环境点与其在不同视点下相机图像中投影之间的某些对应关系。通常,这些对应关系是从棋盘格图案的角点获得的。有关更详细的信息,请参见 cv::calibrateCamera() 函数文档或 OpenCV 标定教程。

使用 ArUco 模块,可以基于 ArUco 标记角点或 ChArUco 角点进行标定。使用 ArUco 进行标定比使用传统棋盘格图案要通用得多,因为它允许遮挡或部分可见。

如前所述,可以使用标记角点或 ChArUco 角点进行标定。然而,强烈建议使用 ChArUco 角点方法,因为与标记角点相比,所提供的角点要精确得多。只有在由于某种限制而无法使用 ChArUco 标定板的场景下,才应使用标准 Board 进行标定。

要使用 ChArUco 标定板进行标定,需要从不同视点检测标定板,其方式与标准标定使用传统棋盘格图案相同。然而,由于使用 ChArUco 的优势,允许遮挡和部分可见,并且不需要所有角点在所有视点中都可见。

为 cv::aruco::CharucoBoard 使用 cv::calibrateCamera() 的示例:

每个视点捕获的 ChArUco 角点和 ChArUco 标识符存储在 allCharucoCorners 和 allCharucoIds 向量中,每个视点一个元素。

calibrateCamera() 函数将用相机标定参数填充 cameraMatrix 和 distCoeffs 数组。它将返回从标定中获得的重投影误差。rvecs 和 tvecs 中的元素将被填充为每个视点中相机(相对于 ChArUco 标定板)的估计位姿。

最后,calibrationFlags 参数决定了标定的一些选项。

samples/cpp/tutorial_code/objectDetection 文件夹中的 calibrate_camera_charuco.cpp 包含了一个完整的可运行示例。

现在,这些示例通过 cv::CommandLineParser 从命令行获取输入。对于此文件,示例参数如下:

"camera_calib.txt" -w=5 -h=7 -sl=0.04 -ml=0.02 -d=10
-v=path/img_%02d.jpg

charucocalibration.jpg arucocalibration.jpg

来自 opencv/samples/cpp/tutorial_code/objectDetection/tutorial_camera_charuco.yml 的相机标定参数是由放置在此文件夹中的 img_00.jpg-img_03.jpg 获得的。

如前所述,建议使用 ChArUco 标定板而不是 ArUco 标定板进行相机标定,因为 ChArUco 角点比标记角点更精确。然而,在某些特殊情况下,必须使用基于 ArUco 标定板的标定。与前面一样,它需要从不同视点检测 ArUco 标定板。

为 cv::aruco::GridBoard 使用 cv::calibrateCamera() 的示例:

samples/cpp/tutorial_code/objectDetection 文件夹中的 calibrate_camera.cpp 包含了一个完整的可运行示例。

现在,这些示例通过 cv::CommandLineParser 从命令行获取输入。对于此文件,示例参数如下:

"camera_calib.txt" -w=5 -h=7 -l=100 -s=10 -d=10 -v=path/aruco_videos_or_images