C++ 基于OpenCV边缘的目标检测C++;
我有一个应用程序,我必须检测场景中是否存在某些项目。项目可以旋转并稍微缩放(较大或较小)。我试过使用关键点探测器,但它们不够快速和准确。因此,我决定首先使用Canny(或更快的边缘检测算法)检测模板和搜索区域中的边缘,然后匹配边缘以找到匹配的位置、方向和大小 所有这些都需要在不到一秒钟内完成 我尝试过使用C++ 基于OpenCV边缘的目标检测C++;,c++,opencv,visual-c++,object-detection,template-matching,C++,Opencv,Visual C++,Object Detection,Template Matching,我有一个应用程序,我必须检测场景中是否存在某些项目。项目可以旋转并稍微缩放(较大或较小)。我试过使用关键点探测器,但它们不够快速和准确。因此,我决定首先使用Canny(或更快的边缘检测算法)检测模板和搜索区域中的边缘,然后匹配边缘以找到匹配的位置、方向和大小 所有这些都需要在不到一秒钟内完成 我尝试过使用matchTemplate()和matchShape(),但前者不是缩放和旋转不变的,后者不能很好地处理实际图像。旋转模板图像以进行匹配也很耗时 到目前为止,我已经能够检测到模板的边缘,但我不知
matchTemplate()
和matchShape()
,但前者不是缩放和旋转不变的,后者不能很好地处理实际图像。旋转模板图像以进行匹配也很耗时
到目前为止,我已经能够检测到模板的边缘,但我不知道如何将它们与场景匹配
我已经完成了以下操作,但无法让它们正常工作(它们要么使用旧版本的OpenCV,要么只是不处理演示中的图像以外的其他图像):
有人能为我推荐一种方法吗?或者,如果可能的话,为相同的代码剪掉
这是我的样本输入图像(要检测的部分用红色标记)
这是一些正在做这件事的软件,也是我想要的:
这个话题是我在一个项目上一年的实际话题。因此,我将尝试解释我的方法是什么,以及我是如何做到这一点的。我假设您已经完成了预处理步骤(滤镜、亮度、曝光、校准等)。并确保清除图像上的噪音 注意:在我的方法中,我从参考图像上的轮廓收集数据,这是我想要的对象。然后我将这些数据与大图像上的其他轮廓进行比较
注意:如果您只想知道对象是否存在,培训可能是一个很好的解决方案。但是,如果您试图为工业应用程序做一些事情,这是完全错误的方法。我试了几次YOLO和haarcascade训练算法,还用它们训练了一些对象。我得到的经验是:他们可以找到几乎正确的对象,但中心坐标,旋转结果等将不会完全正确,即使您的校准是正确的。另一方面,训练时间和收集数据是痛苦的。您的图像质量相当差,光线条件非常差,因此您只有两种方法: 1.使用过滤器->二进制阈值->查找轮廓->匹配形状。但这种算法对于对象类型和图像质量来说非常不稳定。你会得到很多错误的轮廓,很难过滤它们。 2.Haarcascades->切割边界框->检查内部形状
所有“特殊点/边缘匹配”算法都无法在这种恶劣条件下工作 第三种情况是粉红色轮廓,这似乎是所有情况中最简单的一种,因为可以使用
cv2.inrange()
使用简单的颜色分割,然后使用cv2.findContours
然后利用轮廓的属性,例如面积/周长
比率、力矩等,从背景中分割对象,这将有助于检测几何相似的形状。对于第一种和第二种情况,我建议训练一个定制的haar cascade,就像我们对人脸使用haar cascade一样。OpenCV还提供了用于训练自定义haar特征检测器的API,haar特征与比例无关,我不确定是否与旋转无关,但我认为您可以通过提供不同方向的训练图像来训练。最后一个问题可以通过我的方法解决:如果y