OpenCV 4.11.0
开源计算机视觉
加载中…
搜索中…
未找到匹配项
多摄像机标定

本教程将演示如何使用多摄像机标定工具箱。此工具箱基于“随机”图案标定对象的用法,因此本教程主要分为两部分:对“随机”图案的介绍和多摄像机标定。

随机图案标定对象

随机图案是由随机生成的图像。“随机”是指它具有许多特征点。生成后,将其打印出来并用作标定对象。以下两幅图像是随机图案及其拍摄照片。

要生成随机图案,请使用cv::randpattern::RandomPatternGenerator 类(位于ccalib 模块中)。运行如下:

cv::randpattern::RandomPatternGenerator generator(width, height);
generator.generatePattern();
pattern = generator.getPattern();

这里widthheight 是图案图像的宽度和高度。获取图案后,将其打印出来并拍摄一些照片。

现在我们可以使用这些图像来标定相机。首先,需要检测objectPointsimagePoints。使用cv::randpattern::RandomPatternCornerFinder 类来检测它们。示例代码如下:

cv::randpattern::RandomPatternCornerFinder finder(patternWidth, patternHeight, nMiniMatches);
finder.loadPattern(pattern);
finder.computeObjectImagePoints(vecImg);
vector<Mat> objectPoints = finder.getObjectPoints();
vector<Mat> imagePoints = finder.getImagePoints();

这里变量patternWidthpatternHeight 是使用某个用户定义单位表示的物理图案宽度和高度。vecImg 是存储标定图像的图像向量。

其次,使用标定函数,例如cv::calibrateCameracv::omnidir::calibrate 来标定相机。

多摄像机标定

现在我们转向多摄像机标定,目前此工具箱必须使用随机图案对象。

要标定多个摄像机,我们首先需要拍摄一些随机图案的照片。当然,为了标定外部参数,需要多个摄像机(至少两个)同时拍摄同一个图案。另一件事是,为了帮助程序知道照片是由哪个摄像机拍摄的以及是哪个图案,图像文件应命名为“cameraIdx-timestamp.*”。具有相同时间戳的照片表示它们是由多个摄像机拍摄的同一对象。此外,cameraIdx 应从 0 开始。一些文件名示例为“0-129.png”、“0-187.png”、“1-187”、“2-129”。

然后,我们可以运行多摄像机标定,如下所示:

cv::multicalib::MultiCameraCalibration multiCalib(cameraType, nCamera, inputFilename,patternWidth, patternHeight, showFeatureExtraction, nMiniMatches);
multiCalib.run();
multiCalib.writeParameters(outputFilename);

这里cameraType 指示摄像机类型,支持multicalib::MultiCameraCalibration::PINHOLEmulticalib::MultiCameraCalibration::OMNIDIRECTIONAL。对于全向相机,您可以参考cv::omnidir 模块了解详细信息。nCamera 是摄像机的数量。inputFilename 是由opencv/sample 中的imagelist_creator 生成的文件的文件名。它存储随机图案和标定图像的名称,第一个文件名是随机图案的名称。patternWidthpatternHeight 是图案的物理宽度和高度。showFeatureExtraction 是一个标志,指示是否显示特征提取过程。nMiniMatches 是每一帧中应检测到的最小点数,否则将放弃此帧。outputFilename 是用于存储参数的 xml 文件名。