背景知识视频教程
OpenCV使用Python进行计算机视觉的完整指南 - 国外课栈viadean.com使用OpenCV进行球跟踪
目标
- 使用计算机视觉技术检测色球的存在
- 在视频帧中四处移动时跟踪球,并在移动时绘制其先前位置。
让我们开始这个例子。打开一个新文件,将其命名为ball_tracking.py,我们将获得编码:
</>...
我们将使用双端队列(deque),这是一种具有超快附加和弹出功能的列表式数据结构,用于维护视频流中球过去N(x,y)个位置的列表。 保持这样的队列可以使我们在跟踪球时绘制球的“轨迹”。
第9-13行处理解析我们的命令行参数。 第一个开关--video是示例视频文件的(可选)路径。 如果提供了此开关,则OpenCV将获取指向视频文件的指针并从中读取帧。 否则,如果未提供此开关,则OpenCV将尝试访问我们的网络摄像头。
如果这是您第一次运行此脚本,我建议使用--video开关启动:这将向您演示Python脚本的功能,然后您可以根据自己的喜好修改脚本,视频文件和网络摄像头访问权限。
第二个可选参数--buffer是我们的双端队列的最大大小,它维护了我们正在跟踪的球的先前(x,y)坐标的列表。 此双端队列使我们能够绘制球的``轨迹'',详细说明其过去的位置。 较小的队列将导致较短的尾部,而较大的队列将导致较长的尾部(因为将跟踪更多的点):
图1:左侧的转换轨迹较短(buffer = 32),右侧的转换轨迹较长(buffer = 128)的示例。请注意,随着缓冲区大小的增加,转换轨迹的长度也会增加。
现在,我们的命令行参数已解析完毕,让我们看一些其他代码:
</>...
第17和18行定义了HSV颜色空间中绿色的上下边界(我使用imutils库中的range-detector脚本确定了该边界)。 这些颜色边界将使我们能够检测视频文件中的绿色球。 第19行然后使用提供的最大缓冲区大小(默认为64)初始化pt的双端队列。
我们需要获取对我们的vs指针的访问权限。 如果未提供--video开关,那么我们将获取对网络摄像头的引用(第22和23行)-我们使用imutils.video VideoStream线程类来提高效率。 否则,如果提供了视频文件路径,则我们将其打开以进行读取并在第25行和第26行上获取参考指针(使用内置的cv2.VideoCapture)。
</>...
第30行开始一个循环,直到(1)我们按q键表示我们要终止脚本或(2)我们的视频文件到达末尾并用完帧为止。
第32行调用了相机指针的read方法,该方法返回一个2元组。 元组中的第一个条目是抓取的布尔值,表示是否已成功读取框架。 框架是视频框架本身。 第34行处理VideoStream与VideoCapture的实现。
如果我们正在从视频文件中读取并且无法成功读取帧,那么我们知道我们已经在视频的末尾并且可以从while循环中跳出(第37和38行)。
图2:使用cv2.inRange函数为绿色球生成mask。
如我们所见,我们已成功检测到图像中的绿色球。一系列的腐蚀和膨胀(第48和49行)去除了可能留在mask上的任何小斑点。
好了,是时候计算绿色球的轮廓(即轮廓)并将其绘制在我们的框架上了:
</>...
我们首先在第52和53行上计算图像中对象的轮廓。在下一行中,使该函数与所有版本的OpenCV兼容。 我们还将在第58行将球的中心(x,y)坐标初始化为无。
第57行进行检查以确保在面罩中至少找到一个轮廓。 假设找到了至少一个轮廓,我们在第61行的cnts列表中找到最大轮廓,计算斑点的最小包围圆,然后计算中心的(x,y)坐标(即``质心'')63和64行。
第66行进行了快速检查,以确保最小包围圆的半径足够大。 假设半径通过测试,则我们绘制两个圆:一个围绕球本身,另一个围绕球的质心。第73行将质心附加到pts列表中。
最后一步是绘制球的轨迹,或者只是绘制检测到球的过去N(x,y)坐标。这也是一个简单的过程:
</>...
我们开始在第75行上遍历每个pt。如果当前点或上一个点为None(表明在该给定帧中未成功检测到球),则忽略当前索引继续遍历pts( 78和79行)。
假设两个点均有效,我们将计算轨迹的厚度,然后将其绘制在框架上(82和83行)。
我们的ball_tracking.py脚本的其余部分只是简单地执行一些基本的整理工作,方法是将边框显示在屏幕上,检测任何按键,然后释放vs指针。
现在我们的脚本已被编码,让我们尝试一下。打开一个终端并执行以下命令:
$ python ball_tracking.py --video ball_tracking_example.mp4
该命令将使用提供的ball_tracking_example.mp4演示视频启动脚本。在下面,您可以找到一些使用OpenCV成功检测和跟踪球的动画GIF:
最后,如果要使用网络摄像头而不是提供的视频文件执行脚本,只需省略--video开关即可:
$ python ball_tracking.py
但是,要查看任何结果,您将需要一个绿色物体,该绿色物体具有与本演示中使用的HSV颜色范围相同的颜色。