小白上手人脸识别(包含dlib库安装)
一、前导
建议先学习黑马程序员的课程,课程内容不多相当于简单了解一下人脸识别,给人脸识别打个基础,没时间也可以不看(本文已经做了最好的总结)。
二、图像学基础
1. opencv库安装
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
2. 使用opencv库写入图片
import numpy as np
import cv2 # 导入opencv库
# 1.实例化代表图片的列表数据
image_list = [
[[0, 0, 255], [0, 0, 255]],
[[0, 255, 0], [0, 255, 0]],
[[255, 0, 0], [255, 0, 0]],
]
# 2.吧列表数据转化为numpy中的数组
image_array = np.array(image_list)
# 3.把转换好的数组对象写入到待定的文件中
cv2.imwrite("images/demo3x2.png", image_array)
3. 使用opencv库读入图片
import cv2
# 使用opencv读取刚刚写入的图片,查看像素内容,查看形状或者说维度信息
# 1.通过opencv库读取图片
src = cv2.imread("images/demo3x2.png")
# 2.查看像素内容
print(src)
# 3.查看维度信息
print(src.shape)
# (3, 2, 3): (三行,每行两个像素,三通道)
4. 彩色图片转为灰度图片
import cv2
# 把彩色图像转换为灰度图像,并看看灰度图像在计算机中又是怎么样表示的。
# 1.读取原来的彩色图片
rgb_cat = cv2.imread("images/cat.jpg")
# 2.把彩色图片转换为灰度图片
gray_cat = cv2.cvtColor(rgb_cat, cv2.COLOR_BGR2GRAY)
# 3.查看灰度图像的像素内容
print(gray_cat)
# 4.查看灰度图像的维度信息
print(gray_cat.shape)
# 5.保存灰度图像
cv2.imwrite("images/gray_cat.png", gray_cat)
三、人脸识别第三方库安装
1. cmake库安装
pip install cmake
2.boost库安装
pip install boost
3.dlib库安装
3.1下载dlib .whl包
依据自己的python版本去下载,我的python是3.8所以我选择的cp38。下载后保存在一个文件夹中便于后续安装。
附:GitHub下载地址
3.2安装dlib .whl包
第一步:打开whl包所在文件夹
第二步:输入命令开始安装,不要输错whl包名。
pip install dlib-19.22.99-cp38-cp38-win_amd64.whl
第三步:检查是否安装成功。
如果有报错是cmake库的原因可以参考这篇文章,安装CMake。
4.face_recognition库安装
pip install face_recognition
四、人脸识别代码
import os
import face_recognition
import cv2
# 二:读取数据库中的人名和面部特征
# 1.准备工作
face_databases_dir = 'face_databases'
user_names = [] # 存用户名
user_faces_encodings = [] # 存用户面部特征向量(一一对应)
# 2.正式工作
# 2.1 得到face_databases_dir文件夹下所有文件名
files = os.listdir('face_databases')
# 2.2 循环读取文件名进行进一步处理
for image_short_name in files:
# 2.2.1 截取文件名前半部分作为用户名存入user_names中
user_name, _ = os.path.splitext(image_short_name)
user_names.append(user_name)
# 2.2.2 读取图片文件中的面部特征信息存入user_faces_encodings中
# 拼接出每一张图片的完整路径
image_file_name = os.path.join(face_databases_dir, image_short_name)
# 加载图片信息
image_file = face_recognition.load_image_file(image_file_name)
# 读取图片特征信息
face_encoding = face_recognition.face_encodings(image_file)[0] # 这里如果图片中有多个人的话会返回多个值 ['第一个人的面部特征', '第二个人的面部特征'],但是这个案例中的图片不涉及多个人,每张图片只有一个人。故末尾要加上[0]
user_faces_encodings.append(face_encoding)
# 第二步结束。
# 一:打开摄像头,读取摄像头拍摄到的画面,
# 定位画面中人的脸部,并用绿色的框框把人的脸部框住
# 三、用拍摄到人的脸部特征和数据库中的面部特征去匹配,并在用户头像绿框上用用户名做标记,未知用户名统一用Unknown
# 1.打开摄像头,获取摄像头对象
video_capture = cv2.VideoCapture(0)
# 2.循环不停的去获取摄像头拍摄的画面,并作出进一步处理
while True:
# 2.1 获取摄像头拍摄到的画面
ret, frame = video_capture.read() # ret:是否有画面, frame:摄像头所拍摄的画面
# 2.2 从拍摄到的画面中提取人的脸部所在区域(可能有多个)
face_locations = face_recognition.face_locations(frame)
# face_locations: [(30, 90, 45, 100), (..., ..., ..., ...)] 括号内容(top, right, bottom, left),每一个括号表示画面中的一个人脸所在区域
# 2.2.1 从所有人脸区域中提取出面部特征(可能有多个)
face_encodings = face_recognition.face_encodings(frame, face_locations) # 第一个参数:画面, 第二个参数:人脸区域
# 2.2.2 定义用于存储摄像头拍摄到画面中的用户姓名列表 初始为空
names = []
# 2.2.3 遍历face_encodings与数据库中的人脸面部特征进行匹配, 并将匹配的用户名存入names
for face_encoding in face_encodings:
# compare_faces(['面部特征1', '面部特征2', '面部特征3', ...数据库中的全部面部特征], 当前遍历到的单个面部特征)
# 如果当前遍历到的面部特征为'面部特征1',则compare_faces()返回结果为[True, False, False, .....]
matches = face_recognition.compare_faces(user_faces_encodings, face_encoding)
# 填充names
name = "UnKnown" # 默认为UnKnown
for index, is_match in enumerate(matches):
if is_match:
name = user_names[index]
break
names.append(name)
print(names)
# 2.3 循环遍历人的脸部所在区域,并画框,在框框上标识出人的姓名
for (top, right, bottom, left), name in zip(face_locations, names):
# 2.3.1 在人向所在区域画框
cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 2)
font = cv2.FONT_HERSHEY_DUPLEX
cv2.putText(frame, name, (left, top - 10), font, 0.5, (0, 255, 0), 1)
# frame:在哪个画面上画框;
# (left, top)和(right, bottom)表示框的两个对角点
# (0, 255, 0) BGR, 三通道表示绿色
# 2 表示线条宽度
# 2.4 通过OpenCV把画面展示出来
cv2.imshow("Video", frame) # 第一个参数:窗口名称, 第二个参数:窗口内容\
# 2.5 设定按q退出while循环,退出程序的这样一个机制
if cv2.waitKey(1) & 0xFF == ord('q'): # 固定套路
break # 退出while循环
# 3.退出程序的时候,释放摄像头或其他资源
video_capture.release()
cv2.destroyAllWindows() # 关闭OpenCV所有窗口