Opencv 图像注册 - MapperGradEuclid

Posted

技术标签:

【中文标题】Opencv 图像注册 - MapperGradEuclid【英文标题】:Opencv Image Registration - MapperGradEuclid 【发布时间】:2021-05-14 11:33:05 【问题描述】:

我正在尝试使用参考模板图像查找图像的平移和旋转。 模板图像是以下图片之一。

由于分辨率很小(320*240),我们想用opencv的图像配准类(Image Registration)解决对齐问题。我们不想使用基于特征的对齐方式。

到目前为止,我执行了以下功能来对齐参考mImageTemplate 图像和图像以找到旋转和平移图像 - input

cv::Mat pixelMapRegistration::align(cv::Mat input)

    cv::Mat transformed;
    cv::Ptr<cv::reg::Map> rot_shift_res;
    cv::reg::MapperGradEuclid rot_shift = cv::reg::MapperGradEuclid();
    rot_shift_res = rot_shift.calculate(mImageTemplate, input);
    cv::reg::Map* res = rot_shift_res.get();
    rot_shift_res->inverseWarp(input, transformed);
    return transformed;

不幸的是,到目前为止它还不起作用。有人看到问题了吗?

【问题讨论】:

【参考方案1】:

解决方案不仅仅是一种,而是几种不同的对齐方法。 这些图像配准技术仅在目标已经接近模板位置时才有效。因此我不再使用它了。

为了解决上述对齐问题,几种方法的管道完成了这项工作:

PCA(基本移位和旋转) ICP(迭代最近点 - 用于细化)

椭圆拟合(基本平移和旋转) ECC(cv::findTransformECC 函数 - 用于细化)

最后,您仍然面临这样的问题:如果零件从模板旋转超过 +/- 90°,则上述粗对准方法都无法正确旋转零件。因此,使用增强相关系数 (ECC) 来检查对齐是否成功,如果没有 - 将其旋转 180°。

【讨论】:

看看你的代码和结果会很有趣【参考方案2】:

在您的图像中,您有一个静态渐变背景和一个移动前景。您需要去掉背景细节,因为它会影响 MapperGrad。您可以尝试拍摄一张空白照片并使用绝对差异,或者您可以尝试使用形态 TopHat 或 BackroundSegmentation 来过滤掉背景。但我怀疑你需要从背景没有细节的更清晰的图像开始。这肯定是最简单的。

如果移动很小,你可以直接使用 MapperGrad,但是如果移动很大,就像你的图像集一样,那么你需要将 MapperGrad 输入到 MapperPyramid 中。

我认为真正的答案是您会想要使用形状或模板匹配之类的东西。图像配准并不是真正意义上的特征/模式匹配工具,因为它考虑了整个图像。当您尝试在不使用基准点、视频稳定等的情况下尝试减轻拍摄之间的振动时,它确实适用。

【讨论】:

您好@VoteCoffee,是的,您是对的,仅图像注册本身是不可能的。我使用了几种对齐方法。

以上是关于Opencv 图像注册 - MapperGradEuclid的主要内容,如果未能解决你的问题,请参考以下文章

基于OpenCV 图像处理的Android 找茬App 设计与实现

OpenCV 视频捕获 API

opencv图像旋转,该怎么解决

如何使用opencv实现图像匹配

图片处理-opencv-2.图像平滑

opencv 图像拉伸怎么做????