使用不同颜色的球在Python/Opencv中跟踪高尔夫球

使用不同颜色的球在Python/Opencv中跟踪高尔夫球,python,opencv,Python,Opencv,只是想了解一些关于如何处理不同颜色球的高尔夫球跟踪问题的建议 我已经探索过使用absdiff()来获得帧之间的差异来跟踪球,但它也可以检测球员和球杆的移动。此外,使用HSV拾取特定颜色的球,但我希望能够拾取大多数颜色(白色、黄色、橙色、蓝色)。谢谢。 对每一帧进行预处理 应用GaussianBlur gaussian\u blur=cv2.GaussianBlur(帧,(22,22),0) 您可以更改参数,以上参数只是示例 假设以下是您的原始帧: 高斯模糊将是: 我们采用Gaussi

只是想了解一些关于如何处理不同颜色球的高尔夫球跟踪问题的建议

我已经探索过使用absdiff()来获得帧之间的差异来跟踪球,但它也可以检测球员和球杆的移动。此外,使用HSV拾取特定颜色的球,但我希望能够拾取大多数颜色(白色、黄色、橙色、蓝色)。谢谢。

  • 对每一帧进行预处理

    • 应用
      GaussianBlur

      gaussian\u blur=cv2.GaussianBlur(帧,(22,22),0)
      
      您可以更改参数,以上参数只是示例

      假设以下是您的原始帧:

      高斯模糊将是:

      我们采用
      GaussianBlur
      来减少噪声和异常值

    • 将帧转换为HSV比例

      hsv=cv2.cvt颜色(模糊,cv2.COLOR\u BGR2HSV)
      

      转换
      hsv
      使我们能够检测当前帧中的球

    • 在范围内应用
      方法:

      greenLower=(29,86,6)
      绿色上限=(64255255)
      遮罩=cv2.inRange(hsv、绿下、绿上)
      

      通过定义上下边界,我们在帧中通过声明29<色调值<64,86<饱和度<255,6<值<255来定位球

    • 应用
      腐蚀
      扩张

      mask=cv2.腐蚀(mask,None,迭代次数=2)
      掩码=cv2。放大(掩码,无,迭代次数=2)
      

    腐蚀
    扩张
    通常用于图像预处理

    腐蚀
    删除对象边界上的像素

    扩展
    由空格分隔的连接区域

  • 找到球的中心

  • 寻找轮廓

    cnts=cv2.findContours(掩码、cv2.RETR\u外部、cv2.CHAIN\u近似值\u简单)
    
    轮廓线用于形状检测和识别。输出将是球位置的数组。我们需要面具中最大的轮廓来找到中心

    c=max(cnts,key=cv2.面积)
    ((x,y),半径)=cv2.闭合圆(c)
    M=cv2.力矩(c)
    中心=(整数(M[“m10”]/M[“m00”]),整数(M[“m01”]/M[“m00”]))
    
    minClosingCircle
    将以最小面积覆盖对象

    力矩
    将返回加权面积

    更新:如果要查看球的质心,请添加以下内容:


    cv2.圆(帧,中心,5,(0,0,255),-1)
    
    结果:

  • 现在,如果我们合并所有帧,最终结果将是:


  • 以球的质心进行决赛:


现在,对于不同类型的球,您需要声明上界和下界,正如我们声明的
greenUpper
greenLower
一样。然后应用从1开始的步骤

完整代码:

导入cv2
导入imutils
导入时间
格林洛=(29,86,6)
绿色上限=(64255255)
vs=cv2.VideoCapture(“input.mp4”)
时间。睡眠(2.0)
尽管如此:
_,frame=vs.read()
如果框架为无:
打破
模糊=cv2.高斯模糊(帧,(11,11),0)
宽度,高度=框架形状[:2]
hsv=cv2.CVT颜色(模糊,cv2.COLOR_BGR2HSV)
遮罩=cv2.inRange(hsv、绿下、绿上)
掩模=cv2。腐蚀(掩模,无,迭代次数=2)
掩码=cv2。放大(掩码,无,迭代次数=2)
cnts=cv2.findContentours(mask.copy(),cv2.RETR_EXTERNAL,
cv2.链条(近似简单)
cnts=imutils.GRAP_轮廓(cnts)
中心=无
如果len(cnts)>0:
c=最大值(CNT,键=cv2.轮廓面积)
((x,y),半径)=cv2.闭合圆(c)
M=cv2.力矩(c)
中心=(整数(M[“m10”]/M[“m00”]),整数(M[“m01”]/M[“m00”]))
#要清楚地看到质心
如果半径>10:
圆(帧,(整数(x),整数(y)),整数(半径),(0,255,255),5)
imwrite(“circled_frame.png”,cv2.resize(frame,(int(高度/2),int(宽度/2)))
cv2.圆(框架,中心,5,(0,0,255),-1)
cv2.imshow(“帧”,帧)
如果cv2.waitKey(1)&0xFF==ord('q'):
打破
vs.release()
cv2.destroyAllWindows()
  • 对每一帧进行预处理

    • 应用
      GaussianBlur

      gaussian\u blur=cv2.GaussianBlur(帧,(22,22),0)
      
      您可以更改参数,以上参数只是示例

      假设以下是您的原始帧:

      高斯模糊将是:

      我们采用
      GaussianBlur
      来减少噪声和异常值

    • 将帧转换为HSV比例

      hsv=cv2.cvt颜色(模糊,cv2.COLOR\u BGR2HSV)
      

      转换
      hsv
      使我们能够检测当前帧中的球

    • 在范围内应用
      方法:

      greenLower=(29,86,6)
      绿色上限=(64255255)
      遮罩=cv2.inRange(hsv、绿下、绿上)
      

      通过定义上下边界,我们在帧中通过声明29<色调值<64,86<饱和度<255,6<值<255来定位球

    • 应用
      腐蚀
      扩张

      mask=cv2.腐蚀(mask,None,迭代次数=2)
      掩码=cv2。放大(掩码,无,迭代次数=2)
      

    腐蚀
    扩张
    通常用于图像预处理

    腐蚀
    删除对象边界上的像素

    扩展
    由空格分隔的连接区域

  • 找到球的中心

  • 寻找轮廓

    cnts=cv2.findContours(掩码、cv2.RETR\u外部、cv2.CHAIN\u近似值\u简单)
    
    轮廓用于形状检测和记录