OpenCV 4.11.0
开源计算机视觉
|
本教程将演示如何使用多摄像机标定工具箱。此工具箱基于“随机”图案标定对象的用法,因此本教程主要分为两部分:对“随机”图案的介绍和多摄像机标定。
随机图案是由随机生成的图像。“随机”是指它具有许多特征点。生成后,将其打印出来并用作标定对象。以下两幅图像是随机图案及其拍摄照片。
要生成随机图案,请使用cv::randpattern::RandomPatternGenerator
类(位于ccalib
模块中)。运行如下:
这里width
和 height
是图案图像的宽度和高度。获取图案后,将其打印出来并拍摄一些照片。
现在我们可以使用这些图像来标定相机。首先,需要检测objectPoints
和 imagePoints
。使用cv::randpattern::RandomPatternCornerFinder
类来检测它们。示例代码如下:
这里变量patternWidth
和 patternHeight
是使用某个用户定义单位表示的物理图案宽度和高度。vecImg
是存储标定图像的图像向量。
其次,使用标定函数,例如cv::calibrateCamera
或 cv::omnidir::calibrate
来标定相机。
现在我们转向多摄像机标定,目前此工具箱必须使用随机图案对象。
要标定多个摄像机,我们首先需要拍摄一些随机图案的照片。当然,为了标定外部参数,需要多个摄像机(至少两个)同时拍摄同一个图案。另一件事是,为了帮助程序知道照片是由哪个摄像机拍摄的以及是哪个图案,图像文件应命名为“cameraIdx-timestamp.*”。具有相同时间戳的照片表示它们是由多个摄像机拍摄的同一对象。此外,cameraIdx 应从 0 开始。一些文件名示例为“0-129.png”、“0-187.png”、“1-187”、“2-129”。
然后,我们可以运行多摄像机标定,如下所示:
这里cameraType
指示摄像机类型,支持multicalib::MultiCameraCalibration::PINHOLE
和 multicalib::MultiCameraCalibration::OMNIDIRECTIONAL
。对于全向相机,您可以参考cv::omnidir
模块了解详细信息。nCamera
是摄像机的数量。inputFilename
是由opencv/sample
中的imagelist_creator
生成的文件的文件名。它存储随机图案和标定图像的名称,第一个文件名是随机图案的名称。patternWidth
和 patternHeight
是图案的物理宽度和高度。showFeatureExtraction
是一个标志,指示是否显示特征提取过程。nMiniMatches
是每一帧中应检测到的最小点数,否则将放弃此帧。outputFilename
是用于存储参数的 xml 文件名。