OpenCV 4.10.0
开源计算机视觉
|
本教程将展示如何使用多相机校准工具箱。此工具箱基于“随机”模式校准对象,因此本教程主要分为两部分:“随机”模式简介和多相机校准。
随机模式是一种随机生成的图像。它是“随机的”,因此它具有许多特征点。生成后,对其打印出来并将其用作校准对象。以下两幅图像分别是随机模式及其拍摄的照片。
若要生成随机模式,请在 ccalib
模块中使用类 cv::randpattern::RandomPatternGenerator
。运行如下命令:
在此处,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 文件名。