学习了pyimagesearch 的《PyImageSearch Gurus course》。现在记录下代码的分析。
在运动检测中,做出如下的假设: 我们视频流中的背景在连续的视频帧内,多数时候应该是静止不变的,因此如果我们可以建立背景模型,我们的就可以监视到显著的变化。如果发生了显著的变化,我们就可以检测到它——通常这些变化和我们视频中的运动有关。 代码放在github Python 2-6行导入了我们必要的软件包。这些看上去都很熟悉,除了 下一步,我们在9-12行解析了命令行参数。我们定义了两个选项。第一个, 我们同时还定义了 15-21行获取一个我们摄像机对象的引用。在这个例子中,没有提供视频路径(15-17行),我们会取得一个摄像头的引用。如果提供了一个视频文件路径,那么我们会在20-21行建立一个指向它的指针。 最后,我们以一个变量来结束这段代码,这个变量是 假设:视频的第一帧不会包含运动,而仅仅是背景——因此我们可以使用第一帧来建立背景模型。 显然我们此处建立的假设有些太大了。但是再说一次,我们的目标是要在树莓派上运行这个系统,所以我们不能做的太复杂。正如你会在本文的结果一节所看到的那样,当有人在屋里走动的时候,我们可以轻易的检测到运动并追踪他们。 现在我们已经获取了视频文件/摄像头数据流的引用,我们可以在第一行(原文第27行)开始遍历每一帧了。 调用 我们同时还定义了一个叫做 在这个例子中,如果没有成功从视频文件中读取一帧,我们会在10-11行(原文35-36行)跳出循环。 我们可以开始处理帧数据并准备进行运动分析(15-17行)。我们首先会调整它的大小到500像素宽——没有必要去直接处理视频流中的大尺寸,原始图像。我们同样会把图片转换为灰阶图像,因为彩色数据对我们的运动检测算法没有影响。最后,我们会使用高斯模糊来平滑我们的图像。 认识到即使是相邻帧,也不是完全相同的这一点很重要! 由于数码相机传感器的微小变化,没有100%相同的两帧数据——一些像素肯定会有不同的强度值。也就是说,我们需要,并应用高斯平滑对一个11X11的区域的像素强度进行平均。这能帮我们滤除可能使我们运动检测算法失效的高频噪音。 正如我在上面提到的,我们需要通过某种方式对我们的图像进行背景建模。再一次的,我们会假设视频的第一帧不包含任何运动,它是一个很好的例子,表明我们的背景是如何的。如果 这里有一个关于示例视频第一帧的例子: 上面这一帧满足我们的假设,视频的第一帧仅仅是一个静止的背景——没有运动。 有了这个静止的背景图片,我们已经准备好实时运动检测和追踪了: 现在我们已经从 计算两帧的不同是一个简单的减法,我们使用两方相应的像素强度差的绝对值。(第二行) delta = |background_model – current_frame| 两帧差值图例如下:
再一次,注意到图片的背景是黑色的,而前景(运动发生的位置)是白色的。 有了这个阀值化的图片,只要简单的进行实施轮廓检测来找到白色区域的外轮廓线(第7行) 我们在第14行开始对轮廓线进行遍历,在15行滤掉小的,不相关的轮廓。 如果轮廓面积比我们提供的 11-13行显示了我的工作成果,运行我们可以在视频中看到是否检测到了运动,使用帧差值和阀值图像我们可以调试我们的脚本。 注意:如果你下载了本文的源代码并打算应用到你自己的视频文件上,你可能需要改变 最后,22行和23行清理并释放了视频流的指针。 结果显然,我要确定我们的运动监测系统可以在James那个偷酒贼再次造访的之前能够正常工作——我们将在本系列第二篇文章中谈到他。为了测试我们使用Python和OpenCV搭建的运动监测系统,我录制了两个视频文件。 第一个文件是 让我们给我们简单的探测器一次尝试的机会,打开终端并执行下面指令: python motion_detector.py —video videos/example_01.mp4 下图是一个 gif 图,显示来自探测器的一些静止帧数据。 注意到在门被打开前没有进行运动检测——然后我们可以检测到我自己从门中走过。你可以在这里看到全部视频: http://www./embed/fi4LORwk8Fc?feature=oembed 现在,我安装在用于监视厨房和客厅的摄像机表现如何呢?然我们一探究竟。输入下面命令: python motion_detector.py —video videos/example_02.mp4 同样,这里是我们运动检测结果的完整视频: http://www./embed/36j238XtcIE?feature=oembed 正如你看到的,我们的运动检测系统尽管非常简单,但表现还不错!我们可以正常检测到我进入客厅和离开房间。 然而,现实来讲,结果还远远谈不上完美。尽管只有一个人在屋内走动,我们却得到了多个外框——这和理想状态相差甚远。而且我可以看到,微小的光线变化,比如阴影和墙面反射,都触发了假阳性的运动检测结果。 最后,如果你想要利用你的摄像头的原始视频流来进行运动检测,空着 python 1.py 原创文章,转载请注明: 转载自URl-team 本文链接地址: 学习—用 Python 和 OpenCV 检测和跟踪运动对象 |
|