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的主要内容,如果未能解决你的问题,请参考以下文章