模板匹配还是对象识别?

信息处理 图像处理 opencv 物体识别 模板匹配
2022-02-22 21:33:22

问题:我有一张物体的照片(制造零件,如下面的照片),我想使用我的 Andoird 手机相机验证相机预览中的物体是否与模板匹配。(换句话说,它是否与模板相同的部分)

  • 我可以让用户移动相机,以便在相机预览中获得与模板相似的模板视图,但是会有不同的噪音水平和/或照明,可能还有不同的背景。

问题: 你建议我用什么来解决这个问题?我在考虑 Canny 边缘提取,然后将相机帧与模板中的 Canny 边缘提取相匹配?这是一个好主意吗?如果是,请告诉我如何实施?任何资源?样品?(我可以进行 Canny 边缘提取,但找不到匹配的方法)

如果不是一个好主意,那么您有什么建议?

我尝试过的事情:

  1. 特征提取和匹配:我使用了一些来自 OpenCV 的不同提取器和匹配器实现,我的应用程序正在工作并绘制检测到的特征点和匹配等。但是作为图像处理的初学者,我无法理解结果以及如何知道什么是匹配。任何想法,帮助,好的资源?
  2. 模板匹配:我使用了 OpenCV 模板匹配,但是性能很糟糕,我认为这不是解决方案。

样本模板照片

2个回答

这很难。在我真正尝试之前,我什至不确定我自己能不能做到这一点。这绝对不是可以在 DSP.SE 答案中描述的东西。

关于精巧的边缘,即使它是精确的,您也只会得到像线条图这样的图像作为输出。重点是下一步。有很多东西可以尝试,有很多关于边缘模式匹配的理论,但这并不容易。

在走这条路之前,我会尝试一些更简单的方法,例如,我将尝试定位这些圆的坐标和半径。(螺母,孔等)看看我是否可以仅使用这些信息来识别零件。那我就走直线了。

请注意,我只知道该领域的理论概述,通常不进行图像处理,但您可以肯定地尝试我建议使用 OpenCV 的方法。

好的,特征提取和匹配是初学者的方法。其他方法,如相对姿态估计、三角测量、3d 匹配等会复杂得多。

你的物体是金属的,因此有光泽。此外,如果没有正确的照明,很难匹配特征。但是,正如我从那张照片中看到的那样,您仍然拥有大量的功能。提取您的描述符并使用 FLANN 匹配它们。如果您使用 Sift 功能,它将为您提供足够的透视不变性。

我看到你的大部分模板都是平面的。因此,在使用 Sift+FLANN 计算匹配后,您不妨使用 RANSAC 进行单应性计算。因为 RANSAC 可以容忍大量的异常值(~50%),所以你最终会得到一个很好的单应性。幸运的是,OpenCV 也有。当然,这种单应性并不总是很好,您可以通过以下方式检测到这一点:

bool validate_homography(const double h[9]) { const double det = h[0] * h[4] - h[3] * h[1]; if (det < 0) return false; const double N1 = sqrt(h[0] * h[0] + h[3] * h[3]); if (N1 > 4 || N1 < 0.1) return false; const double N2 = sqrt(h[1] * h[1] + h[4] * h[4]); if (N2 > 4 || N2 < 0.1) return false; const double N3 = sqrt(h[6] * h[6] + h[7] * h[7]); if (N3 > 0.002) return false; return true; }

如果返回 true,您可以接受匹配。