简单的Python人脸识别系统

简单的Python人脸识别系统

概述

Python人脸识别系统一般由以下几个模块构成:

  1. 摄像头模块:通过电脑或者外接摄像头采集照片或者视频
  2. 人脸检测模块:使用人脸检测算法从采集的照片或者视频中提取人脸图像
  3. 人脸特征提取与比对模块:对于每个人,在系统中维护一个特征向量用于表示一个人的特征,新采集到的人脸图像与系统中维护的人脸特征向量进行比对,判断是否为同一人

安装依赖包

Python人脸识别系统需要借助一些第三方库实现,需要通过pip安装。以下是需要安装的库:

pip install opencv-python
pip install face-recognition
pip install numpy

示例1:采集人脸图像并提取特征

import cv2
import face_recognition

# 打开摄像头
cap = cv2.VideoCapture(0)

# 循环采集人脸图像直到按下q键结束
while True:
    # 获取当前摄像头采集的帧
    ret, frame = cap.read()

    # 翻转图像,因为摄像头默认将图像水平翻转
    frame = cv2.flip(frame, 1)

    # 将图像从BGR颜色空间转换到RGB颜色空间
    rgb_frame = frame[:, :, ::-1]

    # 检测人脸
    face_locations = face_recognition.face_locations(rgb_frame)

    if len(face_locations) > 0:
        # 提取人脸特征
        face_encoding = face_recognition.face_encodings(rgb_frame, known_face_locations=face_locations)[0]

        # 在摄像头采集的图像上绘制人脸边框
        for top, right, bottom, left in face_locations:
            cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)

        # 将采集到的人脸特征保存到文件,文件名为当前时间戳
        with open(str(int(time.time())) + ".fe", "wb") as f:
            f.write(pickle.dumps(face_encoding))

    # 显示处理后的图像
    cv2.imshow('Video', frame)

    # 按下q键结束程序
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放摄像头资源和窗口
cap.release()
cv2.destroyAllWindows()

上述代码逻辑为:

  1. 打开摄像头
  2. 循环采集人脸图像直到按下q键结束
  3. 获取当前摄像头采集的帧
  4. 将图像从BGR颜色空间转换到RGB颜色空间
  5. 检测人脸
  6. 如果检测到人脸,提取人脸特征,并在采集到的图像上绘制人脸边框
  7. 将采集到的人脸特征保存到文件
  8. 显示处理后的图像
  9. 按下q键结束程序

示例2:对比采集人脸和系统中的人脸库进行比对

import glob
import pickle
import cv2
import face_recognition

# 加载已经保存的人脸数据
known_face_encodings = []
known_face_names = []
for file in glob.glob("*.fe"):
    with open(file, "rb") as f:
        known_face_encodings.append(pickle.load(f))
        known_face_names.append(file[:-3])

# 打开摄像头
cap = cv2.VideoCapture(0)

# 循环采集人脸图像直到按下q键结束
while True:
    # 获取当前摄像头采集的帧
    ret, frame = cap.read()

    # 翻转图像,因为摄像头默认将图像水平翻转
    frame = cv2.flip(frame, 1)

    # 将图像从BGR颜色空间转换到RGB颜色空间
    rgb_frame = frame[:, :, ::-1]

    # 检测人脸
    face_locations = face_recognition.face_locations(rgb_frame)

    if len(face_locations) > 0:
        # 提取人脸特征
        face_encoding = face_recognition.face_encodings(rgb_frame, known_face_locations=face_locations)[0]

        # 将采集到的人脸和系统中的人脸进行比对
        matches = face_recognition.compare_faces(known_face_encodings, face_encoding)

        # 检索和采集人脸最相似的人脸
        name = "Unknown"
        face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)
        best_match_index = np.argmin(face_distances)
        if matches[best_match_index]:
            name = known_face_names[best_match_index]

        # 在摄像头采集的图像上绘制人脸边框和名字
        for top, right, bottom, left in face_locations:
            cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)
            cv2.putText(frame, name, (left + 6, bottom - 6), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255, 255, 255), 1)

    # 显示处理后的图像
    cv2.imshow('Video', frame)

    # 按下q键结束程序
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放摄像头资源和窗口
cap.release()
cv2.destroyAllWindows()

上述代码逻辑为:

  1. 加载已经保存的人脸数据
  2. 打开摄像头
  3. 循环采集人脸图像直到按下q键结束
  4. 获取当前摄像头采集的帧
  5. 将图像从BGR颜色空间转换到RGB颜色空间
  6. 检测人脸
  7. 如果检测到人脸,提取人脸特征
  8. 将采集到的人脸和系统中的人脸进行比对
  9. 检索和采集人脸最相似的人脸
  10. 在摄像头采集的图像上绘制人脸边框和名字
  11. 显示处理后的图像
  12. 按下q键结束程序

以上两个示例包含了Python人脸识别系统的两个核心功能:采集人脸图像并提取特征和对比采集人脸和系统中的人脸库进行比对。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:简单的Python人脸识别系统 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • Python随手笔记之标准类型内建函数

    Python随手笔记之标准类型内建函数 Python中有许多标准类型内建函数可以对不同的数据类型进行操作。这些函数可以帮助我们更有效地处理数据,让我们来更详细地了解这些内建函数吧。 值类型转换函数 int() int()函数用于将字符串或数字转换为整型。如果参数无法转换成整数,则会抛出ValueError异常。 示例: num1 = int(‘123’) #…

    python 2023年6月5日
    00
  • 利用python代码写的12306订票代码

    下面是关于“利用Python代码写的12306订票代码”的完整攻略: 1. 背景介绍 12306是中国铁路客户服务中心开发的一套网络订票系统,也是全国人民购买火车票的主要途径之一。由于12306订票系统访问量大、用户集中,往往会出现抢票难的情况,因此有些程序员开发了一些自动化的代码来辅助用户进行抢票,提高购票成功率。 2. 编写过程 2.1 获取登录验证码 …

    python 2023年6月3日
    00
  • 流行的Ajax应用演示和源码下载

    流行的Ajax应用演示和源码下载,是指在网站开发中使用Ajax技术的一种展示方式。下面将分为三个部分来详细讲解该攻略: 一、Ajax的基本概念 Ajax是Asynchronous JavaScript and XML的缩写,即异步的JavaScript和XML。它是一种在Web页面中实现异步通信的技术,能够让Web页面在不重新加载的情况下更新部分内容。而且由…

    python 2023年6月3日
    00
  • 使用requests库制作Python爬虫

    下面是使用requests库制作Python爬虫的完整攻略。 一、什么是requests库 requests是Python的一个第三方库,用于处理HTTP请求。通过requests模块,可以很方便地向网络服务器发送请求并获取响应数据。requests库拥有简单易用的API,是Python中最常用的HTTP库之一。 二、使用requests库制作爬虫的基本步骤…

    python 2023年6月3日
    00
  • 教你怎么用python selenium实现自动化测试

    教你怎么用 Python Selenium 实现自动化测试 前置知识 在学习本文档之前,请确保您掌握以下技能: 熟练使用 Python 编程语言 了解基本的 HTML 和 CSS 熟悉基本的 Selenium 操作 如果您没有相关的知识基础,建议先学习以上知识再来阅读本文。 环境准备 在开始编写自动化测试之前,需要先安装相关的工具和模块。 1. 安装 Pyt…

    python 2023年5月19日
    00
  • Pycharm中配置远程Docker运行环境的教程图解

    以下是“Pycharm中配置远程Docker运行环境的教程图解”的完整攻略: 配置远程Docker运行环境 1. 确认操作系统和安装Docker 首先需要确认服务器操作系统是Linux,并且已经安装了Docker。如果没有安装Docker,可以按照官方文档进行安装:https://docs.docker.com/engine/install/ 2. 配置SS…

    python 2023年5月13日
    00
  • 新手学习Python2和Python3中print不同的用法

    当学习 Python 编程语言时,我们会发现在 Python 2 和 Python 3 中,print 输出函数的用法是有所不同的。下面我给出一个完整的攻略来帮助新手快速搞清楚这个问题: Python 2 中的 print 在 Python 2 中,print 函数不需要使用括号进行参数的传递,而直接使用空格分隔参数即可。例如: print "He…

    python 2023年6月5日
    00
  • Python利用多线程枚举实现获取wifi信息

    Python多线程枚举实现获取wifi信息攻略 1. 前置知识 在阅读本攻略之前,需要掌握以下知识: Python基础语法 网络编程基础:网络通信协议、socket编程 多线程编程基础:线程、锁、条件变量等 Linux基础命令行操作 2. 攻略实现步骤 本攻略实现步骤如下: 获取wifi网络接口名 执行iwlist命令获取接口附近无线网络信息 解析iwlis…

    python 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部