使用SURF描述符在OpenCV中检测多个对象实例。

5
我正在使用OpenCV编写一个程序,旨在检测场景中的对象,即超市中的商品。
我计划使用SURF描述符来实现这个目的,然而到目前为止我找到的所有资料都是关于如何在场景中找到1个对象实例(通常使用最近邻匹配),而没有任何关于如何检测场景中有多个相同对象实例的资料(显然NN无法奏效,因为每个点的最佳匹配可能在不同的实例中)。
我还需要使用分类器,例如人工神经网络,它可以更好地帮助查找对象的多个实例,但我不知道如何使用关键点(keypoints)来进行ANN(或任何其他分类器)的训练。
我应该将每个SURF点的64个值作为ANN的输入,然后将5个产品的每个实例作为输出吗?这意味着同一对象内的所有点(不相似的点)将产生相同的输出。
我读过说这是正确的方法,但我不明白它为什么能够奏效,因为同一对象中的所有关键点可能(并且应该)具有不同的特征。但我想不出其他方法来实现。
如果有什么不清楚的地方,很抱歉我没有解释清楚,我会尽力澄清。

由于显然无法找到多个相同对象的实例,让我问一个简单的问题。使用SURF时,我应该使用什么作为ANN或SVM的训练数据?每个关键点都将是一个训练数据吗?输出将是包含这些点的图像的标签? - Gerardo Galarza
1个回答

3
我遇到了类似的问题。我所做的是:
  • 使用滑动窗口,对整个图像进行各种大小的ROI扫描。ROI的大小应该大致等于预期对象的大小。
  • 对于每个补丁,检测特征并进行匹配。如果检测到一个对象,则在主图像中将该区域设置为零。
  • 进入下一个补丁并重复上述步骤。
但如果你需要扫描大量ROI,使用SURF可能会有点慢,所以我使用了FAST特征检测器和BRISK描述符来加速处理过程。这方法效果不错。

非常感谢您的答复。我想我会选择滑动窗口,但是我一直试图避免这样做,因为我无法确定对象的大小。我不确定我理解第二点的意思,您是否意味着将匹配补丁的像素设置为零?您是如何进行匹配的?最近邻?您知道通过支持向量机、神经网络或其他分类器进行匹配的方法吗? - Gerardo Galarza
对于滑动窗口,请尝试使用不同的大小。对于匹配,我使用了《OpenCV2计算机视觉应用编程食谱》中的RobustMatcher类。它可以进行强健的匹配。您可以在此处获取代码:https://code.google.com/p/opencv-cookbook/(第09章> matcher.h)。 - cyberdecker
我不知道如何使用NN或SVM,但我认为通过我提到的匹配器和一些过滤(例如,检查单应矩阵是否有意义,如果透视变换得到具有预期宽高比的合理矩形等),你可以得到很好的检测结果。 - cyberdecker
好的,我会尝试以那种方式来做。最后,你是每次迭代将窗口移动几个像素还是移动与其宽度相等的步长? - Gerardo Galarza
我使用步长等于宽度的一半进行移动。在我的情况下,如果我按照宽度移动,有时物体会被切成两半(一半在一个窗口中,另一半在另一个窗口中)。因此,使用步长=宽度/2可以提高检测整个物体的几率。但这可能会有所变化,您可以调整步长值以在此情况下获得最佳值。 - cyberdecker
你能提供一个检测图像中多个对象实例的代码吗? - Ritik Kumar Agrahari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接