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

Smi*_*ith 4 c c++ opencv image detection

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

截图:

在此输入图像描述

我认为它可以工作,如果我识别单个物体,计算它们的中心并检查半径是否在不同方向上大致相同.但是,如果它还没有被完全看见,那么它也会很好.用这种方法我无法检测到半圆形或类似的东西.

编辑:这些图像来自视频流(实时).

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

在此输入图像描述

Zap*_*hod 5

看起来你已经使用差异成像或类似的东西来获得你拥有的图像..?而不是寻找圈子,寻找更通用的循环.建议:

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

希望这可以帮助.

  • 除了建议2,您可以通过以下公式简单地检查轮廓的圆度:**圆度=(4*PI*A)/ P ^ 2**,其中_A_是轮廓包围的区域,_P_是轮廓的周长.圆的圆度为1. (2认同)