说在前面:本教程比较适合小白也足够详细,欢迎指正交流
参照张子豪树莓派入门教程完成树莓派的基础配置,然后给树莓派安装在Python3环境下的OpenCV3.x.x的版本,接着从GitHub获取安装MJPG-streamer开源项目作为视频传输到web端的工具,并调用其提供的OpenCV接口来实现人脸识别加人数统计的功能,最后利用阿里云服务器和frp内网穿透工具实现外网访问内网的树莓派传输到web端的监控画面,完成远程监控。
关键字:树莓派3B+、OpenCV人脸识别、MJPG-streamer、frp内网穿透、阿里云服务器、远程监控
这里不赘述,直接给教程地址和教程中未提及但可能遇到的问题和解决方案,有时间建议从第0讲看到第3讲,看不懂可以配合B站视频(链接在每一讲里都有),有树莓派和基础配件的、赶时间的直接看第2、3讲(没有远程登录需求的第3讲最后的 teamviwer可以不装)
教程链接:
1、 GitHub子豪兄的零基础树莓派教程.
常见问题和解决:
1、树莓派学习笔记(1):ssh登录和vnc远程登录常见问题.
这个比较费时间,可能要装4、5个小时,而且可能遇到各种bug,细心一些
教程链接:
1、 子豪兄教你在树莓派上安装OpenCV.
常见问题和解决:
1、安装OpenCV时提示缺少boostdesc_bgm.i文件的问题解决方案(附带资源).
2、 还有一类问题是缺少某个文件,根据报错提示去打开相应文件修改为绝对路径,然后再执行之前未执行完的安装指令即可,大概要改四五次的样子,这个比较繁琐,也没找到好办法。
Mjpg-streamer是一个将树莓派采集的画面通过web网页方式呈现的视频流传输开源项目,延迟非常低,画面很流畅,提供多种可调入口参数,个人了解的是支持USB和树莓派官方摄像头,USB摄像头配置比后者简单,详细教程见下
教程链接:
1、 树莓派上MJPG-streamer的安装过程.
打开命令行窗口依次执行:
1、这条命令是每一次都要先执行然后才可以打开摄像头,不妨把它设为开机启动执行
sudo modprobe bcm2835-v4l2
2、需要进入到 Mjpg-streamer的安装环境下启动指令才能奏效
cd mjpg-streamer/mjpg-streamer-experimental
3、普通USB摄像头开启指令
./mjpg_streamer -i "./input_uvc.so" -o "./output_http.so -w ./www"
http://raspberry-ip-address:8080
raspberry-ip-address是树莓派的IP,例如我的是192.168.1.4,后文树莓派IP地址会经常用到,打开网站页面如下,点击左侧Stream可以正常看到画面就OK了
扩展:
1、页面右侧Static是静态画面,Stream是动态画面,Javascript可以查看运行时的信息(帧率、延时)
2、可以基于该页面架构改造,加上自己需要的功能,但我没深究过
3、个人觉得最方便的功能就是可以引用其画面源,在html页面需要显示图片的地方引用该源例如:
动态画面
静态画面
文件名:filter.py
# filter.py
import cv2
import numpy as np
class MyFilter:
def process(self, img):
'''
:param img: A numpy array representing the input image
:returns: A numpy array to send to the mjpg-streamer output plugin
'''
# 图像转化为灰度格式
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 导入人脸级联分类器引擎,'xml'文件包含训练好的人脸特征,为防止报错使用该文件在opencv下的绝对路径
face_cascade=cv2.CascadeClassifier('/home/pi/Downloads/opencv-3.4.0/data/haarcascades/haarcascade_frontalface_default.xml')
# 用人脸级联分类器引擎进行人脸识别,返回的faces为人脸坐标列表
faces = face_cascade.detectMultiScale(gray)
count = 0 #人脸计数初值
# 对每张脸,操作如下
for (x,y,w,h) in faces:
'''画矩形圈出人脸
输入参数依次为:图片,右上角的点坐标,矩形大小,线条颜色,宽度
'''
cv2.rectangle(img,(x,y),(x+w,y+h),(255,255,255),2)
count += 1 # 累计人数
# 把统计人数显示出来
cv2.putText(img,'{}'.format(count),(x,y-7),3,1.2,(0,0,255),2)
return img
def init_filter():
'''
This function is called after the filter module is imported. It MUST
return a callable object (such as a function or bound method).
'''
f = MyFilter()
return f.process
该程序框架是MJPG-streamer提供的OpenCV调用的示例程序,在def process(self, img):下提供自己想要做的图像处理的程序即可,不用执行,使用方法见4.2详见 官方文档.
MJPG-streamer的功能非常丰富,但一定要按照其给出的使用方法来执行相关指令,否则是没办法正常启动的,执行步骤见3.1 MJPG-streamer使用方法,把第3条指令改成如下指令(注:Ctrl+c可以终止正在执行的命令)
./mjpg_streamer -i "./input_opencv.so -filter cvfilter_py.so -fargs /home/pi/face_detect_orgin/face_detect_orgin/filter.py -r 320x240" -o "./output_http.so -w ./www"
这么长的指令,拆分开就好理解了,指令简单分为两部分输入和输出
./mjpg_streamer
-i "./input_opencv.so -filter cvfilter_py.so -fargs /home/pi/face_detect_orgin/face_detect_orgin/filter.py -r 320x240"
-o "./output_http.so -w ./www"
1、输入
-i开头的第二行被拆分如下
-i "./input_opencv.so -filter cvfilter_py.so -fargs /home/pi/face_detect_orgin/face_detect_orgin/filter.py
这是调用4.1中的人脸识别程序,文档里给的演示(其实它给的演示格式好像有问题,调整成上面的示例才能用),-fargs表示4.1中的程序所在的绝对路径,根据情况自己调整,注意参数间的空格
-r 320x240"
这表示调整画面的分辨率,相较于不对图像作处理,调用人脸识别程序后,画面会卡得多,这时可以调小分辨率,还有其他可调参数详见 官方文档.
2、输出
输出指令没有特殊需求一般就是这样
-o "./output_http.so -w ./www"
成功后打开浏览器输入一下内容就能看见效果了:
http://raspberry-ip-address:8080