【发布时间】:2020-04-27 23:25:39
【问题描述】:
我有一个应用程序,我必须检测场景中是否存在某些项目。这些项目可以旋转并稍微缩放(更大或更小)。我尝试过使用关键点检测器,但它们不够快速和准确。所以我决定首先使用 Canny(或更快的边缘检测算法)检测模板和搜索区域中的边缘,然后匹配边缘以找到找到的匹配的位置、方向和大小。
所有这些都需要在不到一秒钟的时间内完成。
我尝试过使用matchTemplate() 和matchShape(),但前者不是缩放和旋转不变的,后者不适用于实际图像。旋转模板图像以进行匹配也很耗时。
到目前为止,我已经能够检测到模板的边缘,但我不知道如何将它们与场景匹配。
我已经完成了以下操作,但无法让它们工作(他们要么使用旧版本的 OpenCV,要么只是不使用演示中的图像之外的其他图像):
https://www.codeproject.com/Articles/99457/Edge-Based-Template-Matching
Angle and Scale Invariant template matching using OpenCV
https://answers.opencv.org/question/69738/object-detection-kinect-depth-images/
有人可以建议我解决这个问题吗?或者尽可能截取相同的代码?
这是我的示例输入图像(要检测的部分用红色标记)
这些是一些正在执行此操作的软件,也是我想要的:
【问题讨论】:
-
第三种带有粉色轮廓的情况,似乎是所有这些中最简单的,因为可以使用
cv2.inrange()使用简单的颜色分割从背景中分割对象,然后使用cv2.findContours然后利用轮廓的属性,例如area/perimeter比率、矩等,这将帮助您检测几何相似的形状。 -
对于第一种和第二种情况,我建议训练自定义 haar 级联,就像我们为 Face 使用 haar 级联一样。 OpenCV 还提供了用于训练自定义 haar 特征检测器的 API,并且 haar 特征是 scale 独立的,我不确定旋转独立,但我认为您可以通过提供各种方向的训练图像来训练它。
-
最后一个可以用我的方法解决:stackoverflow.com/questions/59428540/… 如果你能很好地分割形状,你可以在很多情况下使用 minAreaRecht (我认为你示例中的工具图像可能会解决方式,或与关键点匹配)。对旋转不变关键点描述符进行一些研究,以了解如何达到旋转不变性。也许你可以使用它。不过,对于您的特殊情况,可能没有给定的解决方案。
-
@Micka 问题是要检测的项目将由用户设置(它可以是矩形、圆形或任何随机形状)。我将如何找出是哪种情况,然后尝试相应地找到?这是我考虑基于边缘的主要原因。我什至可以使用基于轮廓的检测(如果速度很快的话),但在大多数图像(如第一张和第二张)中很难检测到最外层的轮廓
-
倒角匹配是一种很好的基于边缘的方法,但您必须使其缩放和旋转不变(例如,为旋转准备不同的模板并使用金字塔方法进行缩放)。通用方法是关键点匹配(筛选/冲浪/球),但它通常需要一些纹理对象。如果您可以识别出一些可重现的边缘,例如角、圆等,那么通过 RANSAC 进行单应性猜测,然后对所有边缘进行内部/外部测试可能会很好。
标签: c++ opencv visual-c++ object-detection template-matching