用于简单实时圆检测的霍夫变换替代方案

Two*_*ter 0 c# opencv image-processing

我最近才开始使用 OpenCV 和图像处理,所以请耐心等待

我有以下图片可以使用: ○

灰色轮廓是跟踪算法的结果,我为调试而绘制的,因此您可以忽略它。

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

请注意,球体安装在平面上,因此当以特定角度保持时,圆的底部可能会被“切断”,但霍夫变换似乎处理得很好。

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

此外,这是在实时 (30fps) 环境中,我必须运行两个 Hough 圆变换,这在 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)
    ...    
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:这是直接从相机中看到的图像,未经处理: 在此处输入图片说明

Yve*_*ust 5

我很想看到人们通过跳到边缘检测和/或霍夫变换来破坏好的信息的频率。

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

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