【问题标题】:Detect ball/circle in OpenCV (C++)在 OpenCV (C++) 中检测球/圆
【发布时间】:2026-02-11 11:55:01
【问题描述】:

我正在尝试检测过滤图像中的球。 在这张图片中,我已经删除了不能成为对象一部分的东西。 当然,我尝试了 HoughCircle 函数,但没有得到预期的输出。 要么它没有找到球,要么检测到的圆圈太多。 问题是球不是完全圆的

截图:

我认为它可以工作,如果我识别单个对象,计算它们的中心并检查半径在不同方向上是否大致相同。 但是,如果它也能在他不完全可见的情况下检测到球,那就太好了。 使用这种方法,我无法检测到半圆形或类似的东西。

编辑:这些图片来自视频流(实时)。

我还可以尝试什么其他方法?

【问题讨论】:

  • 我已经看过“*.com/questions/20698613/…”,但这个解决方案在我的情况下效果不佳......
  • 如果你能获得足够多的训练图像,级联分类器很有可能适用于这个应用程序。
  • 谢谢。肯定有足够的图像,因为这些图像来自视频流(我已添加此信息)。我从未使用过级联分类器,但我会尝试处理它。

标签: c++ c image opencv detection


【解决方案1】:

您似乎使用了差异成像或类似方法来获取您拥有的图像..?与其寻找圆圈,不如寻找更通用的循环。建议:

  • 分离所有连接的组件。
  • 对于每个连接的组件 -
  • 围绕轮廓走一圈,将所有轮廓像素收集到一个列表中
  • 建议 1:使用最小二乘法将椭圆拟合到轮廓点
  • 建议2:研究每个轮廓像素的曲率,检查它是否适合圆形或椭圆形。这种检查可以通过计算轮廓像素的边缘方向的直方图来完成,或者通过检查从轮廓像素到轮廓像素的方向梯度来完成。在第二种情况下,对于圆形或椭圆形,渐变应该几乎是均匀的(如果不是很清楚,请问我)。
  • 对椭圆或环的周长、面积、长轴和短轴的长度等应用约束。将这些属性收集为特征。
  • 您可以使用硬编码启发式/阈值将一组特征分类为球/非球,或使用机器学习算法。我会先保持简单,简单地使用研究一些图像后获得的阈值。

希望这会有所帮助。

【讨论】:

  • 除了建议2之外,您还可以通过以下公式简单地检查轮廓的圆度:circarity = (4*PI*A)/P^2,其中A 是轮廓包围的区域,P 是轮廓的周长。圆的圆度为 1。
  • 感谢您的快速回复。我会尝试这些有用的建议。你知道这对于实时视频流来说是否足够快?
  • 这主要取决于您的实现,但过去我以每帧 25 毫秒左右的速度对高清图像进行椭圆检测。所以我会说是的。