请注意,这尚未经过测试。
一旦你提取了球的位置,你就可以得到它的轮廓。我的建议仅适用于具有较浅色块和较暗色块(即五边形)的足球。
确定良好的二进制阈值以同时获取白色和黑色补丁。做一些图像处理,如腐蚀或扩张,以消除缝合补丁之间的裂缝。在球周围画一个白色圆圈,以确保没有任何黑色斑块被视为“球中的洞”,并且您已准备好抓住球内的轮廓。主要轮廓是由白色斑块组成的白色轮廓,所有黑色轮廓都是深色斑块。
弱点:脏球可能存在二进制阈值问题,也许使用自适应阈值?
1. 使用查找表/数学公式(?)来计算黑色块的大小和距离
黑斑的大小取决于到球中心的距离。向算法提供关于距中心的黑色斑块距离及其大小(两个值都相对于球的大小)的学习数据。
例如:
Ball in recorded frame has bounding box of 200x200 px and area of 30000px
Found 6 black patches inside:
patch 1 is in the middle (distance 0px from center) and has area of 600px
patch 2 is on the side (distance 50px from center) and has area of 150px
patch 3... patch 4... and so on
因此,您可以为查找表提供数据:
distance = 0% -> area = 2%
distance = 25% -> area = 0.5%
distance = ... -> area = ...
and so on
现在,当您检查您检测到的东西是否是一个球时,请检查它们的黑色斑块大小。如果它们的大部分尺寸和距球中心的距离都在可接受的范围内,则检测到的物体是一个球。
2.检查轮廓形状
您可以使用 检查每个轮廓cvApproxPoly
。如果大多数黑色轮廓是五边形 - 它是一个球。