本教程将展示如何使用多个相机标定工具箱。 这个工具箱是基于“随机”的用法模式标定对象,那么本教程主要是两部分:介绍“随机”模式和多个相机校正。
随机模式标定对象
随机模式是随机生成的图像。 这是“随机”,这样就有许多特征点。 生成后,打印出来,把它作为一个校准对象。 以下两张图片是随机模式和拍照。
图像图像生成一个随机模式,使用的类 CV:randpattern::RandomPatternGenerator
在 ccalib
模块。 运行它
cv::randpattern::RandomPatternGenerator generator(width, height);generator.generatePattern();pattern = generator.getPattern();在这里 宽度
和 高度
是模式图像的宽度和高度。 获取模式后,打印出来,拍一些照片。
现在我们可以使用这些图像校准相机。 首先, objectPoints
和 imagePoints
需要检测。 使用类CV:randpattern::RandomPatternCornerFinder
检测它们。 一个示例代码
cv::randpattern::RandomPatternCornerFinder finder(patternWidth, patternHeight, nMiniMatches);finder.loadPattern(pattern);finder.computeObjectImagePoints(vecImg);vector objectPoints = finder.getObjectPoints();vector imagePoints = finder.getImagePoints();这里的变量 patternWidth
和 patternHeight
物理模式与用户定义的单位宽度和高度。 vecImg
是一个向量的图像存储校准图片。
第二,使用校准功能 CV:calibrateCamera
或 CV:omnidir::校准
校准相机。
多个摄像头校准
现在我们搬到多个相机标定,到目前为止,这个工具箱必须使用随机模式对象。
校准多个摄像头,我们首先需要随机模式的一些照片。 校准的原因,外在的参数,一个模式需要被多个摄像头(至少两个)在同一时间。 另一件事是帮助程序知道哪个相机和拍照模式,图像文件应该命名为“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::针孔
和 multicalib::MultiCameraCalibration::无方向性
都受支持。 全向相机,你可以参考 CV:omnidir
模块的细节。 nCamera
是camers的数量。 inputFilename
生成的一个文件的名称吗 imagelist_creator
从 opencv /样本
。 它存储随机模式和校准图片的名字,第一个文件的名字是随机模式的名称。 patternWidth
和 patternHeight
是物理模式的宽度和高度。 showFeatureExtraction
是一个标志指示是否显示特征提取的过程。 nMiniMatches
是最小的点,应该在每一帧中发现,否则这个框架将被放弃。 outputFilename
是一个xml文件名字存储参数。