opencv读取usb摄像头_OpenCV处理视频

背景知识视频教程

OpenCV使用Python进行计算机视觉的完整指南 - 国外课栈​viadean.com
v2-6c3c83cba1317d0dbae9eef938041dc7_180x120.jpg
适用于数据科学的Python完整视频课程 - 国外课栈​viadean.com
v2-f1b8ae7bbf4fc61463d3aa71b97224b4_ipico.jpg
使用OpenCV和Python Shells的视频分析​viadean.com
v2-bca77d14c1f006e4a022e0a75ba5a43d_180x120.jpg

使用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颜色范围相同的颜色。

写入视频

保存关键事件视频片段

实时全景图和图像拼接

将picamera和cv2.videocapture统一为一个类

跟踪物体移动

源代码

OpenCV处理视频 - 国外课栈​viadean.com
v2-57205769fab79ea8044478517e16e1d5_ipico.jpg
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值