哇,上周那篇关于做一个基本运动检测系统的文章真是赞。写这篇文章很有乐趣,而且从像您一样的读者那里获得反馈,使我的努力变得很值得。
对于那些刚看到这篇文章的朋友,上周那篇文章是关于使用计算机视觉来建立一个运动检测系统,其动机是因为我的朋友James,他罪恶的双手伸进了我的冰箱,偷走了我最后一罐令人垂涎的啤酒。因为我不能证明是他干的,所以我想看看我是不是能够利用计算机视觉和树莓派,当他再次尝试偷走我的啤酒的时候当场抓获他。
您将在本文的最后看到,我们要建造的家用监控和运动检测系统不仅炫酷又简约,而且针对我们这个特定的目标还非常的强大。
今天我们将要扩展我们的基础运动检测方法,并且:
让我们的运动检测系统变得健壮一些,这样它就可以连续工作一整天,不那么容易受光线变化所影响。
更新我们的代码,让我们的家用监控系统可以在树莓派上运行。
集成 Dropbox API,使得 Python 脚本可以自动把安保图片上传到我们的 Dropbox 账户中。在本文中,我们会看到很多代码,请做好准备。但是我们也会学到很多东西。更重要的是,在本文的最后,你将拥有一个你自己的,可以运行的树莓派家用监控系统。
你可以在下面找到全部的示例视频以及一些其他的例子。
OpenCV and Python 版本为了运行这个例子,你需要Python 2.7和OpenCV 2.4.X.
在开始前,你需要:
动起来,让我们把必要的东西都搞定。我会假设你已经有了一个树莓派和camera board(摄像头模块)。
最后,如果你想要上传你的家庭安保图片到个人 Dropbo x账户中,你需要到Dropbox Core API注册并获取你的公有和私有API keys,但接入Dropbox API 并不是本教程所必需的,只是一个锦上添花的东西。
除此之外,我们需要用pip-install安装一个额外的包。
如果你没有安装我的imutils包,你需要从 GitHub 获取或者通过pip install imutils安装
并且如果你有兴趣让你的家用监控系统上传安保图片到 Dropbox,你需要dropbox包:pip install dropbox
至此所有的东西都已经安装并且正确配置,我们可以继续前进使用 Python 和 OpenCV 来打造我们的家用监控及运动检测系统了。
这里是我们的安装过程:
我在上篇文章提到过,我们家用监控系统的目标是抓住任何尝试溜进我的冰箱并且偷走我的啤酒的人。
为了实现这一目标,我在我的橱柜上安装了树莓派+摄像头:
图1:在橱柜顶部安装的树莓派
这个系统会俯视冰箱和我公寓的正门:
图2:树莓派对准我的冰箱。如果有人尝试偷啤酒的话,运动检测代码就会被触发,上传图片到我的Dropbox中。
如果有人尝试打开冰箱门并取走我的一罐啤酒,运动检测代码会生效,上传当前帧的截图到Dropbox,可以抓他个人赃并获。
DIY:使用树莓派 + Python + OpenCV 打造家用监控及运动检测系统
好啦,让我们开始建造我们的树莓派家用监控系统吧。首先让我们看一下这个工程的目录结构:
Python
|---pi_surveillance.py
|---conf.json
|---pyimagesearch
||---__init__.py
||---tempimage.py
我们家用监控系统的主要代码和逻辑会存放在pi_surveillance.py中。我们使用一个JSON配置文件conf.json来代替使用命令行参数或是在pi_surveillance.py中对参数进行硬编码。
针对这样一个工程,我发现放弃使用命令行参数并依赖一个JSON配置文件是很有用的。有时候你有太多的命令行参数,这时利用一个JSON文件会使其变得容易和更加整洁。
最后,为了更好的组织,我们会定义一个pyimagesearch包,里面包含一个单一的类TempImage,我们会在上传到Dropbox之前使用它临时将图片写入硬盘。
记住我们项目的目录结构,打开一个新的文件,命名为pi_surveillance.py,并且开始导入如下的包:
Python
# 导入必须的包
frompyimagesearch.tempimageimportTempImage
fromdropbox.clientimportDropboxOAuth2FlowNoRedirect
fromdropbox.clientimportDropboxClient
frompicamera.arrayimportPiRGBArray
frompicameraimportPiCamera
i