OpenCV 4.12.0
开源计算机视觉
加载中...
搜索中...
无匹配项
多相机标定

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

随机图案标定对象

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

要生成随机图案,请使用ccalib模块中的类cv::randpattern::RandomPatternGenerator。像这样运行它:

cv::randpattern::RandomPatternGenerator generator(width, height);
generator.generatePattern();
cv::Mat 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文件,将存储标定参数。