使用不同颜色的球在Python/Opencv中跟踪高尔夫球
只是想了解一些关于如何处理不同颜色球的高尔夫球跟踪问题的建议 我已经探索过使用absdiff()来获得帧之间的差异来跟踪球,但它也可以检测球员和球杆的移动。此外,使用HSV拾取特定颜色的球,但我希望能够拾取大多数颜色(白色、黄色、橙色、蓝色)。谢谢。使用不同颜色的球在Python/Opencv中跟踪高尔夫球,python,opencv,Python,Opencv,只是想了解一些关于如何处理不同颜色球的高尔夫球跟踪问题的建议 我已经探索过使用absdiff()来获得帧之间的差异来跟踪球,但它也可以检测球员和球杆的移动。此外,使用HSV拾取特定颜色的球,但我希望能够拾取大多数颜色(白色、黄色、橙色、蓝色)。谢谢。 对每一帧进行预处理 应用GaussianBlur gaussian\u blur=cv2.GaussianBlur(帧,(22,22),0) 您可以更改参数,以上参数只是示例 假设以下是您的原始帧: 高斯模糊将是: 我们采用Gaussi
- 对每一帧进行预处理
- 应用
GaussianBlur
您可以更改参数,以上参数只是示例 假设以下是您的原始帧: 高斯模糊将是: 我们采用gaussian\u blur=cv2.GaussianBlur(帧,(22,22),0)
来减少噪声和异常值GaussianBlur
- 将帧转换为HSV比例
转换hsv=cv2.cvt颜色(模糊,cv2.COLOR\u BGR2HSV)
使我们能够检测当前帧中的球hsv
- 在范围内应用
方法:
通过定义上下边界,我们在帧中通过声明29<色调值<64,86<饱和度<255,6<值<255来定位球greenLower=(29,86,6) 绿色上限=(64255255) 遮罩=cv2.inRange(hsv、绿下、绿上)
- 应用
和腐蚀
:扩张
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
- 在范围内应用
方法:
通过定义上下边界,我们在帧中通过声明29<色调值<64,86<饱和度<255,6<值<255来定位球greenLower=(29,86,6) 绿色上限=(64255255) 遮罩=cv2.inRange(hsv、绿下、绿上)
- 应用
和腐蚀
:扩张
mask=cv2.腐蚀(mask,None,迭代次数=2) 掩码=cv2。放大(掩码,无,迭代次数=2)
腐蚀
和扩张
通常用于图像预处理
腐蚀
删除对象边界上的像素
扩展
由空格分隔的连接区域
- 寻找轮廓
轮廓用于形状检测和记录cnts=cv2.findContours(掩码、cv2.RETR\u外部、cv2.CHAIN\u近似值\u简单)