19

我有一个包含参考对象(例如硬币)的参考黑白图像。对象由用户标记,即感兴趣区域。

现在我想分析其他图像并找到该对象或类似对象的位置和旋转。物体被任意放置在相机下方,但从不缩放,视角始终为 90 度。

我评估了一个完全符合我要求的商业图书馆:Euresys EasyFind

您可以在下面找到手头任务的示例图像。当前的实现使用 OpenCV 的特征检测并且不能完美地工作。

模板:

在此处输入图像描述

找到相同硬币的匹配项:

在此处输入图像描述

比赛因硬币略有不同而失败:

在此处输入图像描述

特征检测似乎是错误的方法。我需要以某种方式简化对象。但如果我这样做(Blur、Canny、CornerHarris)特征检测根本不起作用。

非常感谢任何有关可靠方法的建议。一个替代的图书馆建议也很好。

4

5 回答 5

10

既然你已经尝试了很多可能的技术,我会要求你通过以下链接(也许你可能已经通过了!!!)

  1. 所有特征检测器和描述符的比较
  2. 冲浪、怪胎和轻快的组合

您失败的第三张图像对比度低,与其余两张完美匹配有点棘手......所以我进行了对比度调整,我得到了以下与 Orb Feature 检测器和 Orb Descriptor Extractor 的匹配......我应用了对比度调整到特征检测之前的所有图像。

图 1 和图 3

在此处输入图像描述

图 2 与图 3

在此处输入图像描述

图像 1 和图像 2(此组合适用于所有检测器/提取器对)

在此处输入图像描述

对于匹配,我使用BruteForceMatcher<Hamming> matcher 了虽然点是局部的,但可以很好地猜到方向。需要使用一种以上的技术并首先进行一些圆形检测,以将特征检测限制在尽可能小的 ROI。加上检测点相对于圆心的方向很容易提供新的方向信息。参考第 1 个链接和第 2 个链接,您会注意到 SURF 和 BRIEF 对光线强度和模糊的变化具有很强的抵抗力。因此,您也可以尝试将 SURF 和 Brief 结合使用。

于 2013-01-14T09:50:29.247 回答
4

在输入中应用关键点检测器而不执行任何类型的预处理是查找相关有趣匹配点的一种非常糟糕的方法。

鉴于您的图像,数学形态学提供了很好的工具来预处理它们,并希望在以后的步骤中获得更好的匹配。其中一种工具称为形态重建,其概括称为 Levelings,它将基于标记图像合并和扩展平坦区域。如您所见,您的图像非常有噪点,因为到处都有山谷(那些暗点),所以您想要抑制其中的大部分。实现 Levelings 一点也不难,但由于我不知道免费提供的工具(实际上有一个主要在法国开发的大型框架,我相信它包含它,但我不记得名字了),让我们坚持更标准的形态重建。我们也没有标记图像,但这很容易构建:用一些结构元素腐蚀你的图像并应用形态重建,这被一些作者称为测地线开口。这将抑制一些嘈杂的山谷。

此时您的图像可能适合与某些关键点检测器一起使用,但我建议将其二值化,因为您要匹配的内容与灰度色调无关。典型的自动方法是由 Otsu 给出的,但还有其他的方法,比如用于直方图熵最小化的 Kapur 方法。我没有使用 Otsu 只是因为它很常见,对于 Stackoverflow 的一些新奇,我选择了另一种方法:P(是的,非常糟糕的理由)。最后,二值化后,您可以继续处理您的图像。一个单一的形态关闭在这里可能就足够了,因为您想要移除一些剩余的噪声点(它们不一定与组件断开连接,因此现在移除组件可能是一个糟糕的选择)。

为了简短起见,这里是第一张图像的测地线开口和最终预处理(使用上面的点):

在此处输入图像描述 在此处输入图像描述

这是其他两个图像的最终结果(应用完全相同的过程,没有不断修改或其他任何东西):

在此处输入图像描述 在此处输入图像描述

如果我现在继续使用典型的 SURF 方法匹配这些,我会得到大部分完美匹配,从而使另一个问题(定位一个相对于另一个)非常容易解决。我不包括我得到的匹配结果(除非有人想比较结果),因为我相信你现在应该使用 OpenCV 或任何其他正确的实现得到相同的结果。

如果重要的话,这里是 Mathematica 中实现上述预处理的单行代码:

g = Closing[Binarize[GeodesicOpening[f, DiskMatrix[5]], Method -> "Entropy"], 1]

其中f是灰度输入图像,g是生成的二值图像。

于 2013-01-16T19:36:26.217 回答
3

这个问题非常广泛,有很多方法取决于您想要实现的目标。您可以使用 Hough 变换来检测硬币,因为它是圆形的,尽管它可能会检测到许多圆形元素(所以这取决于您是否有其他类似的东西)。

更一般地说,您需要使用特征检测器(SURF、ORB、FAST、Shi-Tomassi),在包含硬币的参考框架和您正在寻找它的框架之间进行提取和匹配。然后,您可以使用 Homography 变换来确保您找到的点是相同的,因此您找到了您的硬币。

看看这个例子:

Features2D + Homography 查找已知对象

于 2012-11-29T21:21:49.727 回答
3

一般来说,您有以下步骤进行更改可能会影响系统性能:

  1. 探测器及其配置
  2. 描述符及其配置
  3. 匹配器及其配置
  4. RANSAC 参数(或您正在使用的任何参数)

您可以尝试MSER(最大稳定极值区域)作为检测器。众所周知,该检测器找不到像 SIFT/SURF 等其他检测器那样多的关键点。但它们非常稳定和独特。但我会尝试使用不同的描述符进行匹配。也许FREAK (Fast Retina Keypoint)

应该使用 RANSAC 算法进行过滤,但您始终可以通过设置您喜欢的距离进行调整。如果 RANSAC 不能正常工作,则尝试切换默认阈值,直到它看起来更好。

您可以更改的另一件事是匹配器。FLANN 非常好,但只能近似结果,在高维空间中搜索时表现出色。但是,如果您不关心性能,请尝试使用欧几里得或马氏距离的 BruteForceMatcher。

[EDIT-1]: *现在我想给你额外的可以帮助你的建议 =) * Kampel 等人。在他们的文章“基于图像的古钱币检索和识别”中描述了一些额外的方法来给古钱币一个形状描述符,以增强物品的描述特征。

另一个问题可能是 RANSAC,它是一种非常严格的消除异常值的方法。该方法Mat findHomography(InputArray srcPoints, InputArray dstPoints, int method=0, double ransacReprojThreshold=3, OutputArray mask=noArray() )具有附加参数(单击此链接)。您可以使用所有点、RANSAC 或最小中值稳健方法。

或者您尝试进行稳健的计算,什么距离可能是检索良好匹配的良好阈值。标准教程使用两倍的最小发现距离,这是一个开始但不是很稳健,因为它取决于当前匹配的距离。

标准 OpenCV 中不包含其他几个描述符/检测器。Lindbjerg 在他的论文“寻找最佳特征检测器-描述符组合”中描述了 MSER 与 DAISY-Descriptor 一起工作的发现。或者你可以试试AGASTBRISK。一个真正的大缺点是它们都不包含在标准的 OpenCV 发行版中。有一些实现,但您必须集成它们,这可能意味着大量工作。

于 2013-01-09T18:12:47.767 回答
1

我相信最适合您的是某种版本的蛮力搜索,类似于cvMatchTemplate. 所有基于特征提取的搜索都对噪声非常敏感;除非您有先验理由知道某些类型的特征将在所有感兴趣的图像中突出显示(例如:硬币的轮廓圆/椭圆形),否则特征提取不太可能给您带来良好的性能。蛮力匹配的问题在于它对比例和旋转敏感。也许您可以查看有关无标度匹配和/或蛮力可能的标度和旋转的文献。对于您提供的示例图像,如果旋转几度并缩放几个百分比,它实际上会很好地匹配自己;你“只”需要几百个电话cvMatchTemplate找到一个旋转的、缩放的版本。

于 2013-01-14T04:20:51.853 回答