Skip to content

高级拼接 API(Stitcher 类)

在本教程中,你将学习如何:

  • 使用以下类提供的高级拼接 API 进行拼接
    • cv::Stitcher
  • 学习如何使用预配置的 Stitcher 配置,利用不同的相机模型拼接图像。

本教程的代码如下所示。你可以从这里下载。

注意:C++ 版本包含额外的选项,例如图像分割(—d3)和更详细的错误处理,这些在 Python 示例中不存在。

代码见下方示例 本教程的代码如下所示。你可以从这里下载。

注意:C++ 版本包含额外的选项,例如图像分割(—d3)和更详细的错误处理,这些在 Python 示例中不存在。

代码见下方示例

最重要的代码部分是:

创建一个 stitcher 的新实例,cv::Stitcher::stitch 将完成所有繁重的工作。

cv::Stitcher::create 可以在一种预定义的配置(参数 mode)中创建 stitcher。详见 cv::Stitcher::Mode。这些 配置将设置多个 stitcher 属性,以在一种 预定义的场景中运行。在一种预定义配置中创建 stitcher 之后,你可以通过设置任何 stitcher 属性来调整拼接。

如果你有 cuda 设备,cv::Stitcher 可以配置为将某些 操作卸载到 GPU。如果你偏好这种配置,请将 try_use_gpu 设置为 true。 无论此标志如何,OpenCL 加速都将基于全局 OpenCV 设置透明地使用。

由于多种原因,拼接可能会失败,你应当始终检查 一切是否顺利以及生成的全景图是否存储在 pano 中。可能的错误代码请参见 cv::Stitcher::Status 文档。

拼接流水线中目前实现了 2 种相机模型。

  • 单应性模型(Homography model),期望图像之间的透视变换,实现在 cv::detail::BestOf2NearestMatcher、cv::detail::HomographyBasedEstimator、cv::detail::BundleAdjusterReproj、cv::detail::BundleAdjusterRay 中
  • 仿射模型(Affine model),期望 6 自由度或 4 自由度的仿射变换,实现在 cv::detail::AffineBestOf2NearestMatcher、cv::detail::AffineBasedEstimator、cv::detail::BundleAdjusterAffine、cv::detail::BundleAdjusterAffinePartial、cv::AffineWarper 中

单应性模型可用于创建由相机拍摄的照片全景图, 而基于仿射的模型可用于拼接扫描件和由 专用设备捕获的目标。

注意: cv::Stitcher 的某些详细设置可能没有意义。特别 是,你不应混合实现仿射模型的类和实现 单应性模型的类,因为它们处理不同的变换。

如果你启用了构建示例,你可以在 build/bin/cpp-example-stitching 下找到二进制文件。此示例是一个控制台应用程序,运行它时 不带参数即可查看帮助。opencv_extra 提供了一些用于测试所有可用 配置的示例数据。

要尝试全景模式,运行:

./cpp-example-stitching --mode panorama <path to opencv_extra>/testdata/stitching/boat*

boat.jpg

要尝试扫描模式,运行(来自家用扫描仪的数据集):

./cpp-example-stitching --mode scans <path to opencv_extra>/testdata/stitching/newspaper*

newspaper.jpg

或(来自专业图书扫描仪的数据集):

./cpp-example-stitching --mode scans <path to opencv_extra>/testdata/stitching/budapest*

budapest.jpg fisheye.jpg gvedit.jpg compressedPlaneA2B1.jpg affinepano.jpg

注意: 上面的示例假定 POSIX 平台,在 windows 上你必须显式提供所有文件名 (例如 boat1.jpg boat2.jpg…),因为 windows 命令行不支持 * 展开。

如果你想研究拼接流水线的内部原理,或者你想尝试详细的 配置,你可以使用 C++ 或 python 中可用的 stitching_detailed 源代码

stitching_detailed.cpp stitching_detailed.py stitching_detailed 程序使用命令行获取拼接参数。存在许多参数。上面的示例展示了一些可能的命令行参数:

boat5.jpg boat2.jpg boat3.jpg boat4.jpg boat1.jpg boat6.jpg —work_megapix 0.6 —features orb —matcher homography —estimator homography —match_conf 0.3 —conf_thresh 0.3 —ba ray —ba_refine_mask xxxxx —save_graph test.txt —wave_correct no —warp fisheye —blend multiband —expos_comp no —seam gc_colorgrad

成对图像使用单应性匹配 —matcher homography,估计器也用于变换估计 —estimator homography

特征匹配步骤的置信度为 0.3 : —match_conf 0.3。如果你在匹配图像时遇到困难,可以减小此值

两幅图像来自同一全景图的置信度阈值为 0. : —conf_thresh 0.3 如果你匹配图像有困难,可以减小此值

光束法平差(Bundle adjustment)代价函数为 ray —ba ray

光束法平差的精化掩码为 xxxxx ( —ba_refine_mask xxxxx),其中 ‘x’ 表示精化相应参数,’_’ 表示不精化。精化一个,并具有以下格式:fx,skew,ppx,aspect,ppy

将匹配图以 DOT 语言表示保存到 test.txt ( —save_graph test.txt) :标签说明:Nm 是匹配数,Ni 是内点数,C 是置信度

执行波动效应校正为否(—wave_correct no)

变形表面类型为 fisheye(—warp fisheye)

混合方法为 multiband(—blend multiband)

曝光补偿方法不使用(—expos_comp no)

接缝估计估计器为基于最小图割的接缝(—seam gc_colorgrad)

你也可以在命令行上使用这些参数:

boat5.jpg boat2.jpg boat3.jpg boat4.jpg boat1.jpg boat6.jpg —work_megapix 0.6 —features orb —matcher homography —estimator homography —match_conf 0.3 —conf_thresh 0.3 —ba ray —ba_refine_mask xxxxx —wave_correct horiz —warp compressedPlaneA2B1 —blend multiband —expos_comp channels_blocks —seam gc_colorgrad

你将得到:

对于使用扫描仪或无人机捕获的图像(仿射运动),你可以在命令行上使用这些参数:

newspaper1.jpg newspaper2.jpg —work_megapix 0.6 —features surf —matcher affine —estimator affine —match_conf 0.3 —conf_thresh 0.3 —ba affine —ba_refine_mask xxxxx —wave_correct no —warp affine

你可以在 https://github.com/opencv/opencv_extra/tree/4.x/testdata/stitching 中找到所有图像。