TA的每日心情 | 开心 2018-9-6 15:08 |
---|
签到天数: 11 天 连续签到: 1 天 [LV.3]偶尔看看II
|
本帖最后由 ky123 于 2018-1-31 14:03 编辑
感谢E络盟提供的助赛基金。
安防技能实际上是指家里无人后,通过摄像头监测到异常后实时通知主人!实现这个功能的方法有很多,例如比较热门的运动侦测,当对比两帧不同的图片,当数据差异较大时判断为异常闯入,该方法很高大上,但难度很大,当环境光发生变化时会误判断,需要算法滤波处理!最重要的是对处理器要求很高,用树莓派实现时还需要修改swap缓存,同时占用资源过大,不仅占用CPU,实时拍摄占用硬盘空间,最后功耗也比较大!不太适合本项目中的小车这种电池供电的产品!
因此,采用比较廉价也比较简单的人体热释电(PIR)+摄像头拍照的方案!本方案的思路是PIR检测到发热体(不受环境光变化影响)产生脉冲信号,树莓派检测到信号后启动摄像头拍照,并实时推送给主人,是不是很easy!如果主人比较关心家庭情况,也可web远程视频查看具体情况!(由于未申请到花生壳路由器暂支持),暂用微信消息控制拍照替代,本项目中的图片会不断被替换刷新,不会占据过大硬盘空间。
- 信号检测:RPi.GPIO
- 拍照:uvccapture,
- 图片推送:python版微信wxpy
- 编程语音:python2.7
硬件部分:
本设计中选用BOARD中的引脚8,即BCM编码中引脚14,作为PIR脉冲信号的检测口;
软件部分的程序分两大部分:拍照和推送;
首先讲推送部分
1.1 安装wxpy
项目使用的python 是3.5版本的,因此语法会和2.x版本有所区别,wxpy 支持python3.4-3.6 以及python2.7版本
在这里默认大家以及安装好了pip,我们需要安装wxpy 以及wechat_sender 两个包;- sudo pip install wxpy -i "https://pypi.doubanio.com/simple/"
- sudo pip install wechat_sender -i "https://pypi.doubanio.com/simple/"
复制代码 以上安装过程中可能会报错,- error: command 'arm-linux-gnueabihf-gcc' failed with exit status 1
复制代码
该问题的含义是指,gcc未找到<Python.h>头文件,所以需要通过依赖安装来安装该支持库。
然后是按照python应用开发包,已安装的可以跳过!
python2.x:- sudo apt-get install python-dev
- sudo apt-get install libevent-dev
复制代码 1.2 wxpy 登陆
wxpy 使用起来非常简单,我们只需要创建一个bot 对象,程序运行后,会弹出二维码,扫描二维码后显示登陆成功。
桌面版的树莓派可以通过显示器或者远程界面,查看二维码图片并扫描登录!
有些情况下,可能不能通过终端打开图片(例如部署在服务器上时),我们可以通过参数选择在终端内显示二维码,这样代码会变为:- from wxpy import *
- bot = Bot(console_qr=True)
复制代码
如果你认为每次都需要扫描二维码很麻烦,可以启用缓存,来保存自己的登录状态:- bot = Bot(console_qr=True, cache_path=True)
复制代码 该缓存设置可以在一段时间内避免重复扫码登录,但当超时是还需再扫描二维码重新登录~
重头戏来了!首先实现微信发消息触发摄像头拍照并发送照片,关于自动处理信息的更多内容参考请见这里- # -*- coding: utf-8 -*-
- # 这样也行
- # coding:utf-8
- from wxpy import *
- import picamera
- import RPi.GPIO as GPIO
- import sys
- import time
- # import pigpio
- # pi = pigpio.pi()
- # for BCD.GPIO
- # PIR_GPIO = 0
- # pi.set_mode(PIR_GPIO, pigpio.INPUT)
- #初始化GPIO
- GPIO.setmode(GPIO.BOARD)
- PIR_GPIO = 8
- GPIO.setup(PIR_GPIO,GPIO.IN)
- #初始化微信机器人,扫码登录
- bot = Bot(console_qr=True,cache_path=True)
- # 获取所有好友
- friends = bot.friends()
- # 遍历输出好友名称
- for friend in friends:
- print(friend)
- my_friend = bot.friends().search('smilecat')[0]
- #初始化图灵机器人
- tuling = Tuling(api_key='b48696865a5346e79dcd466355ebabbd')
- # 自动回复my_friend所有文字消息
- @bot.register(my_friend,msg_types=TEXT)
- def pir_send_image():
- if GPIO.input(PIR_GPIO) == True:
- my_friend.send_image('image.jpg')
- print('send image')
- time.sleep(5)
- while True:
- pir_send_image()
- time.sleep(5)
- # 开始运行
- bot.join()
复制代码 以上程序依次实现了微信的登录(微信号A)、查找好友smilecat(这个是我的微信大号),当收到信号时将照片发给这个微信号smilecat!(本项目需要两个微信账号)图灵机器人是一个聊天小机器人,本项目中用来检测文本信息然后实现远程控制摄像头功能,也附带福利闲聊功能!其api_key可以在图灵官网注册!
然后讲拍照部分
安装uvccapture:- sudo apt-get install uvccapture
复制代码 开始拍照:- uvccapture -B120 -C100 -S100 -x640 -y480 -m -o/home/pi/car/wechar/image.jpg
复制代码 uvccapture携带的参数较多,其中,“-x,-y”为图像分辨率,“-B”为亮度(Brightness),"-C"为对比度(Contrast),“-S”为饱和度(Saturation),"-o"输出图像文件路径,"image.jpg"为保存的照片文件名,默认保存在"/home/pi"目录下,注意要与推送的图片同路径和同名称。
当水平图像分辨率(x)超过960像素时,当垂直图像分辨率(y)超过720像素时,还需要使用YUYV方式进行拍照,此时相比于上述方式,除了需要修改像素参数意外,还要额外增加一个参数“-m”。
像素标准2:1280*720
最后将拍照和推送融合
拍照是终端指令,而推送是python程序,直接在python中添加执行/home/pi/car/wechar/camera.sh会报语法错误!通过以下方式将两者融合!
首先将以上指令封装在shell脚本中camera.sh;- #!/bin/bash
- #利用echo输出一些提示语句
- uvccapture -B120 -C100 -S100 -x640 -y480 -m -o/home/pi/car/wechar/image.jpg
- echo 拍照中.....
复制代码 然后将将脚本用os.system调用!(执行的命令,相当于在Windows的cmd窗口中输入的命令)最终的程序如下:- # -*- coding: utf-8 -*-
- # 这样也行
- # coding:utf-8
- #引入shell指令
- import os
- import commands
- from wxpy import *
- # import picamera
- import RPi.GPIO as GPIO
- import sys
- import time
- # import pigpio
- # pi = pigpio.pi()
- # for BCD.GPIO
- # PIR_GPIO = 0
- # pi.set_mode(PIR_GPIO, pigpio.INPUT)
- #初始化GPIO
- GPIO.setmode(GPIO.BOARD)
- PIR_GPIO = 8
- GPIO.setup(PIR_GPIO,GPIO.IN)
- #初始化微信机器人,扫码登录
- bot = Bot(console_qr=True,cache_path=True)
- # 获取所有好友
- friends = bot.friends()
- # 遍历输出好友名称
- for friend in friends:
- print(friend)
- my_friend = bot.friends().search('smilecat')[0]
- #初始化图灵机器人
- tuling = Tuling(api_key='b48696865a5346e79dcd466355ebabbd')
- # 自动回复my_friend所有文字消息
- @bot.register(my_friend,msg_types=TEXT)
- def pir_send_image():
- if GPIO.input(PIR_GPIO) == True:
- os.system('/home/pi/car/wechar/camera.sh')
- my_friend.send_image('image.jpg')
- print('send image')
- time.sleep(5)
- while True:
- pir_send_image()
- time.sleep(5)
- # 开始运行
- bot.join()
复制代码 |
|