(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()