Skip to content

Latest commit

 

History

History
58 lines (42 loc) · 3.56 KB

File metadata and controls

58 lines (42 loc) · 3.56 KB

5.2.1 目标

在本节教程中,我们将介绍如何使用多相机校准工具箱主要内容包括:

  1. “随机”图案介绍和单个相机标定
  2. 多相机标定

5.2.2 “随机”图案介绍和标定

“随机”图案是一幅随机生成的图像。因为它是随机的,所以有许多特征点。生成后可将其打印出来并用作标定板。图5-10和图5-11分别是随机图像和为它拍摄的图片。

要生成随机图像,需要使用ccalib模块中的类cv::randpattern::RandomPatternGenerator。该类的使用方法在代码清单5-9中给出。

代码清单5-9:生成随机图像
cv::randpattern::RandomPatternGenerator generator(width, height);
generator.generatePattern();
pattern = generator.getPattern();

这里的width和height是图像的宽和高。生成图案后,我们可以把它打印出来并拍几张照片。之后便可以用这些图像来标定相机。

首先,需要检测拍摄的图像中的objectPoints和imagePoints。这里我们需要使用类cv::randpattern::RandomPatternCornerFinder来检测它们。该类的使用方法在代码清单5-10中给出。

代码清单5-10:检测图像角点
cv::randpattern::RandomPatternCornerFinder finder(patternWidth, patternHeight, nMiniMatches);
finder.loadPattern(pattern);
finder.computeObjectImagePoints(vecImg);
vector<Mat> objectPoints = finder.getObjectPoints();
vector<Mat> imagePoints = finder.getImagePoints();

这里可变的参数patternWidth和patternHeight是物理图像的宽度和高度,它使用用户自定义的单位。vecImg是存储标定图像的vector容器。

然后,使用标定函数,如cv::calibrateCamera或cv::omnidir::calibrate来标定相机。

5.2.3 多相机标定

接下来我们介绍多个相机标定,到目前为止这个工具箱必须使用前文介绍的随机图像。

为了标定多个相机,我们需要拍摄一些包含随机图案的照片。为了标定外部参数,需要同时使用多个摄像机(至少两个)来拍摄同一个图案。为了分清拍摄的相机和对应的图像,图像文件应该像这样命名:“cameraIdx-timestamp.*”。具有相同时间标记的照片意味着它们是由多个相机拍摄的同一个图案。另外,cameraIdx应该从0开始。例如:“0-129.png”、“0-187.png”、“1-187.png”、“2-129.png”。

然后,运行多个相机标定的程序,具体内容如代码清单5-11中所示。

代码清单5-11:多相机标定
cv::multicalib::MultiCameraCalibration multiCalib(cameraType, nCamera, inputFilename,patternWidth, patternHeight, showFeatureExtraction, nMiniMatches);
multiCalib.run();
multiCalib.writeParameters(outputFilename);

这里的cameraType表示相机类型,支持multicalib::MultiCameraCalibration::PINHOLE和multicalib::MultiCameraCalibration::OMNIDIRECTIONAL两种类型。有关广角相机的更多内容,可以参考cv::omnidir模块了解详情。nCamera是相机的数量。inputFilename是由opencv/sample中的imagelist_creator生成的文件名称。patternWidth和patternHeight是图案的物理宽度和高度。showFeatureExtraction是一个标志,指示是否显示特征提取过程。nMiniMatches是应该在每幅图中检测到的最小的点数,不满足该条件时这幅图将被舍弃。outputFilename是用于存储参数的xml文件名。