【问题标题】:Hough transform alternative for a simple real-time circle detection用于简单实时圆检测的霍夫变换替代方案
【发布时间】:2020-08-17 02:38:27
【问题描述】:

我最近才开始使用 OpenCV 和一般的图像处理,所以请多多包涵

我可以使用以下图片:

灰色轮廓是跟踪算法的结果,我在调试时画了它,所以你可以忽略它。

我正在跟踪发光的球体,因此很容易调低相机的曝光,然后滤除周围残留的噪音。所以我必须使用的始终是带有白色圆圈的黑色图像。有时会发出一点噪音,但通常这不是问题。

请注意,球体安装在平面上,因此当以特定角度握持时,圆的底部可能会被“切断”,但 Hough 变换似乎可以很好地处理这一点..

目前,我使用霍夫变换来获取位置和大小。然而,它在实际圆圈周围抖动很多,即使是非常小的运动。在运动时,它有时会完全失去轨道并且不会检测到任何圆圈。

此外,这是在实时 (30fps) 环境中,我必须运行两个霍夫圆变换,这在 ryzen 7 cpu 上占用了 30% 的 CPU 负载...

我尝试过使用二值图像(去除圆的“平滑”轮廓),并更改霍夫变换的设置。 dp 值越低,抖动似乎越小,但由于需要处理,它不再是实时的。

这基本上是我的代码:

ImageProcessing.ColorFilter(hsvFrame, Frame, tempFrame, ColorProfile, brightness);
ImageProcessing.Erode(Frame, 1);
ImageProcessing.SmoothGaussian(Frame, 7);
/* Args: cannyThreshold, accumulatorThreshold, dp, minDist, minRadius, maxRadius */
var circles = ImageProcessing.HoughCircles(Frame, 80, 1, 3, Frame.Width / 2, 3, 80);
if (circles.Length > 0)
    ...    

ImageProcessing 调用只是 OpenCV 框架 (EmguCV) 的包装器

是否有更好、更少紧张和更少性能要求的方法或算法来检测这些(如我所见)非常简单的圆圈?我没有在互联网上找到与这些圈子相匹配的答案。感谢您的帮助!

编辑: 这是直接从相机拍摄的图像,未经处理:

【问题讨论】:

  • 使用轮廓提取和 minEnclosureCircle 函数。如果你有很多噪音但总是一个圆圈,请尝试 RANSAC 圆圈检测
  • 我们能看到未处理的原始图像吗?和一个有运动的?没有这个,我们正在回答一个 XY 问题。
  • @Micka:我不相信 minEnclosureCircle,因为它只使用三个点来拟合圆,使其对噪音非常敏感。
  • 您可以使用像stackoverflow.com/questions/17159964/… 中的区域比较之类的健全性检查或测试边缘距离。如果正常情况下,圆形和背景可以很好地分离,minEnclosureCircle 是伟大而简单的。对于已知圈数的设置,我喜欢 RANSAC。
  • @Micka 我已经尝试使用 MinEnclosureCircle 进行轮廓提取,效果非常好;以后有时间我会测试更多,谢谢你的建议!唯一的问题是有时它不会随机检测轮廓。

标签: c# opencv image-processing


【解决方案1】:

我迫切希望看到人们经常通过边缘检测和/或霍夫变换来破坏优质信息。

在这种特殊情况下,您有一个可爱的斑点,可以在几分之一毫秒内检测到它,并且质心将产生良好的准确性。半径可以从区域中获得。

您报告说,在运动的情况下,霍夫会变得紧张;这可能是由于运动模糊或帧交错(取决于相机)。质心应该对这些影响更加稳健。

【讨论】:

  • 我希望我能为第一句话投两次赞成票。绝望是个好词。 :)
  • 哈哈,我还不是专家说的;非常感谢这个建议,我去试试!
  • 使用 cvMoments 我现在已经找到了我的 blob 的中心,但是我该如何计算半径呢?
  • @Twometer:我说的是区域,不是吗?
  • @YvesDaoust 是的,我知道,但我不知道如何从 opencv 获取它
猜你喜欢
  • 2015-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多