树莓派 — 基于OpenCV实现人脸识别

目录

参考博客

调百度人脸识别的API也能达到目的,我这里是基于 OpenCV 进行人脸识别

OpenCV(Open source Computer Vision Library) 是一个开源的计算机视觉库,支持与计算机视觉和机器学习相关的众多算法,用C++编写

1.安装OpenCV

安装慢就去换源树莓派系统的安装和远程访问_YINZHE__的博客-CSDN博客

看了网上很多教程,都太麻烦,还老是报各种错误,其实用下面一条指令就ok了

sudo apt-get install python3-opencv

测试是否安装成功(我用的是python3 )

树莓派 --- 基于OpenCV实现人脸识别

2.安装一些第三方库

apt-get 主要是自动从互联网软件仓库中搜索、安装、升级卸载软件或操作系统
pip 用来安装来自PyPI(https://www.python.org/)的python所有的依赖包

pip3 install numpy==1.21.4          # NumPy是一个开源的Python科学计算基础库
sudo pip3 install dlib              # dlib是一个包含机器学习算法的C++开源工具包
sudo pip3 install face_recognition  # face_recognition是一个基于python的人脸识别库

3.介绍face_recognition库中的几个函数

face-recognition库的API文档

加载当前目录下的名为“test.jpg”的图片,得到ndarray类型的数据image
image = face_recognition.load_image_file("my_picture.jpg")
对image进行分析,得到照片中脸的位置信息,因为能获取多张脸的位置,所以返回一个list
face_locations = face_recognition.face_locations(image)
输入image,face_locations,得到脸的特征值face_encodings,能同时获取多张脸的特征值,所以返回类型为list
face_encodings = face_recognition.face_encodings(image, face_locations)
比较encoding1与encoding2两个特征值,匹配返回True,否则返回False
tolerance越低,顾名思义,容错率越低
matches = face_recognition.compare_faces(encoding1, encoding2, tolerance=0.38)

4.打开摄像头

我用的是官方的CSI摄像头,确保你的摄像头是开启的

sudo raspi-config

依次选择 “Interfacing Options” -> ” Camera”,确定后重启树莓派。

vcgencmd get_camera  # 检查摄像头运行情况

5.人脸识别测试

首先用摄像头抓拍一张你的帅照,命名为test.jpg,放在当前目录下

raspistill -v -o test.jpg  # 不同摄像头用的指令不同,默认等待5秒再拍摄

faceRecognition.py

coding = utf-8
import face_recognition as fr
import cv2

创建视频对象,参数为0就打开索引号为0的摄像头,参数为视频路径就打开视频
video_capture = cv2.VideoCapture(0)
加载当前路径下面的test.jpg
print('loading...')
image = fr.load_image_file('test.jpg')
test.jpg只有一张人脸,拿到该人脸的特征值
myFace_encoding = fr.face_encodings(image)[0]

while True:
    print('Capturing image...')
    # 摄像头抓取一帧照片
    # ret是布尔值,读取帧成功返回True,文件读到结尾,返回False(如果你读取的是视频,而不是在线拍摄)
    # frame就是每一帧的图像,一个三维矩阵
    ret, frame = video_capture.read()
    # 缩小图片,加快处理速度,fx,fy表示x,y轴方向的缩小系数
    frame = cv2.resize(frame, (0,0), fx=0.25, fy=0.25)
    # 将cv2用的BGR颜色转换为face_recognition用的RGB颜色
    rgb_frame = frame[:, :, ::-1]
    # 获取这一帧里所有人脸的位置和特征值
    face_locations = fr.face_locations(rgb_frame)
    # 计算这一帧中出现的人脸数量
    print('Found {} faces in image.'.format(len(face_locations)))
    face_encodings = fr.face_encodings(rgb_frame, face_locations)
    # 对获取的每张脸进行循环,判断是否和test.jpg中的人脸匹配
    for face_encoding in face_encodings:
        match = fr.compare_faces([myFace_encoding], face_encoding)
        name = '<unknown person>'
        # &#x68C0;&#x6D4B;&#x5230;test.jpg&#x4E2D;&#x7684;&#x4EBA;&#x8138;&#x5C31;&#x6253;&#x5370;&#x4FE1;&#x606F;
        if match:
            name = '&#x5F20;&#x4E09;'
        print('I see someone named {}!'.format(name))</unknown>

在当前目录下运行该脚本,脸对准摄像头

树莓派 --- 基于OpenCV实现人脸识别

6.加快人脸识别

(1)一种思路:增加虚拟内存,在linux中就是增加swap空间

swap 其实就是把一块磁盘空间或者一个本地文件,当成内存来使用
它包括换出和换入两个过程
换出,就是把进程暂时不用的内存数据存储到磁盘中,并释放这些数据占用的内存
换入,则是在进程再次访问这些内存的时候,把它们从磁盘读到内存中来

① 起初我的实际内存 和虚拟内存如下:

树莓派 --- 基于OpenCV实现人脸识别

② 修改/etc/dphys-swapfile文件中的CONF_SWAPSIZE

sudo vim /etc/dphys-swapfile

树莓派 --- 基于OpenCV实现人脸识别

③ 重启树莓派

(2) 另一种思路:我的树莓派是3B+,CPU有四个核,多核并行运算

(3) 适当降低图片分辨率

抓拍test.jpg的时候,可以指定图片分辨率,我这里指定为 640 x 480(默认拍的图片分辨率太高了)

raspistill -v -w 640 -h 480 -o test.jpg

(4) 释放内存

sudo bash -c "echo 3 > /proc/sys/vm/drop_caches"

树莓派 --- 基于OpenCV实现人脸识别

Original: https://blog.csdn.net/YINZHE__/article/details/121766669
Author: 劳埃德·福杰
Title: 树莓派 — 基于OpenCV实现人脸识别

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/704612/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球