Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基于OpenCV边缘的目标检测C++;_C++_Opencv_Visual C++_Object Detection_Template Matching - Fatal编程技术网

C++ 基于OpenCV边缘的目标检测C++;

C++ 基于OpenCV边缘的目标检测C++;,c++,opencv,visual-c++,object-detection,template-matching,C++,Opencv,Visual C++,Object Detection,Template Matching,我有一个应用程序,我必须检测场景中是否存在某些项目。项目可以旋转并稍微缩放(较大或较小)。我试过使用关键点探测器,但它们不够快速和准确。因此,我决定首先使用Canny(或更快的边缘检测算法)检测模板和搜索区域中的边缘,然后匹配边缘以找到匹配的位置、方向和大小 所有这些都需要在不到一秒钟内完成 我尝试过使用matchTemplate()和matchShape(),但前者不是缩放和旋转不变的,后者不能很好地处理实际图像。旋转模板图像以进行匹配也很耗时 到目前为止,我已经能够检测到模板的边缘,但我不知

我有一个应用程序,我必须检测场景中是否存在某些项目。项目可以旋转并稍微缩放(较大或较小)。我试过使用关键点探测器,但它们不够快速和准确。因此,我决定首先使用Canny(或更快的边缘检测算法)检测模板和搜索区域中的边缘,然后匹配边缘以找到匹配的位置、方向和大小

所有这些都需要在不到一秒钟内完成

我尝试过使用
matchTemplate()
matchShape()
,但前者不是缩放和旋转不变的,后者不能很好地处理实际图像。旋转模板图像以进行匹配也很耗时

到目前为止,我已经能够检测到模板的边缘,但我不知道如何将它们与场景匹配

我已经完成了以下操作,但无法让它们正常工作(它们要么使用旧版本的OpenCV,要么只是不处理演示中的图像以外的其他图像):

有人能为我推荐一种方法吗?或者,如果可能的话,为相同的代码剪掉

这是我的样本输入图像(要检测的部分用红色标记)

这是一些正在做这件事的软件,也是我想要的:


这个话题是我在一个项目上一年的实际话题。因此,我将尝试解释我的方法是什么,以及我是如何做到这一点的。我假设您已经完成了预处理步骤(滤镜、亮度、曝光、校准等)。并确保清除图像上的噪音

注意:在我的方法中,我从参考图像上的轮廓收集数据,这是我想要的对象。然后我将这些数据与大图像上的其他轮廓进行比较

  • 使用canny边缘检测并在参考点上查找轮廓 形象。你需要在这里确定,它不应该错过某些部分 轮廓线。若遗漏了,可能预处理部分应该有一些 问题。另一个重要的一点是,你需要找到一个 适当的模式,因为每种模式都有 不同的属性,因此您需要为您的 案例在最后,你需要消除轮廓是好的 给你

  • 从参考中获取轮廓后,可以找到轮廓的长度 使用findContours()输出阵列的每个等高线。你可以比较 将这些值放在大图像上,并消除 太不一样了

  • 精确绘制一个合适的封闭矩形,用于 每个轮廓。在我的例子中,这个函数非常好用。我是 使用此函数获取2个参数:

    a) 计算拟合矩形的短边和长边,并比较 与大图像上的其他轮廓的值

    b) 计算黑色或白色的百分比(如果您的图像 灰度,获取接近白色或黑色的像素的百分比)和 最后比较一下

  • 可以在末尾应用于其他轮廓,也可以应用于所有轮廓(我建议使用第一种方法)。每个轮廓只是一个数组,因此您可以将参考轮廓保存在一个数组中,并在最后将其与其他轮廓进行比较。在完成3个步骤后,然后应用matchShape对我来说非常好

  • 我认为直接使用是不好的。我将每个轮廓绘制到不同的mat zero图像(空白黑色表面)作为模板图像,然后和其他图像进行比较。直接使用参考模板图像不会产生好的效果

  • OpenCV在寻找圆、凸度等方面有一些很好的算法。如果您的情况与它们相关,也可以将它们作为一个步骤使用

  • 最后,您只需获得所有数据、值,就可以在脑海中创建一个表格。剩下的是一种统计分析

  • 注:我认为最重要的部分是预处理部分。因此,请确保您有一个干净、几乎无噪音的图像和参考


    注意:如果您只想知道对象是否存在,培训可能是一个很好的解决方案。但是,如果您试图为工业应用程序做一些事情,这是完全错误的方法。我试了几次YOLO和haarcascade训练算法,还用它们训练了一些对象。我得到的经验是:他们可以找到几乎正确的对象,但中心坐标,旋转结果等将不会完全正确,即使您的校准是正确的。另一方面,训练时间和收集数据是痛苦的。

    您的图像质量相当差,光线条件非常差,因此您只有两种方法: 1.使用过滤器->二进制阈值->查找轮廓->匹配形状。但这种算法对于对象类型和图像质量来说非常不稳定。你会得到很多错误的轮廓,很难过滤它们。 2.Haarcascades->切割边界框->检查内部形状


    所有“特殊点/边缘匹配”算法都无法在这种恶劣条件下工作

    第三种情况是粉红色轮廓,这似乎是所有情况中最简单的一种,因为可以使用
    cv2.inrange()
    使用简单的颜色分割,然后使用
    cv2.findContours
    然后利用轮廓的属性,例如
    面积/周长
    比率、力矩等,从背景中分割对象,这将有助于检测几何相似的形状。对于第一种和第二种情况,我建议训练一个定制的haar cascade,就像我们对人脸使用haar cascade一样。OpenCV还提供了用于训练自定义haar特征检测器的API,haar特征与比例无关,我不确定是否与旋转无关,但我认为您可以通过提供不同方向的训练图像来训练。最后一个问题可以通过我的方法解决:如果y