一个简单的人脸识别demo

news2025/3/24 9:44:47

使用face_recognitionOpenCV库完成人脸检测和识别任务:

# 导入必要的库
import cv2  # OpenCV库,用于图像处理
import face_recognition  # 人脸识别库
import numpy as np  # 数值计算库

# 步骤1:加载已知人脸的图片并编码
# 加载乔布斯的图片并编码
jobs_image = face_recognition.load_image_file("known_people/jobs.jpg")
jobs_encoding = face_recognition.face_encodings(jobs_image)[0]  # 提取第一张人脸的编码

# 加载盖茨的图片并编码
gates_image = face_recognition.load_image_file("known_people/gates.jpg")
gates_encoding = face_recognition.face_encodings(gates_image)[0]

# 创建已知人脸编码和对应姓名的列表
known_face_encodings = [jobs_encoding, gates_encoding]
known_face_names = ["Steve Jobs", "Bill Gates"]

# 步骤2:加载待识别的未知图片
unknown_image = face_recognition.load_image_file("unknown_person/test.jpg")

# 将图片从BGR颜色空间转换为RGB(face_recognition使用RGB格式)
unknown_image_rgb = cv2.cvtColor(unknown_image, cv2.COLOR_BGR2RGB)

# 步骤3:在未知图片中查找所有人脸并编码
# 检测人脸位置
face_locations = face_recognition.face_locations(unknown_image_rgb)
# 提取人脸编码
face_encodings = face_recognition.face_encodings(unknown_image_rgb, face_locations)

# 步骤4:遍历未知图片中的每张人脸进行识别
for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
    # 比较当前人脸与已知人脸库
    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]
    
    # 步骤5:在图片上绘制人脸框和名称
    cv2.rectangle(unknown_image, (left, top), (right, bottom), (0, 255, 0), 2)  # 绘制绿色矩形框
    cv2.putText(unknown_image, name, (left, top - 10), cv2.FONT_HERSHEY_SIMPLEX, 
                0.8, (0, 255, 0), 2)  # 在框上方添加名称

# 步骤6:显示识别结果
cv2.imshow('Face Recognition', unknown_image)
cv2.waitKey(0)  # 等待任意按键
cv2.destroyAllWindows()  # 关闭所有窗口

代码解析及行作用说明:

  1. 库导入

    import cv2
    import face_recognition
    import numpy as np
    
    • cv2:OpenCV库,用于图像处理和显示
    • face_recognition:基于dlib的人脸识别库
    • numpy:数值计算库,处理数组数据
  2. 加载并编码已知人脸

    jobs_image = face_recognition.load_image_file("known_people/jobs.jpg")
    jobs_encoding = face_recognition.face_encodings(jobs_image)[0]
    
    • load_image_file:加载图片文件
    • face_encodings:提取人脸的特征编码(返回列表,取第一个元素)
  3. 创建已知人脸数据库

    known_face_encodings = [jobs_encoding, gates_encoding]
    known_face_names = ["Steve Jobs", "Bill Gates"]
    
    • 存储已知人脸的编码和对应的姓名
  4. 处理待识别图片

    unknown_image = face_recognition.load_image_file("unknown_person/test.jpg")
    unknown_image_rgb = cv2.cvtColor(unknown_image, cv2.COLOR_BGR2RGB)
    
    • 加载待识别图片
    • 将颜色空间从BGR转换为RGB(face_recognition需要RGB格式)
  5. 检测并编码未知人脸

    face_locations = face_recognition.face_locations(unknown_image_rgb)
    face_encodings = face_recognition.face_encodings(unknown_image_rgb, face_locations)
    
    • face_locations:检测图片中所有人脸的位置(返回坐标列表)
    • face_encodings:提取每张人脸的特征编码
  6. 人脸识别与匹配

    matches = face_recognition.compare_faces(known_face_encodings, face_encoding)
    face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)
    best_match_index = np.argmin(face_distances)
    
    • compare_faces:比较当前人脸与已知人脸库,返回布尔值列表
    • face_distance:计算与每个已知人脸的相似度距离
    • argmin:找到最相似人脸的索引
  7. 绘制识别结果

    cv2.rectangle(unknown_image, (left, top), (right, bottom), (0, 255, 0), 2)
    cv2.putText(unknown_image, name, (left, top - 10), ...)
    
    • 用绿色矩形框标记人脸位置
    • 在人脸框上方显示识别出的姓名
  8. 显示结果图像

    cv2.imshow('Face Recognition', unknown_image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 显示处理后的图片
    • 等待用户按键后关闭窗口

详细解析

  1. 安装依赖库

    pip install opencv-python
    pip install face-recognition
    
  2. 准备图片

    • 创建文件夹结构:
      ├── known_people/
      │   ├── jobs.jpg
      │   └── gates.jpg
      └── unknown_person/
          └── test.jpg
      
    • 图片建议使用正面清晰的人脸照片
  3. 运行代码

    • 将代码中的图片路径替换为实际路径
    • 直接运行Python脚本

工作原理

  1. 人脸编码:将人脸转换为128维的特征向量
  2. 特征比对:通过计算欧氏距离比较人脸相似度
  3. 阈值判断:默认距离小于0.6则认为匹配(可通过tolerance参数调整)

扩展方向

  • 添加实时摄像头识别功能
  • 增加人脸数据库规模
  • 添加人脸识别置信度显示
  • 集成到Web应用中

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

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

相关文章

SpringDoc和Swagger使用

目录 一、SpringDoc 1.添加依赖 2.配置代码 配置解释 (1)springdoc.api-docs.path (2)springdoc.swagger-ui.path (3)springdoc.swagger-ui.operationsSorter (4)springdoc.…

asp.net core mvc模块化开发

razor类库 新建PluginController using Microsoft.AspNetCore.Mvc;namespace RazorClassLibrary1.Controllers {public class PluginController : Controller{public IActionResult Index(){return View();}} }Views下Plugin下新建Index.cshtml {ViewBag.Title "插件页…

第2.2节 Android Jacoco插件覆盖率采集

JaCoCo(Java Code Coverage)是一款开源的代码覆盖率分析工具,适用于Java和Android项目。它通过插桩技术统计测试过程中代码的执行情况,生成可视化报告,帮助开发者评估测试用例的有效性。在github上开源的项目&#xff…

Vue3中router最佳封装落地

文章目录 前言一、拆分路由文件夹?二、main.ts中注册路由总结 前言 router在使用过程中如果我们直接在一个文件的一个数组中配置,最后路由越来越多会导致不易管理,我们可以将一个页面的路由配置在一个数组中最后统一导入,这样就会…

网络爬虫【爬虫库request】

我叫不三不四,很高兴见到大家,欢迎一起学习交流和进步 今天来讲一讲爬虫 Requests是Python的一个很实用的HTTP客户端库,完全满足如今网络爬虫的需求。与Urllib对比,Requests不仅具备Urllib的全部功能;在开发使用上&…

aws(学习笔记第三十四课) dockerized-app with asg-alb

aws(学习笔记第三十四课) dockerized-app with asg-alb 使用cdk生成dockerized-app并使用AutoScalingGroup和ApplicationLoaderBalancer 学习内容: 使用cdk生成dockerized-app并使用AutoScalingGroup和ApplicationLoaderBalancer在AutoScalingGroup中使用efs以及R…

嵌入式c学习七

c语言指针:程序需要载入内存中运行,在32bit系统中内存地址的范围是:0x0000 0000-0xFFFF FFFF,内存大小为4GB,内存地址指的是内存单元的编号是固定的,本身就是一个整数,对于32bit系统&#xff0c…

软考通关利器:中级软件设计师结构化开发核心考点

简介: 作为国家软考中级认证的核心科目,“软件设计师” 结构化开发能力是职业进阶的黄金敲门砖。本模块聚焦考试大纲高频考点,深度解析需求建模、结构化分析方法(SA/SD)、模块设计原则、数据流图(DFD&#…

【Linux】Hadoop-3.4.1的伪分布式集群的初步配置

配置步骤 一、检查环境 JDK # 目前还是 JDK8 最适合 Hadoop java -version echo $JAVA_HOME Hadoop hadoop version echo $HADOOP_HOME 二、配置SSH免密登录 Hadoop需要通过SSH管理节点(即使在伪分布式模式下) sudo apt install openssh-server …

楼宇自控系统的结构密码:总线与分布式结构方式的差异与应用

在现代建筑中,为了实现高效、智能的管理,楼宇自控系统变得越来越重要。它就像建筑的 智能管家,可自动控制照明、空调、通风等各种机电设备,让建筑运行更顺畅,还能节省能源成本。而在楼宇自控系统里,有两种关…

Fourier-Lerobot——把斯坦福人形动作策略iDP3封装进了Lerobot(含我司七月人形研发落地实践)

前言 近期在抠lerobot源码时,看到其封装了ALOHA ACT、diffusion policy、π0时,我就在想,lerobot其实可以再封装下idp3 我甚至考虑是否从我联合带的那十几个具身研究生中选几个同学做下这事,对他们也是很好的历练然当25年3.18日…

系统架构设计知识体系总结

1.技术选型 1.什么是技术选型? 技术选型是指评估和选择在项目或系统开发中使用的最合适的技术和工具的过程。这涉及考虑基于其能力、特性、与项目需求的兼容性、可扩展性、性能、维护和其他因素的各种可用选项。技术选型的目标是确定与项目目标相符合、能够有效解…

计划管理工具应该具备的能(甘特图)

在当今快节奏的项目管理环境中,高效地规划和跟踪项目进度是至关重要的。甘特图,作为项目管理领域的经典工具,以其直观的时间轴和任务分配方式,深受项目管理者的青睐。 随着数字化时代的到来,甘特图线上编辑器应运而生&…

简单实用!百度AI + Raphael AI = 免费生图

简单实用!百度AI Raphael AI 免费生图 -- ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b55eda9141d34697b05db0cd60f62b75.png#pic_center) 第一步:下载或截取一些好看的图片当参考图片 第二步:用百度AI描述你想要的图片&…

2025-03-22 学习记录--C/C++-C 库函数 - getchar()

C 库函数 - getchar() ⭐️ C 标准库 - <stdio.h> &#xff08;一&#xff09;、函数声明 &#x1f36d; int getchar(void)从标准输入 stdin 获取一个字符&#xff08;一个无符号字符&#xff09;。 参数&#xff1a;&#x1f380; NA 返回值&#xff1a;&#x1f38…

APM 仿真遥控指南

地面站开发了一段时间了&#xff0c;由于没有硬件&#xff0c;所以一直在 APM 模拟器中验证。我们已经实现了 MAVLink 消息接收和解析&#xff0c;显示无人机状态&#xff0c;给无人机发送消息&#xff0c;实现一键起飞&#xff0c;飞往指定地点&#xff0c;降落&#xff0c;返…

BBR 和 CUBIC 对长肥管道的不同反应

有个关于 CUBIC(等一众 AIMD-based cc) 和 BBR 在长肥管道中的行为比较挺有趣&#xff0c;它们的表现竟然截然相反&#xff1a; CUBIC 流共存&#xff0c;RTT 越大&#xff0c;Goodput 越低&#xff1b;BBR 流共存&#xff0c;RTT 越大&#xff0c;Goodput 越高。 前一个被看…

架构师面试(十九):IM 架构

问题 IM 系统从架构模式上包括 【介绍人模式】和 【代理人模式】。介绍人模式也叫直连模式&#xff0c;消息收发不需要服务端的参与&#xff0c;即客户端之间直连的方式&#xff1b;代理人模式也叫中转模式&#xff0c;消息收发需要服务端进行中转。 下面关于这两类模式描述的…

Spring框架入门指南:从Hello World到IOC容器

第一章&#xff1a;Spring框架的介绍 1. Spring框架的概述 Spring是一个开放源代码的设计层面框架&#xff0c;它解决的是业务逻辑层和其他各层的松耦合问题&#xff0c;因此它将面向接口的编程思想贯穿整个系统应用。 Spring是于2003 年兴起的一个轻量级的Java开发框架&…

嵌入式电路设计软件个人安装步骤分享

各位小伙伴大家好,今天给大家分享一个,电路设计软件的安装方法,希望对大家有所帮助。 一、下载【Multisim14.0安装包】: 链接:夸克网盘分享 提取码:kHSP 电脑安装Multisim14.0并且汉化 准备安装包以及汉化包双击“NI_Circuit_Design_Suite_14_0【海量免费资源:kebaiwan…