![]() |
OpenCV 4.12.0
开源计算机视觉
|
配准模块实现了参数化图像配准。所实现的方法是直接对齐,即它直接使用像素值来计算一对图像之间的配准,而不是基于特征的配准。该实现基本遵循[262] 中的相应部分。
当试图配准在不同光照条件或曝光时间下拍摄的图片,或者图像仅部分重叠时,基于特征的方法相较于基于像素的方法具有一些优势。另一方面,基于像素的方法与基于特征的方法相比,其主要优势在于对某些图片(在相似光照条件下拍摄且有显著重叠的图片)具有更好的精度,因为我们使用了图像中所有可用的信息,这使我们能够实现亚像素精度。这对于多帧去噪或超分辨率等特定应用尤为重要。
事实上,基于像素和基于特征的配准方法可以相互补充:应用程序可以首先使用特征获得粗略配准,然后使用基于像素的方法对图像的重叠区域进行配准细化。所开发的代码支持这种用例。
该模块实现了从抽象类 cv::reg::Map 或 cv::reg::Mapper 派生的类。前者模拟了两个参考系之间的坐标变换,而后者封装了一种调用方法来计算两幅图像之间映射的方式。尽管目标是实现基于像素的方法,但该模块可以扩展以支持其他能够计算图像之间变换的方法(特征方法、光流等)。
每个从 Map 派生的类都实现了一个运动模型,如下所示:
MapProjec 也可以用于模拟仿射运动或平移,但其上的一些操作成本更高,这就是定义另外两个类的原因。
从 Mapper 派生的类有:
如果图像之间的运动不是非常小,使用这些类的通常方法是创建一个 MapperGrad* 对象,并将其用作输入来创建 MapperPyramid,后者反过来被调用来执行计算。然而,如果图像之间的运动足够小,我们可以直接使用 MapperGrad* 类。另一种可能性是首先使用基于特征的方法进行粗略配准,然后通过 MapperPyramid 或直接使用 MapperGrad* 对象进行细化。这些映射器的“calculate”方法接受运动的初始估计作为输入。
在决定使用哪个 MapperGrad 时,我们必须考虑到,参数较多的映射器可以处理更复杂的运动,但涉及更多的计算,因此速度较慢。此外,如果我们对序列遵循的运动模型有信心,那么超出所需数量地增加参数会降低准确性:最好使用最少的自由度。
在模块测试中,有示例展示了如何使用任何已实现的映射器来配准一对图像。
类 | |
| 类 | cv::reg::Map |
| 用于建模两幅图像之间映射的基类。更多... | |
| 类 | cv::reg::MapAffine |
| 类 | cv::reg::Mapper |
| 用于建模计算映射算法的基类。更多... | |
| 类 | cv::reg::MapperGradAffine |
| 类 | cv::reg::MapperGradEuclid |
| 类 | cv::reg::MapperGradProj |
| 类 | cv::reg::MapperGradShift |
| 类 | cv::reg::MapperGradSimilar |
| 类 | cv::reg::MapperPyramid |
| 类 | cv::reg::MapProjec |
| 类 | cv::reg::MapShift |
| 类 | cv::reg::MapTypeCaster |