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