在树莓派上用python实现人脸识别(face_recognition,PIL,opencv)

小白一路按照领导的要求自己摸索的,若有不对之处,还望各位大佬指正。

一. 环境准备

1.python版本

树莓派4b自带的python版本是2.7的,所以需要我们把这个默认的版本设置改一下,以下的方法借鉴了博客
改变python版本
但是我操作了之后发现需要在命令行键入python3才能进行后续操作,python这个命令就失效了。不过这不会影响太多。

2.环境配置

人脸识别基于face_recognition模块,安装这个模块之前需要以下准备。

(1)安装dlib

这是个大坑,我安装了两三天才搞定……大家一定要有耐心2333

a.把dlib安装包下载到树莓派上

【链接】:http://dlib.net/
默认下载位置都是/home/pi/Downloads

b.安装dlib需要用到的库

首先我们要扩大树莓派的缓存

sudo nano /etc/dphys-swapfile

看到CONF_SWAPSIZE=100
根据下方提示
摁住“CTRL+\”把”CONF_SWAPSIZE=100
替换为“CONF_SWAPSIZE=1024"
然后保存。
然后我们输入free -m
就可以看到
在这里插入图片描述
swap后面已经变为1023.

sudo apt-get update
sudo apt-get install build-essential cmake libgtk-3-dev libboost-all-dev -y

之后:

pip3 install numpy
pip3 install scipy
pip3 install scikit-image

上述的安装顺序不能调换!
然后

sudo pip3 install dlib==19.21

上述这些语句我尝试了好几次才成功,也不知道为什么,所以第一次失败后可以再多尝试几次……

3.安装face_recognition

dlib安装成功后,可以直接安装face_recognition

sudo pip3 install face_recognition

然后可以验证一下
在这里插入图片描述
安装成功。

4.安装opencv

最开始我是直接在命令行克隆源码,想克隆源码的可以按照下面链接里的方法尝试。
https://blog.csdn.net/weixin_39760857/article/details/110432603?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161232285016780261990024%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=161232285016780261990024&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-1-110432603.pc_search_result_cache&utm_term=%E6%A0%91%E8%8E%93%E6%B4%BE%E4%B8%8B%E4%B8%BApython3%E5%AE%89%E8%A3%85opencv&spm=1018.2226.3001.4187
但是文件太大,速度太慢,失败了好几次,所以换了另一种方法。
首先我们需要配置opencv的环境

sudo raspi-config   #进入后打开摄像头、SSH
sudo apt-get update
sudo apt-get upgrade
sudo rpi-update    #这一步我出现了报错,但好像没什么影响
sudo apt-get install build-essential cmake git pkg-config #安装opencv相关工具
sudo apt-get install libjpeg8-dev #安装相关图像工具包
sudo apt-get install libtiff5-dev 
sudo apt-get install libjasper-dev 
sudo apt-get install libpng12-dev 
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev  #安装视频I/O包
sudo apt-get install libgtk2.0-dev  #安装gtk2.0和优化函数包
sudo apt-get install libatlas-base-dev gfortran

在树莓派上下载opencv和opencv_contrib安装包
感谢这位大佬提供的渠道
【链接】:https://www.bzblog.online/wordpress/index.php/2020/03/09/opencvdownload/
下载成功后进行解压
具体操作见下方链接
https://blog.csdn.net/Yumeon/article/details/113624604
解压后进行编译,我参考的是下方链接
https://blog.csdn.net/kyokozan/article/details/79192646?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161239879316780264062504%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=161239879316780264062504&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-1-79192646.pc_search_result_cache&utm_term=%E6%A0%91%E8%8E%93%E6%B4%BE%E5%AE%89%E8%A3%85opencv&spm=1018.2226.3001.4187

之后依然可以验证一下,还可以查看版本。
在这里插入图片描述
在这里插入图片描述

安装成功。

5.安装PIL模块

sudo pip3 install pillow

依然老方法验证
在这里插入图片描述

二.代码

1.判断两个人是否为同一个人

import face_recognition
from PIL import Image,ImageDraw

known_image=face_recognition.load_image_file("1.JPG")
unknown_image=face_recognition.load_image_file("u2.JPG")

biden_encoding = face_recognition.face_encodings(known_image)[0]
unknown_encoding = face_recognition.face_encodings(unknown_image)[0]

print(biden_encoding)
print(unknown_encoding)

results = face_recognition.compare_faces([biden_encoding], unknown_encoding)
if results[0] == True:
    print ("Yes!")
else:
    print ("No!")

注意:需要将图片与本段代码放到一个文件夹里!

2.图片灰度化

灰度化具体算法是什么我也不太懂,反正我的leader的要求就是把图片由彩色变成黑白的,这样可以提高识别率,那我也简单粗暴地操作了一通……

import face_recognition
from PIL import Image,ImageDraw
import matplotlib.pyplot as plt
import numpy as np

known_image=face_recognition.load_image_file("1.JPG")
unknown_image=face_recognition.load_image_file("u2.JPG")

img1=Image.open("1.JPG").convert('1')
plt.imshow(img1)
plt.axis('off')
plt.ion()     #如果使用plt.show(),则展示出来的图片需要我们手动关闭
plt.pause(2)  #图片暂停几秒,括号里为你想使其暂停的秒数
plt.close()

img2=Image.open("u2.JPG").convert('1')
plt.imshow(img2)
plt.axis('off')
plt.ion()
plt.pause(2)
plt.close()

known_encoding=face_recognition.face_encodings(known_image)[0]
unknown_encoding=face_recognition.face_encodings(unknown_image)[0]
print(known_encoding)
print(unknown_encoding)

results=face_recognition.compare_faces([known_encoding],unknown_encoding,tolerance=0.4)
if results[0]==True:
    print("Yes!")
else:
    print("No!")







运行后发现弹出的图片是黑白的。

3.识别图片上的人脸

按照上面讲的编译完opencv后
把这三个东西跟图片一起放在一个文件夹下

import cv2  #opencv库
import numpy as np
#加载人脸模型库
face_model=cv2.CascadeClassifier('haarcascade_frontalcatface.xml'#图片进行灰度处理
gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
#人脸检测
faces = face_model.detectMultiScale(gray)
#标记人脸
for (x,y,w,h) in faces:    
#1.原始图片;2坐标点;3.矩形宽高 4.颜色值(RGB);5.线框 
    cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2)
#显示图片窗口
cv2.imshow('faces',image)
#窗口暂停
cv2.waitKey(0)
#销毁窗口
cv2.destroyAllWindows()


4.外接摄像头

(1)工具

摄像头(我用的是海康威视的),交换机,路由器
把树莓派,笔记本电脑,摄像头,路由器都用网线接在交换机上,确保它们分配到一个IP地址。

(2)摄像头的激活

海康威视摄像头默认的IP地址是192.168.1.64,默认用户名是admin,密码自己设置后要记住。

(3)代码

import cv2


def get_img_from_camera_net(folder_path):
    # cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)  # 打开本地摄像机
    cap = cv2.VideoCapture("rtsp://%s:%s@%s//Streaming/Channels/%d" % ('admin','19990909cym' ,'192.168.1.101', 1))
    print("rtsp://%s:%s@%s//Streaming/Channels/%d" % ('admin','19990909cym' ,'192.168.1.101', 1))
# ‘admin’,‘密码’,‘IP地址’
    i = 1
    while i < 10000:
        ret, frame = cap.read()
        cv2.imshow("capture", frame)
        print(str(i))

        # cv2.imwrite(folder_path + str(i) + '.jpg', frame)  # 存储为图像

        if cv2.waitKey(10) & 0xFF == ord('q'):
            break
        i += 1
    cap.release()
    cv2.destroyAllWindows()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值