Opencv学习项目3——人脸识别

news2024/11/15 19:49:41

之前我们获取了一张图像的人脸信息,现在我们来使用特征点分析来匹配两张lyf照片的相似度

获取两张图片的人脸信息

import cv2
import face_recognition

# 加载图像文件
img1 = face_recognition.load_image_file('lyf1.png')
img2 = face_recognition.load_image_file('lyf2.png')
# 将图像从 BGR 格式转换为 RGB 格式
img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)
img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)
# 第一个人的人脸位置信息
faceloc1 = face_recognition.face_locations(img1)[0]
faceloc2 = face_recognition.face_locations(img2)[0]
#框出人脸
cv2.rectangle(img1, (faceloc1[3], faceloc1[0]), (faceloc1[1], faceloc1[2]), (0, 255, 0), 3)
cv2.rectangle(img2, (faceloc2[3], faceloc2[0]), (faceloc2[1], faceloc2[2]), (0, 255, 0), 3)

#打印人脸位置信息
print(faceloc1)
print(faceloc2)

cv2.imshow('lyf1', img1)
cv2.imshow('lyf2', img2)
cv2.waitKey(0)

效果如下

然后接下来我们使用face_encodings来进行提取人脸特征编码,首先我们先对这个函数进行一下介绍

face_encodings函数

face_recognition.face_encodings() 是 face_recognition 库中的一个函数,用于从图像中提取人脸的特征编码。这些编码是对人脸图像的数值化描述,可以用来比较不同人脸之间的相似度,从而进行人脸识别或验证。

face_encodings(face_image, known_face_locations=None, num_jitters=1)

  • face_image: 必须是一个RGB图像(numpy数组),即使是从OpenCV加载的图像也需要先转换为RGB格式。

  • known_face_locations: 可选参数,指定人脸位置的列表。每个位置是一个包含四个整数的元组 (top, right, bottom, left),代表人脸框的坐标。如果不提供此参数,函数将自动检测图像中的所有人脸。

  • num_jitters: 可选参数,默认为1。用于增加对每个人脸提取特征时的采样次数,以获得更稳定的编码。较大的值可能会提高准确性,但会增加计算成本。

  • 返回值:

    该函数返回一个包含每个检测到的人脸编码的列表。每个编码是一个128维的numpy数组,描述了人脸在128维空间中的位置关系和特征。

face_recognition.face_encodings() 可以结合 face_recognition.face_locations() 使用,以便首先检测人脸位置,然后提取这些位置上的人脸编码。

人脸编码是一个具有良好特性的向量,可以用于比较两张人脸图像的相似度。通常,人脸编码越相似,它们之间的距离(如欧氏距离)越小。

该函数在进行人脸识别、人脸验证和人脸聚类等任务时非常有用。

这样我们使用faceloc1 = face_recognition.face_locations(img1)[0]

face_encoding1 = face_recognition.face_encodings(img1, [faceloc1])[0]

这里就表示获取第一个人脸的特征编码

img1 = face_recognition.load_image_file('lyf1.png')
img2 = face_recognition.load_image_file('lyf2.png')
# 将图像从 BGR 格式转换为 RGB 格式
img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)
img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)
# 第一个人的人脸位置信息
faceloc1 = face_recognition.face_locations(img1)[0]
faceloc2 = face_recognition.face_locations(img2)[0]
# 提取人脸编码
face_encoding1 = face_recognition.face_encodings(img1, [faceloc1])[0]
face_encoding2 = face_recognition.face_encodings(img2, [faceloc2])[0]

下面我们使用compare_faces来对比两个图片人脸的相似度,介绍一下这个函数

compare_faces函数

face_recognition.compare_faces([face_encoding1], face_encoding2) 是一个用于人脸比对的函数,通常用于人脸识别任务中。这个函数接受两个参数:

  • face_encoding1: 表示第一个人脸的编码,通常是一个128维的向量,用于表示人脸的特征。
  • face_encoding2: 表示第二个人脸的编码,同样是一个128维的向量。

函数的作用是比较这两个人脸编码,判断它们是否来自同一个人脸。具体来说,它会计算这两个人脸编码之间的欧氏距离(Euclidean distance),如果距离小于一个阈值(一般来说是0.6),就认为这两个人脸是同一个人,返回True;否则返回False。

import cv2
import face_recognition

# 加载图像文件
img1 = face_recognition.load_image_file('lyf1.png')
img2 = face_recognition.load_image_file('lyf2.png')
# 将图像从 BGR 格式转换为 RGB 格式
img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)
img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)
# 第一个人的人脸位置信息
faceloc1 = face_recognition.face_locations(img1)[0]
faceloc2 = face_recognition.face_locations(img2)[0]
# 提取人脸编码
face_encoding1 = face_recognition.face_encodings(img1, [faceloc1])[0]
face_encoding2 = face_recognition.face_encodings(img2, [faceloc2])[0]
#框出人脸
cv2.rectangle(img1, (faceloc1[3], faceloc1[0]), (faceloc1[1], faceloc1[2]), (0, 255, 0), 3)
cv2.rectangle(img2, (faceloc2[3], faceloc2[0]), (faceloc2[1], faceloc2[2]), (0, 255, 0), 3)
#比对人脸特征
res = face_recognition.compare_faces([face_encoding1],face_encoding2)
print(res)
#打印人脸位置信息
# print(faceloc1)
# print(faceloc2)

cv2.imshow('lyf1', img1)
cv2.imshow('lyf2', img2)
cv2.waitKey(0)

效果如下

这里可以看见,打印了True,说明为同一个人

到这里就完成了对两个人脸的比对,感兴趣的可以关注一下,谢谢

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

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

相关文章

昇思25天学习打卡营第13天 | 模型训练

深入理解模型训练的关键步骤 在深入学习深度学习模型训练的过程中,我获得了宝贵的经验和理解,尤其是在构建数据集、定义模型、调整超参数以及实际的训练和评估过程中。以下是我对这些关键步骤的一些心得体会。 1. 构建数据集 数据集的构建是模型训练成…

(11)Python引领金融前沿:投资组合优化实战案例

1. 前言 本篇文章为 Python 对金融的投资组合优化的示例。投资组合优化是从一组可用的投资组合中选择最佳投资组合的过程,目的是最大限度地提高回报和降低风险。 投资组合优化是从一组可用的投资组合中选择最佳投资组合的过程,目的是最大限度地提高回报…

第四周:机器学习笔记

第四周学习周报 摘要Abstract机器学习任务攻略1.loss on training data1.1 training data的loss过大怎么办?1.2 training data的loss小,但是testing data loss大怎么办? 2. 如何选择一个中最好的模型?2.1 Cross Validation&#x…

前端调试技巧:动态高亮渲染区域

效果: 前端界面的渲染过程、次数,会通过高亮变化来显示,通过这种效果排除一些BUG 高亮 打开方式 F12进入后点击ESC,进入rendering,选择前三个即可(如果没有rendering,点击橘色部分勾选上&…

docker compose 容器 编排分组

遇到问题:执行docker compose up -d 后docker compose 创建的容器们 在desktop-docker 中都在docker下一堆 搜索想着能不能把这个docker名字改一下,但是都没有找到这样的一个方案; 最后发现,我执行docker compose up -d 命令所在…

昇思25天学习打卡营第26天 | GAN图像生成

学习心得:GAN 图像生成 在最近完成的项目中,我利用生成对抗网络(GAN)进行了图像生成的实践学习。通过这一过程,我不仅加深了对GAN的理解,而且对于深度学习在图像处理领域的应用有了更实际的把握。以下是我…

Android屏幕适配度量单位px、ppi、dpi、dp、sp等

目录 0 前言1 屏幕尺寸2 像素 px3 分辨率4 每英寸像素数ppi5 屏幕密度 dpi6 密度无关像素 dp7 缩放无关像素sp 0 前言 我以iphone13举例,说来挺有意思,我们这做Android开发的只有一位平常用的是Android手机。 可以看到下面有6.1英寸、分辨率、ppi等。接…

MQTT micro-ROS:构建高效的机器人应用

什么是 micro-ROS? 在之前的 MQTT & FreeRTOS:打造你的远程控制实时应用 中,我们介绍了如何在 FreeRTOS 中构建你的 MQTT 应用。 FreeRTOS 主要应用在对实时性要求较高的场景中,但这类 RTOS 专注于提供实时任务调度和同步机…

使用Vuepress搭建个人网站

网站地址:bloggo.chat

GraphRAG参数与使用步骤 | 基于GPT-4o-mini实现更便宜的知识图谱RAG

首先给兄弟朋友们展示一下结论,一个文本18万多字,txt文本大小185K,采用GraphRAG,GPT-4o-mini模型,索引耗时差不多5分钟,消耗API价格0.15美元 GraphRAG介绍 GraphRAG是微软最近开源的一款基于知识图谱技术的框架&#…

新版SpringSecurity5.x使用与配置

目录 一、了解SpringSecurity 1.1 什么是Spring Security? 1.2 Spring Security功能 1.3 Spring Security原理 1.4 RABC (Role-Based Access Control) 二、SpringSecurity简单案例 2.1 引入SpringSecurity依赖 2.2 创建一个简单的Controller 三、SpringSecu…

【数据结构】初识集合框架

🎇🎉🎉🎉点进来你就是我的人了 博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 人生格言: 当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友…

自己编写一个谷歌浏览器插件, 模拟某音直播间自动发消息

闲来没事, 做个插件玩一玩,于是一顿学习。 按照浏览器插件规范,一顿代码编写, 搞了一个简单的插件。仅做学习。 可以实现在直播间自动发消息。 定时轮发。 实现原理: 利用谷歌popub.js 发送消息。 在content-script.…

【无人机】低空经济中5G RedCap芯片的技术分析报告

1. 引言 图一. 新基建:低空经济 低空经济作为一种新兴的经济形态,涵盖了无人机、电动垂直起降飞行器(eVTOL)、低空物流、空中交通管理等多个领域。随着5G网络的普及和演进,5G RedCap(Reduced Capability&a…

【功能】DOTween动画插件使用

一、下载安装DOTween插件,下载地址:DOTween - Asset Store (unity.com) 使用 Free免费版本即可,导入成功后,Project视图中会出现 DOTween 文件夹 二、使用案例 需求1:控制材质球中的某个属性值,实现美术需…

MS17-010漏洞复现+利用

1、 漏洞简述 漏洞名称:“永恒之蓝”漏洞 漏洞编号:MS17-010,CVE-2017-0143/0144/0145/0146/0147/0148 漏洞类型:缓冲区溢出漏洞 漏洞影响:信息泄露 CVSS评分:9.3(High) 利用难…

ABAP使用SQL直接更新数据库与使用IN UPDATE TASK的区别

1. 背景 刚接触ABAP的小伙伴常常会有这样的疑问,为什么不直接使用Open SQL直接更新数据库,而要把对DB的操作封装到IN UPDATE TASK中呢? 对于这个问题,比较常见的解释是,IN UPDATE TASK的方式会保证数据更新的一致性。…

HTML零基础自学笔记(上)-7.18

HTML零基础自学笔记(上) 参考:pink老师一、HTML, Javascript, CSS的关系是什么?二、什么是HTML?1、网页,网站的概念2、THML的基本概念3、THML的骨架标签/基本结构标签 三、HTML标签1、THML标签介绍2、常用标签图像标签&#xff…

09 B端产品业务调研的分析框架(2)

产品经理要有建立从企业全局的视角去分析业务的思维模式和习惯,面对不熟悉的复杂业务,可参考下面业务分析架构图进行分析: 业务分析框架图 战略层 战略:价值方案和计划。 使命:公司因何而存在。 愿景:公…

R语言画散点图-饼图-折线图-柱状图-箱线图-等高线图-曲线图-热力图-雷达图-韦恩图(三D)

R语言画散点图-饼图-折线图-柱状图-箱线图-等高线图-曲线图-热力图-雷达图-韦恩图(三D) 散点图使用 plotly 包示例解析效果 使用 scatterplot3d 包示例解析效果 饼图使用 plotly 包示例解析效果 使用 plotrix 包示例解析效果 折线图使用 plotly 包示例解…