gpt4 book ai didi

c++ - 基于 OpenCV 边缘的对象检测 C++

转载 作者:行者123 更新时间:2023-12-02 10:37:17 25 4
gpt4 key购买 nike

我有一个应用程序,我必须在其中检测场景中某些项目的存在。这些项目可以旋转并稍微缩放(更大或更小)。我尝试过使用关键点检测器,但它们不够快速和准确。所以我决定首先使用 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/


有人可以建议我解决这个问题吗?或者如果可能的话,剪掉相同的代码?
这是我的示例输入图像(要检测的部分用红色标记)
Sample input image
这些是一些正在执行此操作的软件,也是我想要的:
enter image description here
enter image description here

最佳答案

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

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

  • 使用精明的边缘检测并在引用上找到轮廓
    图片。你需要在这里确定它不应该错过某些部分
    轮廓。如果它错过了,可能预处理部分应该有一些
    问题。另一个重要的一点是,你需要找到一个
    findContours 的合适模式因为每种模式都有
    不同的属性,因此您需要找到适合您的属性
    案子。最后,您需要消除好的轮廓
    为你。
  • 从引用获得轮廓后,您可以找到
    每个轮廓使用 findContours() 的 outputArray。你可以比较
    这些值在您的大图像上并消除轮廓
    太不同了。
  • minAreaRect精确地绘制一个适合的封闭矩形
    每个轮廓。就我而言,这个功能非常好用。我是
    使用此函数获取 2 个参数:

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

    b)计算黑度或白度的百分比(如果您的图像是
    灰度,获得接近白色或黑色像素的百分比)和
    最后比较一下。
  • matchShape可以在最后应用于其余轮廓,也可以应用于所有轮廓(我建议第一种方法)。每个轮廓只是一个数组,因此您可以将引用轮廓保存在一个数组中,并在最后将它们与其他轮廓进行比较。完成 3 个步骤然后应用 matchShape 对我来说非常好。
  • 我认为 matchTemplate不好直接用。我将每个轮廓绘制到不同的垫零图像(空白黑色表面)作为模板图像,然后与其他轮廓进行比较。直接使用引用模板图像不会产生好的结果。
  • OpenCV 有一些关于寻找圆、凸度等的很好的算法。如果您的情况与它们有关,您也可以将它们用作一个步骤。
  • 最后,您只需获取所有数据、值,您就可以在脑海中制作一个表格。剩下的就是统计分析。

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

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

    关于c++ - 基于 OpenCV 边缘的对象检测 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59679516/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com