在OpenCV(C ++)中检测球形/圆形

4
我正在尝试在过滤后的图像中检测一个球。 在这个图像中,我已经删除了不能成为对象的部分。 当然,我尝试了HoughCircle函数,但是我没有得到期望的输出。 要么它找不到球,要么检测到太多圆。 问题在于球不是完全圆形的。 截图如下: enter image description here 我想如果我能识别单个对象,计算它们的中心并检查在不同方向上半径是否大致相同,它可能会起作用。 但是,如果球没有完全可见,也希望能够检测出来。 使用这种方法,我无法检测半圆或类似物体。
注意:这些图像来自实时视频流。
还有什么其他方法可以尝试呢? enter image description here

如果你能够获得足够的训练图像,级联分类器在这个应用中有很好的工作机会。 - Bull
谢谢。图片肯定足够了,因为这些图片来自视频流(我已经添加了这个信息)。我从未使用过级联分类器,但我会尝试处理它。 - Kite
1个回答

5
看起来您已经使用了差分成像或类似的方法获取所需的图像?不要寻找圆,而是寻找一个更通用的轮廓。建议如下:
  • 分离所有连接组件。
  • 对于每个连接组件-
  • 沿着轮廓走一圈,并将所有轮廓像素收集到列表中
  • 建议1:使用最小二乘法将椭圆拟合到轮廓点上
  • 建议2:研究每个轮廓像素的曲率,并检查它是否适合圆形或椭圆形。可以通过计算轮廓像素的边缘方向的直方图或检查从轮廓像素到轮廓像素的方向梯度来进行这种检查。对于圆形或椭圆形,第二种情况下,渐变应该几乎是均匀的(如果不太清楚,请问我)。
  • 对椭圆或轮廓应用周长、面积、长轴和短轴的长度等约束条件。将这些属性作为特征收集起来。
  • 您可以使用硬编码启发式/阈值来将一组特征分类为球体/非球体,也可以使用机器学习算法。我建议先保持简单,仅使用研究一些图像后得到的阈值。
希望这可以帮助您。

2
除了建议2之外,您还可以通过以下公式简单检查轮廓的圆形度:circularity = (4PIA)/P^2,其中_A_是轮廓所包围的区域面积,而_P_是轮廓的周长。 圆的圆形度为1。 - Dennis
感谢您的快速回复。我会尝试这些有用的建议。 您知道这是否足够快以支持实时视频流吗? - Kite
这主要取决于你的实现方式,但是在过去,我曾经在高清图像上进行椭圆检测,每帧大约需要25毫秒。所以我的回答是肯定的。 - Zaphod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接