Project(1)树莓派(raspberry pi)人脸识别计数+MJPG-streamer远程监控(上)

说在前面:本教程比较适合小白也足够详细,欢迎指正交流

目录

  • 总体思路
    • 1 树莓派基础配置
    • 2 树莓派Python3上OpenCV的安装
    • 3 MJPG-streamer的安装
      • 3.1 MJPG-streamer使用方法
    • 4 利用OpenCV实现人脸识别
      • 4.1 人脸识别代码
      • 4.2 在MJPG-streamer调用人脸识别代码
        • 4.2.1指令解析

总体思路

参照张子豪树莓派入门教程完成树莓派的基础配置,然后给树莓派安装在Python3环境下的OpenCV3.x.x的版本,接着从GitHub获取安装MJPG-streamer开源项目作为视频传输到web端的工具,并调用其提供的OpenCV接口来实现人脸识别加人数统计的功能,最后利用阿里云服务器和frp内网穿透工具实现外网访问内网的树莓派传输到web端的监控画面,完成远程监控。

关键字:树莓派3B+、OpenCV人脸识别、MJPG-streamer、frp内网穿透、阿里云服务器、远程监控

最终效果
Project(1)树莓派(raspberry pi)人脸识别计数+MJPG-streamer远程监控(上)_第1张图片


1 树莓派基础配置

这里不赘述,直接给教程地址和教程中未提及但可能遇到的问题和解决方案,有时间建议从第0讲看到第3讲,看不懂可以配合B站视频(链接在每一讲里都有),有树莓派和基础配件的、赶时间的直接看第2、3讲(没有远程登录需求的第3讲最后的 teamviwer可以不装

教程链接:
1、 GitHub子豪兄的零基础树莓派教程.

常见问题和解决
1、树莓派学习笔记(1):ssh登录和vnc远程登录常见问题.


2 树莓派Python3上OpenCV的安装

这个比较费时间,可能要装4、5个小时,而且可能遇到各种bug,细心一些
教程链接
1、 子豪兄教你在树莓派上安装OpenCV.

常见问题和解决
1、安装OpenCV时提示缺少boostdesc_bgm.i文件的问题解决方案(附带资源).
2、 还有一类问题是缺少某个文件,根据报错提示去打开相应文件修改为绝对路径,然后再执行之前未执行完的安装指令即可,大概要改四五次的样子,这个比较繁琐,也没找到好办法。

3 MJPG-streamer的安装

Mjpg-streamer是一个将树莓派采集的画面通过web网页方式呈现的视频流传输开源项目,延迟非常低,画面很流畅,提供多种可调入口参数,个人了解的是支持USB和树莓派官方摄像头,USB摄像头配置比后者简单,详细教程见下
教程链接
1、 树莓派上MJPG-streamer的安装过程.

3.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"

Project(1)树莓派(raspberry pi)人脸识别计数+MJPG-streamer远程监控(上)_第2张图片
启动成功后打开浏览器输入:

http://raspberry-ip-address:8080

raspberry-ip-address是树莓派的IP,例如我的是192.168.1.4,后文树莓派IP地址会经常用到,打开网站页面如下,点击左侧Stream可以正常看到画面就OK了
Project(1)树莓派(raspberry pi)人脸识别计数+MJPG-streamer远程监控(上)_第3张图片
扩展
1、页面右侧Static是静态画面,Stream是动态画面,Javascript可以查看运行时的信息(帧率、延时)
2、可以基于该页面架构改造,加上自己需要的功能,但我没深究过
3、个人觉得最方便的功能就是可以引用其画面源,在html页面需要显示图片的地方引用该源例如:
动态画面


静态画面



4 利用OpenCV实现人脸识别

4.1 人脸识别代码

文件名: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详见 官方文档.

4.2 在MJPG-streamer调用人脸识别代码

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"

4.2.1指令解析

这么长的指令,拆分开就好理解了,指令简单分为两部分输入输出

./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

你可能感兴趣的:(Project(1)树莓派(raspberry pi)人脸识别计数+MJPG-streamer远程监控(上))