最简易的人脸识别代码

一、前导

建议先学习黑马程序员的课程,课程内容不多相当于简单了解一下人脸识别,给人脸识别打个基础,没时间也可以不看(本文已经做了最好的总结)。

二、图像学基础

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)

pycharm中打开的效果图

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所有窗口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sjsflyqy10

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值