2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 树莓派 --- 基于OpenCV实现人脸识别

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

时间:2022-01-08 15:50:41

相关推荐

树莓派 --- 基于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(/)的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类型的数据imageimage = face_recognition.load_image_file("my_picture.jpg")# 对image进行分析,得到照片中脸的位置信息,因为能获取多张脸的位置,所以返回一个listface_locations = face_recognition.face_locations(image)# 输入image,face_locations,得到脸的特征值face_encodings,能同时获取多张脸的特征值,所以返回类型为listface_encodings = face_recognition.face_encodings(image, face_locations)# 比较encoding1与encoding2两个特征值,匹配返回True,否则返回False# tolerance越低,顾名思义,容错率越低matches = pare_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-8import face_recognition as frimport cv2# 创建视频对象,参数为0就打开索引号为0的摄像头,参数为视频路径就打开视频video_capture = cv2.VideoCapture(0)# 加载当前路径下面的test.jpgprint('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 = pare_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"

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。