(19) 树莓派发送微信人脸识别报警
教程 https://www.yahboom.com/build.html?id=1999&cid=257
项目地址 https://github.com/revotu/ItChat
xp3g
本项目的具体需求是:树莓派启动微信服务和OpenCV服务,OpenCV对摄像头实时视频监控,当检测到人脸后后拍照,将拍摄到的照片通过微信发送给用户的个人好友。
本项目中,对于微信的操作,我们需要用到的API是itchat。 itchat是一个微信对于python封装的api,它的功能非常强大,我们可以使用它和python对自己微信的很多信息进行爬取。

首先使用pip安装itchat:
Windows用户可以直接打开cmd输入:
pip install itchat
Mac用户由于没有对anaconda的python配置环境变量,需要先在终端输入:
curl https://bootstrap.pypa.io/get-pip.py | python3
树莓派版本无需下载pip,直接下载itchat输入:
pip install itchat
pip命令和pip3的区别是:pip3可以直接下载适合python3 使用的package。对于树莓派,我们可以根据spyder中python的版本使用pip2或pip3下载itchat:
pip2 install itchat
首先要进行的操作是:
import itchat
itchat.auto_login(hotReload=True)
这两句代码的作用是引入itchat后自动登录,itchat.auto_login()可以自动生成一个二维码,将hotReload设置为True的作用是微信支持本机的热登录,意思是:用户第一次启动程序并扫描二维码登录后,之后再次运行本程序的时候程序将不需要用户重复扫描二维码。
之后进行人脸检测,当检测到人脸后通过cv2.imwrite将当前帧保存到out.png中,当前itchat的版本已经不支持直接用itchat.send将消息或文件发送给自己的好友了,但是我们可以用:
itchat.send("@img@%s"%‘out.png‘,"filehelper")
将消息发送给“文件传输助手”,或者直接省略第二个参数将文件发送给自己。本问题的解决方法是利用
itchat.search_friends(name=‘friend1’)这个方法将放回一个昵称为friend1的好友的详细信息的类似json的数组。然后用.send将信息发出。
itchat.send(“@img@%s”%’out.png‘,account[0][‘UserName‘])
除此之外,为了避免同样的图片在短时间内被重复发送,对于本程序,我们在每次发送图片前后都设置时间戳,如果距离上一次发送图片的时间间隔小于10分钟,放弃发送图片。
运行效果,程序的源码位于/home/pi/yahboom/wechat_face/wachat_face.py将检测到的人脸视频留帧,发送给好友昵称为“senge”的用户,在图片上记录拍照时间:
progressive:上文程序中将照片发送给了“friend1”,微信又一个名为“文件传输助手”的应用,它的“昵称”为“filehelper”。请查阅资料,实现向“filehelper”发送照片
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
from __future__ import division
import cv2
import time
import sys
reload(sys)
sys.setdefaultencoding(‘utf8‘)
import os.path
import itchat
#自动登录,微信会自动生成二维码,可以在屏幕上弹出二维码
#设置hotreload为真,可以热启动,也就是说之后几次
itchat.auto_login(hotReload=True)
#摄像头操作
cap=cv2.VideoCapture(0)
cap.set(3,320)
cap.set(4,320)
face_cascade=cv2.CascadeClassifier(‘123.xml‘)
sendDate=0
while True:
#人脸识别的模块
ret,frame=cap.read()
gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
faces=face_cascade.detectMultiScale(gray)
max_face=0
value_x=0
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(frame,time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()),(20,20),font,0.8,(255,255,255),1)
#找到人脸后进行一系列操作
if len(faces)>0:
#设置时间戳
currentDate=time.time()
for (x,y,w,h) in faces:
cv2.rectangle(frame,(x,y),(x+h,y+w),(0,255,0),2)
result=(x,y,w,h)
x=result[0]
y=result[1]
if currentDate-sendDate>600:
#如果在10分钟内没有发送过图片,
#将当前帧写入独立png中
cv2.imwrite("out.png",frame)
#先通过search_friend爬去friend1的数据
#因为现在itchat不支持直接通过friend1发送消息
account=itchat.search_friends(name=‘senge‘)
print(account[0][‘UserName‘])
#发送
itchat.send("@img@%s"%‘out.png‘,account[0][‘UserName‘])
#记录时间
sendDate=time.time()
cv2.imshow("capture",frame)
if cv2.waitKey(1)==119:
break
cap.release()
cv2.destroyAllWindows()