【发布时间】: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