【问题标题】:How to remove false detections?如何去除错误检测?
【发布时间】:2013-04-16 08:36:22
【问题描述】:

我正在使用 OpenCV 来检测二进制图像中的椭圆,如下所示。在图像中,有八个椭圆需要检测。我可以使用 findContours 获得很多轮廓,包括八个椭圆。问题是:我如何判断哪个是椭圆哪个不是?如何去除所有其他错误检测?

【问题讨论】:

标签: opencv image-processing


【解决方案1】:

在这种特定情况下,Hough Circle Transform 可能是最简单的解决方案。

复制教程中的代码,将cv::HoughCircles()的参数改为:

/// Apply the Hough Transform to find the circles
HoughCircles( src_gray, circles, CV_HOUGH_GRADIENT, 1, 10, 40, 30, 0, 0 );

输出

但我喜欢@George 的想法,随它去吧,它比指定硬编码常量更健壮。我的方法对这张图片很有效,但是如果你有不同大小的圆圈和东西的图片,你想使用cv::minEnclosingCircle()

【讨论】:

    【解决方案2】:

    一个选项有点老套: 在 findContours 之上使用 minEnclosingCircle 并按 min 过滤轮廓。基于阈值的封闭半径(删除小于半径 A(删除小斑点)和大于半径 B(删除大斑点))。您也可以尝试minAreaRect 并检查宽/高比以寻找均匀的斑点而不是高/宽的斑点。

    比较简单的解决方案是使用霍夫变换。看看hough circle 和教程

    【讨论】:

    • 谢谢。我认为删除太大或太小的东西很有用。其实我有个想法,就是用胡的矩来消除误检。这意味着:首先计算一些训练椭圆的胡矩。然后对于每个轮廓,计算其 Hu 的矩,如果它们与训练的非常不同,那么我们可以排除该轮廓。你觉得这个想法有用吗?
    • 我自己没有使用过霍夫时刻,因此无法从经验中提供建议。 hough circles 听起来像是你需要的。抱歉,我无法提供更多帮助
    • @George Profenza:还是谢谢你。
    【解决方案3】:

    现在我想我已经使用自己的算法成功地解决了这个问题。只需发布它以供将来参考。

    如下图,所有的椭圆都可以准确定位。并且成功去除了错误检测。另一方面,该算法非常省时:在我的普通桌面上处理所有图像只需 0.03 秒。图片尺寸:448x336像素

    算法的过程:

    1. 使用函数 findContours 从二值图像中检测轮廓
    2. 通过设置轮廓最小尺寸的阈值来移除太小的轮廓
    3. 使用函数 fitEllipse 检测椭圆
    4. 将轮廓与对应的椭圆进行比较。具体来说,将所有轮廓点代入一般椭圆方程(参见http://www.maa.org/joma/volume8/kalman/general.html)。然后计算代数误差。如果误差小于阈值,则排除该轮廓。

    编辑: 评论 George Profenza 和 karlphillip 的回答。 感谢 George Profenza 和 karlphillip 的回答。但是,他们的回答并不能很好地解决问题。 George Profenza 给出的第一个想法是为轮廓的大小设置阈值。事实上,我已经在我的算法中使用了它。但显然这是算法的初步步骤。有很多“好”尺寸的错误检测。 George Profenza 的第二个想法是使用 HoughCircles,也是由 karlphillip 提出的。 HoughCircles 的问题是:(a)它很慢,而我需要在嵌入式系统中实时实现算法。 (b) 它只能检测圆形而不能检测椭圆。当然,当椭圆接近圆时,它也有效。但对于一般情况,它不会。此外,我上面的方法无法检测到“图 8”。这是一个大问题,我仍在努力。

    【讨论】:

    • 您的算法似乎错过了右下角的两个椭圆(“图 8”)。这是一个问题吗?请注意,霍夫方法找到了它们。
    • 是的。我很好奇你是否使用了霍夫圆。正如上面乔治和卡尔所建议的那样,这个问题似乎是正确的问题。一般来说,霍夫变​​换等方法往往比简单的启发式方法更稳健。
    • @Throwback1986:感谢您的 cmets。首先,我不使用 HoughCirces 的原因是:(a)它很慢(对吗?),而我需要在嵌入式系统中实时实现。 (b) 它只能找到圆而不能找到椭圆(对吧?)。当然,当椭圆接近一个圆时,它也可以找到椭圆。其次,“八字”确实是个大问题。事实上,我仍在努力。有什么想法吗?
    • @lightalchemist:感谢您的 cmets。请看我上面的回复。
    • @Shiyu:你确认霍夫圆技术对你的应用来说太慢了吗?
    【解决方案4】:

    虽然之前已经接受了另一个答案,但有几个选项需要探索,所以我将添加另一个答案。假设 Hough 方法对您的应用程序来说足够快,这里有一些有趣的替代方法:

    1. Ellipse detection with OpenCV
    2. http://toyhouse.cc/profiles/blogs/modified-hough-ellipse-transform-detecting-ellipse-in-an-accurate
    3. http://www.codeforge.com/article/131943
    4. 还有我在上面的 cmets 中添加的论文:http://www.bmva.org/bmvc/1988/avc-88-041.pdf

    我还可以补充一点,Hough 可能是可靠地检测椭圆的“正确”方法,但您可能会遇到其他挑战。您表示 Hough circles 在您的桌面上足够快,但桌面的性能与嵌入式系统匹配程度如何?嵌入式系统有浮点单元吗?如果不是,请不要对软件模拟浮点所表现出的性能过于惊慌。您仍然可以使用定点数学、查找表等令人满意地实现 Hough 算法。

    【讨论】:

      猜你喜欢
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      • 2012-03-03
      • 1970-01-01
      • 2016-10-04
      • 1970-01-01
      相关资源
      最近更新 更多