一个简单的人脸识别demo
使用face_recognition和OpenCV库完成人脸检测和识别任务:
# 导入必要的库
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() # 关闭所有窗口
代码解析及行作用说明:
-
库导入
import cv2 import face_recognition import numpy as npcv2:OpenCV库,用于图像处理和显示face_recognition:基于dlib的人脸识别库numpy:数值计算库,处理数组数据
-
加载并编码已知人脸
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:提取人脸的特征编码(返回列表,取第一个元素)
-
创建已知人脸数据库
known_face_encodings = [jobs_encoding, gates_encoding] known_face_names = ["Steve Jobs", "Bill Gates"]- 存储已知人脸的编码和对应的姓名
-
处理待识别图片
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格式)
-
检测并编码未知人脸
face_locations = face_recognition.face_locations(unknown_image_rgb) face_encodings = face_recognition.face_encodings(unknown_image_rgb, face_locations)face_locations:检测图片中所有人脸的位置(返回坐标列表)face_encodings:提取每张人脸的特征编码
-
人脸识别与匹配
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:找到最相似人脸的索引
-
绘制识别结果
cv2.rectangle(unknown_image, (left, top), (right, bottom), (0, 255, 0), 2) cv2.putText(unknown_image, name, (left, top - 10), ...)- 用绿色矩形框标记人脸位置
- 在人脸框上方显示识别出的姓名
-
显示结果图像
cv2.imshow('Face Recognition', unknown_image) cv2.waitKey(0) cv2.destroyAllWindows()- 显示处理后的图片
- 等待用户按键后关闭窗口
详细解析
-
安装依赖库
pip install opencv-python pip install face-recognition -
准备图片
- 创建文件夹结构:
├── known_people/ │ ├── jobs.jpg │ └── gates.jpg └── unknown_person/└── test.jpg - 图片建议使用正面清晰的人脸照片
- 创建文件夹结构:
-
运行代码
- 将代码中的图片路径替换为实际路径
- 直接运行Python脚本
工作原理
- 人脸编码:将人脸转换为128维的特征向量
- 特征比对:通过计算欧氏距离比较人脸相似度
- 阈值判断:默认距离小于0.6则认为匹配(可通过
tolerance参数调整)
扩展方向
- 添加实时摄像头识别功能
- 增加人脸数据库规模
- 添加人脸识别置信度显示
- 集成到Web应用中
相关文章:
一个简单的人脸识别demo
使用face_recognition和OpenCV库完成人脸检测和识别任务: # 导入必要的库 import cv2 # OpenCV库,用于图像处理 import face_recognition # 人脸识别库 import numpy as np # 数值计算库# 步骤1:加载已知人脸的图片并编码 # 加载乔布斯的…...
SpringDoc和Swagger使用
目录 一、SpringDoc 1.添加依赖 2.配置代码 配置解释 (1)springdoc.api-docs.path (2)springdoc.swagger-ui.path (3)springdoc.swagger-ui.operationsSorter (4)springdoc.…...
RestTemplate和RPC区别
RestTemplate是Spring框架中用于进行RESTful风格的HTTP请求的模板类,通常用于与外部服务进行通信。它基于HTTP协议,使用GET、POST、PUT、DELETE等HTTP方法来进行通信,传输的数据通常使用JSON或XML格式。它是一种基于资源的通信方式࿰…...
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上开源的项目ÿ…...
Vue3中router最佳封装落地
文章目录 前言一、拆分路由文件夹?二、main.ts中注册路由总结 前言 router在使用过程中如果我们直接在一个文件的一个数组中配置,最后路由越来越多会导致不易管理,我们可以将一个页面的路由配置在一个数组中最后统一导入,这样就会…...
MySQL Router被HTTP流量击穿
## MySQL Router被HTTP流量击穿 #莫名奇妙的问题,谁让客户把Router放公网呢?除了被挖矿,还能被HTTP流量攻击。 1、日志信息 rootubuntu:/mysql# terminate called after throwing an instance of ‘mysqlrouter: :URIErrorwhat(): inval…...
网络爬虫【爬虫库request】
我叫不三不四,很高兴见到大家,欢迎一起学习交流和进步 今天来讲一讲爬虫 Requests是Python的一个很实用的HTTP客户端库,完全满足如今网络爬虫的需求。与Urllib对比,Requests不仅具备Urllib的全部功能;在开发使用上&…...
如何使用jenv工具管理多个JDK版本
一、jenv到底是干啥的? 简单来说,jenv就是专门用来管理多个Java版本的工具。不管是开发、测试,还是生产环境,只要你需要在同一台机器上用不同的Java版本,它都能帮上大忙。比如说,项目A要求JDK 8࿰…...
如何彻底解决Docker Desktop中Kubernetes无法启动问题
我们时常会遇到Kubernetes启动提示如下报错信息: {"message":"starting kubernetes: pulling images: pulling from host: pulling tag \"registry.k8s.io/etcd:3.5.16-0\": Error response from daemon: .Log in with your Docker ID or…...
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系统,…...
Selenium Web UI自动化测试:从入门到实战
引言 在当今快速迭代的软件开发周期中,自动化测试已成为保障产品质量、提升测试效率的核心手段之一。而针对Web应用的UI自动化测试,Selenium作为最流行的开源工具之一,凭借其跨浏览器、多语言支持(Python、Java、C#等)…...
【实战指南】用MongoDB存储文档和图片等大文件(Java实现)
一、前言 在现代应用开发中,经常需要处理和存储大量的文档、图片等大文件。传统的关系型数据库在处理这类大文件时,往往会面临性能瓶颈、存储成本高等问题。而 MongoDB 作为一款流行的 NoSQL 数据库,提供了 GridFS 规范,能够很好地解决大文件存储的问题。GridFS 可以将大文…...
Jetpack Compose 显示时间
Jetpack Compose 显示时间 介绍主体代码使用 介绍 在软件中实时显示时间 主体代码 import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStat…...
vue3中,通过获取路由上的token直接进入首页,跳过登录页面
1.需求 A系统想快速进入到B系统,但又不想输入账号密码,A系统的token与B系统共用token,因此在访问B系统就会在路径上携带token(https://magictool-box.com/login?token《token》),通过token直接进入B系统首…...
软考通关利器:中级软件设计师结构化开发核心考点
简介: 作为国家软考中级认证的核心科目,“软件设计师” 结构化开发能力是职业进阶的黄金敲门砖。本模块聚焦考试大纲高频考点,深度解析需求建模、结构化分析方法(SA/SD)、模块设计原则、数据流图(DFD&#…...
[思考记录]两则:宏观视角、理想化
#宏观视角# 昨天听金老师讲解了他初步整理的大模型宏观概念关系图,受益不少。图上不仅是涵盖了诸多概念,更厉害的应该在于把概念之间的关系进行了描述,更直观展现了概念是如何与其他概念相互作用的。帮助从整体的角度去理解,以及透…...
MySQL 性能优化方向
MySQL 性能优化是一个系统性的工作,涉及数据库设计、查询优化、索引优化、硬件配置等多个方面。以下是 MySQL 性能优化的主要方向和具体优化方案: 一、数据库设计优化 1. 合理设计表结构 规范化设计:避免数据冗余,确保数据一致性。适度反规范化:在查询频繁的场景下,适当…...
3-22 vector的使用详解---STL C++
C中的vector容器展开系统讲解,具体内容如下: 1. vector的定义和特性(基础概念) 讲解vector作为动态数组的核心特性:自动内存管理、动态扩容机制(倍增策略)对比普通数组:支持随机访…...
Collectors.toList / list 转 list
前言 略 Collectors.toList List<User> userList ...; List<Long> userIdList userList.stream().map(User::getUserId).collect(Collectors.toList());...
uniapp 和 webview 之间的通信
1.背景 应用使用了uniapp开发跨端应用,在uniapp中内嵌webview页面实现页面热更新效果,不需要用户单独重新安装软件即可实现页面的版本更新。 2.webview通知uniapp 在开发过程中我们难会遇到需要uniapp和webview来实现数据通信的场景,接下来…...
【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 …...
【Java】深入了解下Java Bitset
【Java】深入了解下Java Bitset 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战 目录 【Java】深入了解下Java Bitset引言如果Java Bitset不是布尔数组,那它是什么…...
Linux CentOS7 安装 ffmpeg教程
官网:FFmpeg 操作 先用uname -a 查看内核版本,如果是 3.2.0或者以上就可以按照此办法来安装 cd /tmp wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz# 2. 解压 tar xvf ffmpeg-release-amd64-static.tar.xz# 3. 将…...
楼宇自控系统的结构密码:总线与分布式结构方式的差异与应用
在现代建筑中,为了实现高效、智能的管理,楼宇自控系统变得越来越重要。它就像建筑的 智能管家,可自动控制照明、空调、通风等各种机电设备,让建筑运行更顺畅,还能节省能源成本。而在楼宇自控系统里,有两种关…...
Fourier-Lerobot——把斯坦福人形动作策略iDP3封装进了Lerobot(含我司七月人形研发落地实践)
前言 近期在抠lerobot源码时,看到其封装了ALOHA ACT、diffusion policy、π0时,我就在想,lerobot其实可以再封装下idp3 我甚至考虑是否从我联合带的那十几个具身研究生中选几个同学做下这事,对他们也是很好的历练然当25年3.18日…...
系统架构设计知识体系总结
1.技术选型 1.什么是技术选型? 技术选型是指评估和选择在项目或系统开发中使用的最合适的技术和工具的过程。这涉及考虑基于其能力、特性、与项目需求的兼容性、可扩展性、性能、维护和其他因素的各种可用选项。技术选型的目标是确定与项目目标相符合、能够有效解…...
计划管理工具应该具备的能(甘特图)
在当今快节奏的项目管理环境中,高效地规划和跟踪项目进度是至关重要的。甘特图,作为项目管理领域的经典工具,以其直观的时间轴和任务分配方式,深受项目管理者的青睐。 随着数字化时代的到来,甘特图线上编辑器应运而生&…...
简单实用!百度AI + Raphael AI = 免费生图
简单实用!百度AI Raphael AI 免费生图 --  第一步:下载或截取一些好看的图片当参考图片 第二步:用百度AI描述你想要的图片&…...
