OpenCV  4.10.0
开源计算机视觉
加载中...
搜索中...
无匹配项
多相机校准

本教程将展示如何使用多相机校准工具箱。此工具箱基于“随机”模式校准对象,因此本教程主要分为两部分:“随机”模式简介和多相机校准。

随机模式校准对象

随机模式是一种随机生成的图像。它是“随机的”,因此它具有许多特征点。生成后,对其打印出来并将其用作校准对象。以下两幅图像分别是随机模式及其拍摄的照片。

若要生成随机模式,请在 ccalib 模块中使用类 cv::randpattern::RandomPatternGenerator。运行如下命令:

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 文件名。