树莓派 --- 基于OpenCV实现人脸识别
Posted 劳埃德·福杰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树莓派 --- 基于OpenCV实现人脸识别相关的知识,希望对你有一定的参考价值。
调百度人脸识别的API也能达到目的,我这里是基于OpenCV进行人脸识别
OpenCV(Open source Computer Vision Library) 是一个开源的计算机视觉库,支持与计算机视觉和机器学习相关的众多算法,用C++编写
1.安装OpenCV
安装慢就去换源树莓派系统的安装和远程访问_YINZHE__的博客-CSDN博客
看了网上很多教程,都太麻烦,还老是报各种错误,其实用下面一条指令就ok了
sudo apt-get install python3-opencv
测试是否安装成功(我用的是python3 )
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库中的几个函数
# 加载当前目录下的名为“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>'
# 检测到test.jpg中的人脸就打印信息
if match:
name = '张三'
print('I see someone named !'.format(name))
在当前目录下运行该脚本,脸对准摄像头
6.加快人脸识别
(1)一种思路:增加虚拟内存,在linux中就是增加swap空间
swap 其实就是把一块磁盘空间或者一个本地文件,当成内存来使用
它包括换出和换入两个过程
换出,就是把进程暂时不用的内存数据存储到磁盘中,并释放这些数据占用的内存
换入,则是在进程再次访问这些内存的时候,把它们从磁盘读到内存中来
① 起初我的实际内存 和虚拟内存如下:
② 修改/etc/dphys-swapfile文件中的CONF_SWAPSIZE
sudo vim /etc/dphys-swapfile
③ 重启树莓派
(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实现人脸识别的主要内容,如果未能解决你的问题,请参考以下文章
从3D打印到python编程 从opencv到人脸识别 从win10到树莓派ubuntu (全教程附代码)