本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。
原文链接:使用OpenCV实现球跟踪和落点预测
在这个项目中,我使用 Python、OpenCV、Cvzone 和一些数学(特别是多项式回归)开发了一个球跟踪系统。该系统可以跟踪视频中的球,可视化其轨迹,甚至预测它是否会落在特定区域——虚拟“篮筐”。下面,我将分解我是如何构建它的、我遇到的挑战以及我在此过程中实现的一些很酷的功能。
第 1 步:设置环境
我使用的关键库是用于图像和视频处理的 OpenCV、用于简化计算机视觉任务的 Cvzone 和用于数学运算的 NumPy。首先,我导入了必要的模块:
import math
import cv2
import cvzone
from cvzone.ColorModule import ColorFinder
import numpy as np
初始化:
cv2.VideoCapture() # grabbing frames from the video file `Videos/vid (3).mp4
第 2 步:检测球
为了检测球,我使用了 HSV(色相、饱和度、值)颜色检测。这允许我通过设置特定范围的 HSV 值来根据球的颜色跟踪球:
myColorFinder = ColorFinder(False)
hsvVals = {'hmin': 8, 'smin': 96, 'vmin': 115, 'hmax': 14, 'smax': 255, 'vmax': 255}
这些 HSV 值对应于我视频中球的颜色。定义颜色范围后,我从视频中抓取每一帧并对其进行处理以找到球。
第 3 步:跟踪球
在检测到球的颜色后,我使用 'cvzone.findContours()' 来定位球在每一帧中的位置。这就是它变得有趣的地方。对于检测到球的每一帧,我将其位置保存在两个列表中:'posListX' 用于 x 坐标,'posListY' 用于 y 坐标。
imgContours, contours = cvzone.findContours(img, mask, minArea=500)
if contours:
posListX.append(contours[0]['center'][0])
posListY.append(contours[0]['center'][1])
“findContours”功能可以非常容易地找到球的确切位置,在检测到的球周围画一个绿色圆圈。
第 4 步:可视化轨迹
现在我已经有了球在各个帧中的位置,我使用多项式回归来模拟它的轨迹。多项式回归有助于找到二次方程的系数 A、B 和 C,该方程对球在 2D 空间中的运动进行建模:
A, B, C = np.polyfit(posListX, posListY, 2)
使用这个方程,我可以预测任何给定 x 坐标的 y 坐标,从而在视频中绘制球的预测路径。
第 5 步:预测结果
最后的触球是预测球是否会落在特定区域。我使用从多项式回归中得出的二次方程来计算球在未来某个时间点的位置。
a = A
b = B
c = C - 590 # 590 represents the y-value threshold for the "basket" area
x = int((-b - math.sqrt(b ** 2 - (4 * a * c))) / (2 * a))
prediction = 330 < x < 430 # Basket zone
如果球的 x 坐标落在 330 到 430 之间(我的“篮筐”范围),那就是一次成功的投篮!如果没有,它就错过了。
第 6 步:显示结果
我使用“cvzone.putTextRect()”在屏幕上实时显示预测。如果预测球会落入篮筐,则会出现绿色的“篮筐”消息;否则,会弹出一条红色的 “No Basket” 消息。
if prediction:
cvzone.putTextRect(imgContours, "Basket", (50, 150), scale=5, thickness=5, colorR=(0, 200, 0), offset=20)
else:
cvzone.putTextRect(imgContours, "No Basket", (50, 150), scale=5, thickness=5, colorR=(0, 0, 200), offset=20)
THE END !
文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。