# 实时人脸识别系统:基于 OpenCV 和 Python 的实现

news2025/4/17 13:36:48

实时人脸识别系统:基于 OpenCV 和 Python 的实现

在当今数字化时代,人脸识别技术已经广泛应用于各种场景,从手机解锁到安防监控,再到智能门禁系统。今天,我将通过一个完整的代码示例,详细讲解如何使用 Python 和 OpenCV 实现一个实时人脸识别系统。这个系统不仅可以检测摄像头中的面部,还能识别出人脸的身份,并在图像上显示中文标签。

一、项目背景

人脸识别技术的核心在于能够快速、准确地识别出人脸,并将其与已知的身份进行匹配。OpenCV 是一个强大的计算机视觉库,它提供了丰富的图像处理和机器学习功能,非常适合用于实现人脸识别系统。在这个项目中,我们将结合 OpenCV 的人脸检测和识别功能,以及 Python 的灵活性,构建一个实时人脸识别系统。

二、技术栈

  • Python:一种广泛使用的高级编程语言,具有丰富的库和框架支持。
  • OpenCV:一个开源的计算机视觉库,提供了大量图像和视频处理功能。
  • Pillow:一个 Python 图像处理库,用于处理图像中的中文文本。

三、代码实现

1. 添加中文文本到图像

OpenCV 默认不支持中文字符,因此我们需要借助 Pillow 库来实现中文文本的绘制。以下是一个自定义函数 cv2AddChineseText,用于在图像上添加中文文本:

import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont

def cv2AddChineseText(img, text, position, textColor=(0, 255, 0), textSize=30):
    """ 向图片中添加中文 """
    if (isinstance(img, np.ndarray)):  # 判断是否OpenCV图片类型
        img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))  # 实现array到image的转换
    draw = ImageDraw.Draw(img)  # 在img图片上创建一个绘图的对象
    # 字体的格式
    fontStyle = ImageFont.truetype("simsun.ttc", textSize, encoding="utf-8")
    draw.text(position, text, textColor, font=fontStyle)  # 绘制文本
    return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)  # 转换回OpenCV格式

2. 准备训练数据

为了实现人脸识别,我们需要准备一些人脸图像作为训练数据。这些图像可以是同一人物的多张照片,也可以是不同人物的照片。我们将这些图像加载到一个列表中,并为每张图像分配一个标签:

def image_re(image):
    a = cv2.imread(image, 0)  # 以灰度模式读取图像
    a = cv2.resize(a, (120, 180))  # 调整图像大小
    images.append(a)

images = []
image_re('wp1.png')  # 加载人物1的图像1
image_re('wp2.png')  # 加载人物1的图像2
image_re('zjl1.png')  # 加载人物2的图像1
image_re('zjl2.png')  # 加载人物2的图像2

labels = [0, 0, 1, 1]  # 为每张图像分配标签,0表示人物1,1表示人物2

3. 训练人脸识别模型

我们将使用 OpenCV 提供的 FisherFace 人脸识别算法来训练模型。FisherFace 是一种经典的人脸识别算法,基于线性判别分析(LDA)来优化特征提取:

recognizer = cv2.face.FisherFaceRecognizer_create(threshold=20000)
recognizer.train(images, np.array(labels))

4. 实时人脸检测与识别

接下来,我们将使用 OpenCV 的 Haar 特征级联分类器来检测摄像头中的面部,并使用训练好的模型进行识别。以下是完整的代码:

# 加载人脸检测器
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

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

while True:
    ret, frame = cap.read()
    if not ret:
        break

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    faces = faceCascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

    for (x, y, w, h) in faces:
        face = gray[y:y+h, x:x+w]  # 提取人脸区域
        face = cv2.resize(face, (120, 180))  # 调整人脸大小以匹配训练数据
        label, confidence = recognizer.predict(face)  # 使用模型进行识别
        dic = {0: '我', 1: '周杰伦', -1: '无法识别'}  # 创建字典,将标签映射为人物名称
        text = dic.get(label, '未知')  # 获取识别结果
        cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)  # 绘制矩形框
        frame = cv2AddChineseText(frame, text, (x, y-10), textColor=(255, 0, 0))  # 添加中文标签

    cv2.imshow('Face Recognition', frame)  # 显示结果

    if cv2.waitKey(1) & 0xFF == ord('q'):  # 按下 'q' 键退出
        break

cap.release()  # 释放摄像头资源
cv2.destroyAllWindows()  # 关闭所有窗口

四、运行效果

运行上述代码后,摄像头将打开并实时显示视频流。当检测到人脸时,程序会绘制一个矩形框,并在框上方显示识别结果(如“我”或“周杰伦”)。按下 'q' 键即可退出程序。

五、总结

通过上述代码,我们实现了一个完整的实时人脸识别系统。这个系统不仅能够检测摄像头中的面部,还能识别出人脸的身份,并在图像上显示中文标签。你可以根据自己的需求扩展这个系统,例如增加更多的人脸数据、优化识别算法或改进用户界面。

如果你对这个项目感兴趣,或者有任何问题,欢迎在评论区留言交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2328804.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

wx206基于ssm+vue+uniapp的优购电商小程序

开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…

React编程高级主题:错误处理(Error Handling)

文章目录 **5.2 错误处理(Error Handling)概述****5.2.1 onErrorReturn / onErrorResume(错误回退)****1. onErrorReturn:提供默认值****2. onErrorResume:切换备用数据流** **5.2.2 retry / retryWhen&…

ubuntu20.04升级成ubuntu22.04

命令行 sudo do-release-upgrade 我是按提示输入y确认操作,也可以遇到配置文件冲突时建议选择N保留当前配置

SpringCloud(25)——Stream介绍

1.场景描述 当我们的分布式系统建设到一定程度了,或者服务间是通过异步请求来通讯的,那么我们避免不了使用MQ来解决问题。 假如公司内部进行了业务合并或者整合,需要服务A和服务B通过MQ的方式进行消息传递,而服务A用的是RabbitMQ&…

centos8上实现lvs集群负载均衡dr模式

1.前言 个人备忘笔记,欢迎探讨。 centos8上实现lvs集群负载均衡nat模式 centos8上实现lvs集群负载均衡dr模式 之前写过一篇lvs-nat模式。实验起来相对顺利。dr模式最大特点是响应报文不经调度器,而是直接返回客户机。 dr模式分同网段和不同网段。同…

uniapp如何接入星火大模型

写在前面:最近的ai是真的火啊,琢磨了一下,弄个uniappx的版本开发个东西玩一下,想了想不知道放啥内容,突然觉得deepseek可以接入,好家伙,一对接以后发现这是个付费的玩意,我穷&#x…

MySQL vs MSSQL 对比

在企业数据库管理系统中,MySQL 和 Microsoft SQL Server(MSSQL)是最受欢迎的两大选择。MySQL 是一款开源的关系型数据库管理系统(RDBMS),由 MySQL AB 开发,现归属于 Oracle 公司。而 MSSQL 是微…

python基础-10-组织文件

文章目录 【README】【10】组织文件(复制移动删除重命名)【10.1】shutil模块(shell工具)【10.1.1】复制文件和文件夹【10.1.1.1】复制文件夹及其下文件-shutil.copytree 【10.1.2】文件和文件夹的移动与重命名【10.1.3】永久删除文件和文件夹【10.1.4】用…

ORA-09925 No space left on device 问题处理全过程记录

本篇文章关键字:linux、oracle、审计、ORA-09925 一、故障现像 朋友找到我说是他们备份软件上报错。 问题比较明显,ORA-09925,看起来就是空间不足导致的 二、问题分析过程 这里说一下逐步的分析思路,有个意外提前说一下就是我…

多输入多输出 | Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测

多输入多输出 | Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测 目录 多输入多输出 | Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测&#…

27信号和槽_自定义信号(2)

自定义信号和槽 绑定信号和槽 如何才能触发出自定义的信号呢?(上诉代码只是将信号和槽绑定在一起,但并没有触发信号) Qt 内置的信号,都不需要咱们手动通过代码来触发 用户在 GUI, 进行某些操作,就会自动触发对应信号.(发射信号的代码已经内置…

人工智能在生物医药领域的应用地图:AIBC2025将于6月在上海召开!

人工智能在生物医药领域的应用地图:AIBC2025将于6月在上海召开! 近年来,人工智能在生物医药行业中的应用受到广泛关注。 2024年10月,2024诺贝尔化学奖被授予“计算蛋白质设计和蛋白质结构预测”,这为行业从业人员带来…

2025.3.19

1、用vim编辑/etc/hosts文件,将本机和第二个虚拟机的ip地址和主机名写入该文件,然后ping 两个主机的主机名能否ping通; (1)在第一个虚拟机编辑/etc/hosts: 首先使用hostname、hostnamectl、hostname -f指令查看主机名…

深度学习 Deep Learning 第16章 结构化概率模型

深度学习 Deep Learning 第16章 结构化概率模型 内容概要 本章深入探讨了结构化概率模型(Graphical Models,包含有向图和无向图模型)的概念及其在深度学习中的应用。结构化概率模型通过图结构描述随机变量之间的直接交互,从而简…

鸿蒙 harmonyOS 网络请求

应用通过HTTP发起一个数据请求,支持常见的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法。 接口说明 HTTP数据请求功能主要由http模块提供。 使用该功能需要申请ohos.permission.INTERNET权限。 第一步 : 在module.json5文件里面添加网络…

进程概念(Linux)

目录 一. 冯诺依曼体系结构 二. 操作系统(OS(操作系统的英文缩写Operator System)) 2.1概念 2-2 设计OS的目的 2.3 核心功能 2.4 如何管理(先描述再组织) 2.5 系统调用和库函数概念 三.进程 3.1 基本概念与基本操作 3.2 描述进程-PCB 3.3 如何…

免费在线MBTI性格测试工具 - 探索你的性格特质

免费在线MBTI性格测试工具 - 探索你的性格特质 简介 我很高兴为大家分享这个专业的MBTI性格测试工具。这是一个完全免费的在线测试系统,基于迈尔斯-布里格斯类型指标(MBTI)理论开发,旨在帮助您更好地了解自己的性格特征,发现职业发展方向。…

AI 数理逻辑基础之统计学基本原理(上)

目录 文章目录 目录统计学统计学基本概念描述性统计数据可视化图表工具 汇总统计统计数据的分布情况:中位数、众数、平均值统计数据的离散程度:极差、方差、标准差、离散系数 相关分析Pearson 线性关系相关系数Spearman 单调关系相关系数 回归分析回归模…

积分赛——读取实时时间

设计要求 调用DS1302芯片驱动程序,读取DS1302中的实时时分秒数据,并显示在数码管上。 23时59分59秒 通过串口发送时间作为定时时间,定时时间到则蜂鸣器响2s后静音。 串口发送格式:“12:35:66”。 备注&…

进程和线程的概念及Linux操作

文章目录 一、进程与线程1、进程2、线程3、查看进程与线程 二、Linux的“虚拟内存管理”,它与stm32中的 真实物理内存(内存映射)有什么区别?三、Linux系统调用函数 fork()、wait()、exec() 等1、fork()函数…