当前位置: 首页 > news >正文

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

之前我们获取了一张图像的人脸信息,现在我们来使用特征点分析来匹配两张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.lryc.cn/news/404520.html

相关文章:

  • 【js自学打卡11】生成器函数(generator函数)的使用总结+代码举例
  • 深入了解jdbc-02-CRUD
  • 《基于 Kafka + Quartz 实现时限质控方案》
  • 浏览器的卡顿与react的解决思路
  • XXE:XML外部实体引入
  • 3D培训大师创新培训体验,加速空调关键组件的高效精准安装
  • PyTorch 深度学习实践-循环神经网络(高级篇)
  • 这才是老板喜欢的电子信息类简历
  • MySQL学习之事务,锁机制
  • 开源知识付费小程序源码 内容付费系统php源码 含完整图文部署教程
  • 时序数据库如何选型?详细指标总结!
  • 【前端】JavaScript入门及实战51-55
  • 【引领未来智造新纪元:量化机器人的革命性应用】
  • 山东航空小程序查询
  • MySQL添加索引时会锁表吗?
  • 算法日记day 16(二叉树的广度优先遍历|反转、对称二叉树)
  • PolarisMesh源码系列--Polaris-Go注册发现流程
  • vue3 vxe-grid修改currentPage,查询数据的时候,从第一页开始查询
  • 电商数据集成之电商商品信息采集系统架构设计||电商API接口
  • Spring Cloud Stream 实现统一消息通信平台
  • uniapp安卓plus原生选择系统文件
  • Go语言 Import导入
  • 一款异次元小清新风格的响应式wordpress个人博客主题
  • 【cocos creator】ts中export的模块管理
  • QT JSON使用实例
  • 浅聊 Three.js 屏幕空间反射SSR-SSRShader
  • Windows图形界面(GUI)-DLG-C/C++ - 月历控件(MonthCalendar)
  • 【Langchain大语言模型开发教程】基于文档问答
  • 大厂面试-基本功
  • RV1103使用rtsp和opencv推流视频到网页端