Python | 人脸识别系统 — 人脸比对 代码部分

本博客为人脸识别系统的人脸比对代码解释

人脸识别系统博客汇总:人脸识别系统-博客索引

项目GitHub地址:Su-Face-Recognition: A face recognition for user logining

注意:阅读本博客前请先参考以下博客

工具安装、环境配置:人脸识别系统-简介

UI界面设计:人脸识别系统-UI界面设计

UI事件处理:人脸识别系统-UI事件处理

摄像头展示画面:人脸识别系统-摄像头画面展示

一、关键代码

  • load_image_file —— 加载要识別的人脸图像

    • 加载要识別的人脸图像,加载返回的数据是 Numpy 数組,记录了图片的所有像素的特征向量。

  • face_locations —— 定位图中所有的人脸的像素位置   
    • 返回值是一个列表形式。列表中每一个元素是一张人脸的位置信息,包括[top, right, bottom, left]。
  • face_encodings —— 获取图像文件中所有面部编码信息
    • 返回值是一个编码列表,参数仍然是要识别的图像对象,如果后续访问时需要加上索引或遍历进行访问,每张人脸的编码信息为一个128维向量。
  • face_encodings —— 获取图像文件中所有面部编码信息
    • 返回值是一个编码列表,参数仍然是要识别的图像对象,如果后续访问时需要加上索引或遍历进行访问,每张人脸的编码信息为一个128维向量。
    • 第一个参数是一个面部编码列表(很多张脸), 第二个参数是给出单个面部编码(一张脸), compare_faces 会将第二个参数中的编码信息与第一个参数中的所有编码信息依次匹配,返回值是一个布尔列表,匹配成功则返回 True,匹配失败则返回 False,顺序与第一个参数中脸部编码顺序一致。
    • 参数 tolerance 为识别阈值,默认值是 0.39。tolerance 值越小,匹配越严格。
    def compare_face(self):
        if self.imgA_path == "":
            QMessageBox.information(self, "提示", self.tr("请先导入照片一"))
        elif self.imgB_path == "":
            QMessageBox.information(self, "提示", self.tr("请先导入照片二"))
        else:
            imgA = face_recognition.load_image_file(self.imgA_path)
            imgB = face_recognition.load_image_file(self.imgB_path)
            try:
                A_face_encoding = face_recognition.face_encodings(imgA)[0]
                B_face_encoding = face_recognition.face_encodings(imgB)[0]
                known_faces = [A_face_encoding]
                results = face_recognition.compare_faces(known_faces, B_face_encoding)[0]
                if results:
                    QMessageBox.information(self, "提示", self.tr("两张图片为同一个人"))
                else:
                    QMessageBox.information(self, "提示", self.tr("两张图片为两个不同的人"))
            except IndexError:
                QMessageBox.information(self, "提示", self.tr("图片导入失败,请重新导入图片!"))
                quit()

  更多关于人脸识别库face_recognition基础使用教程请参考:face_recognition GitHub

二、其余代码

# 人脸比对界面
class FaceCompareWindow(QMainWindow, FaceCompareUi):
    def __init__(self):
        super(FaceCompareWindow, self).__init__()
        self.setupUi(self)

        self.imgA_path = ""
        self.imgB_path = ""
        self.imgB = None
        self.imgA = None

        self.img_a_button.clicked.connect(self.open_imgA)
        self.img_b_button.clicked.connect(self.open_imgB)
        self.compare_button.clicked.connect(self.compare_face)
        self.close_button.clicked.connect(self.close_window)

    def open_imgA(self):
        imgA_path, fileType = QtWidgets.QFileDialog.getOpenFileName(self, "选取文件", os.getcwd(),
                                                                    "All Files(*);;Text Files(*.txt)")
        if not imgA_path.endswith('jpg') | imgA_path.endswith('png'):
            QMessageBox.about(self, '提示', '请选择jpg或者png类型图片')
        else:
            # 如果使用 cv2.imread 不能导入中文路径
            imgA = cv2.imdecode(np.fromfile(imgA_path, dtype=np.uint8), -1)
            frame_location = face_recognition.face_locations(imgA)
            if len(frame_location) == 0:
                QMessageBox.information(self, "提示", self.tr("没有检测到人脸,请重新导入图片!"))
            else:
                QApplication.processEvents()
                self.imgA = imgA
                self.imgA_path = imgA_path
                show = cv2.resize(imgA, (221, 261))  # 截取图片
                show = cv2.cvtColor(show, cv2.COLOR_BGR2RGB)  # 显示原图
                showImage = QImage(show.data, show.shape[1], show.shape[0], show.shape[1] * 3, QImage.Format_RGB888)
                self.img_a_show.setPixmap(QPixmap.fromImage(showImage))
                self.img_a_path.setText(imgA_path)

    def open_imgB(self):
        imgB_path, fileType = QtWidgets.QFileDialog.getOpenFileName(self, "选取文件", os.getcwd(),
                                                                    "All Files(*);;Text Files(*.txt)")
        if not imgB_path.endswith('jpg') | imgB_path.endswith('png'):
            QMessageBox.about(self, '提示', '请选择jpg或者png类型图片')
        else:
            imgB = cv2.imdecode(np.fromfile(imgB_path, dtype=np.uint8), -1)
            frame_location = face_recognition.face_locations(imgB)
            if len(frame_location) == 0:
                QMessageBox.information(self, "提示", self.tr("没有检测到人脸,请重新导入图片!"))
            else:
                QApplication.processEvents()
                self.imgB = imgB
                self.imgB_path = imgB_path
                show = cv2.resize(imgB, (221, 261))
                show = cv2.cvtColor(show, cv2.COLOR_BGR2RGB)
                showImage = QImage(show.data, show.shape[1], show.shape[0], show.shape[1] * 3, QImage.Format_RGB888)
                self.img_b_show.setPixmap(QPixmap.fromImage(showImage))
                self.img_b_path.setText(imgB_path)

    def compare_face(self):
        if self.imgA_path == "":
            QMessageBox.information(self, "提示", self.tr("请先导入照片一"))
        elif self.imgB_path == "":
            QMessageBox.information(self, "提示", self.tr("请先导入照片二"))
        else:
            imgA = face_recognition.load_image_file(self.imgA_path)
            imgB = face_recognition.load_image_file(self.imgB_path)
            try:
                A_face_encoding = face_recognition.face_encodings(imgA)[0]
                B_face_encoding = face_recognition.face_encodings(imgB)[0]
                known_faces = [A_face_encoding]
                results = face_recognition.compare_faces(known_faces, B_face_encoding)[0]
                if results:
                    QMessageBox.information(self, "提示", self.tr("两张图片为同一个人"))
                else:
                    QMessageBox.information(self, "提示", self.tr("两张图片为两个不同的人"))
            except IndexError:
                QMessageBox.information(self, "提示", self.tr("图片导入失败,请重新导入图片!"))
                quit()

    def close_window(self):
        self.img_a_show.setText("照片一")
        self.img_b_show.setText("照片二")
        self.img_a_path.setText("")
        self.img_b_path.setText("")
        self.imgA_path = ""
        self.imgB_path = ""
        self.imgB = None
        self.imgA = None
        self.close()

阅读完本博客后可以继续阅读:

摄像头画面展示:人脸识别系统-摄像头画面展示

用户端逻辑:

  • 人脸识别:Python | 人脸识别系统 — 人脸识别
  • 活体检测:Python | 人脸识别系统 — 活体检测
  • 背景模糊:Python | 人脸识别系统 — 背景模糊
  • 姿态检测:Python | 人脸识别系统 — 姿态检测
  • 用户操作:Python | 人脸识别系统 — 用户操作

管理员端逻辑:

  • 管理员操作:
  • 用户操作:

 注:以上代码仅为参考,若需要运行,请参考项目GitHub完整源代码:Su-Face-Recognition: A face recognition for user logining

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C/C++的命名空间和调用函数的详细讲解

目录 空函数 调用函数 调用 执行流程 命名空间 在创建函数时,必须编写其定义。所有函数定义包括以下组成部分: 名称:每个函数都必须有一个名称。通常,适用于变量名称的规则同样也适用于函数名称。形参列表:调用函…

手机摄影笔记(二)

第5章 镜头语言 镜头语言分类(8个): 推:从远到近 拉:从近到远 摇:机位固定,旋转手机拍全景或者跟着拍摄对象进行摇摄(跟摇).通常用此方式来介绍环境时,表现的…

开放原子训练营(第三季)inBuilder低代码开发实验室---报销单录入系统

作为一名低代码初学者,我使用inBuilder系统设计了一款报销单录入系统,实现了报销单录入与显示报销单列表的功能(如图1与图2所示),并获得了很多开发心得。从inBuilder系统的优点、缺点以及开发过程三方面出发&#xff0…

基于SpringBoot,vue的家政服务平台的设计与实现

背景 以往的家政服务管理平台的管理,一般都是纸质文件来管理家政服务信息,传统的管理方式已经无法满足现代人们的需求;使用家政服务管理平台, 首先可以大幅提高家政服务信息检索,只需输入家政服务相关信息就能在数秒内反馈想要的…

JavaScript学习(一)

一、JavaScript的背景及知识结构 1、三个问题 什么是JavaScript?JavaScript能干什么?JavaScript是由什么构成的?怎样学习JavaScript? 2、什么是JavaScript? ①JavaScript是一种轻量级的编程语言;借鉴了J…

【SSA-LSTM】基于麻雀算法优化LSTM 模型预测研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

C#_Struct与Class的差异

简述 struct属于值类型,class属于引用类型 存储地址 struct储存于栈,class储存于堆(class于栈中储存引用) 传参性质 struct属于值传递,在函数内对参数进行修改,不会修改struct class处于引用传递&…

行为型模式-状态模式

状态模式 概述 【例】通过按钮来控制一个电梯的状态,一个电梯有开门状态,关门状态,停止状态,运行状态。每一种状态改变,都有可能要根据其他状态来更新处理。例如,如果电梯门现在处于运行时状态&#xff0…

MySQL

关系型数据库 数据结构:二维表格 库 -> 表 -> 列(字段):用来描述对象的一个属性 -> 行(记录):用来描述一个对象的信息 市面上:MySQL 、Mariadb 、PostgreSQL 、 Oracle&a…

汽车电路图、原理框图、线束图、元器件布置图的识读技巧与要点

摘要: 想要读懂汽车电路图就必须把电的通路理清楚,即某条线是什么信号,该信号是输入信号、输出信号还是控制信号以及信号起什么作用,在什么条件下有信号,从哪里来,到哪里去。 一、汽车电路图的识读技巧 1.…

在 Python 中将 Tqdm 与 Asyncio 结合使用

动动发财的小手,点个赞吧! 简介 困扰 在 Python 中使用并发编程来提高效率对于数据科学家来说并不罕见。在后台观察各种子进程或并发线程以保持我的计算或 IO 绑定任务的顺序总是令人满意的。 但是还有一点困扰我的是,当我在后台并发处理成百…

PBDB Data Service:Thumbnail images of lifeforms(生命形式的缩略图)

Thumbnail images of lifeforms(生命形式的缩略图) 描述用法参数方法响应值格式术语表 描述 此操作返回表示指定分类的图像,或关于图像的信息。如果后缀是 .png,则返回图像内容数据。否则,将以指定的格式返回一个描述…

9:00进去,9:05就出来了,这问的也太···

从外包出来,没想到死在另一家厂子了。 自从加入这家公司,每天都在加班,钱倒是给的不少,所以也就忍了。没想到8月一纸通知,所有人不许加班,薪资直降30%,顿时有吃不起饭的赶脚。 好在有个兄弟内推…

【Halcon】新建程序 读取图片 路径设置

文章目录 1 新建程序2 读取一张图片3 图片路径4 图片格式读取报错5 快速添加 绝对路径1 新建程序 点击新程序图标,即可新建; 程序另存为,会弹出保存路径 2 读取一张图片 read_image(Image,fabrik)

软件测试工程师的核心竞争力究竟是什么?

对于测试员而言,了解自己岗位的核心竞争力是非常重要的。在职业初期,许多人认为掌握代码才是软件测试的核心竞争力,但是随着经验的增加,我们会发现真正的核心竞争力是由多个方面组成的。 首先,测试人员需要具备良好的测…

Windows环境安装Elasticsearch和Kibana

文章目录 1 Elasticsearch1.1 下载1.2 解压并添加环境变量1.3 访问1.4 cmd命令1.5 中文分词器1.5.1 下载1.5.2 安装1.5.2.1 命令安装1.5.2.2 手动安装1.5.2.3 验证分词 1.6 使用curl批量导入 2 安装 kibana2.1 下载kibana2.2 中文界面2.3 操作索引2.3.1 增加索引2.3.1.1 单条新…

Apache Doris学习记录

1. Doris基础学习 中文官网:https://doris.apache.org/zh-CN/docs/dev/summary/basic-summary/ 1.1 doris 简介 Apache Doris 是一个现代化的 MPP(Massively Parallel Processing,即大规模并行处理) 分析型数据库产品 亚秒级响应时间即可获得查询结果 可以支持 10PB…

紧急下架,AI以假乱真学明星唱歌;哈佛法学院专家谈AI和版权法

几周前,一首据称由 Drake 和 The Weeknd 创作的新歌登陆 TikTok 和 Spotify,并迅速在互联网上像野火一样传播开来。“我袖子上的心”在嘻哈乐迷中获得了好评如潮和高度兴奋,这不仅是因为该曲目具有感染力的歌词和旋律,而且还因为对…

jieba分词(1):入门案例

1 场景介绍 大数据量的查询问题 假设我们要从商品的表里面查询一个商品 我们的数据库里面肯定有个t_goods的表,我们现在利用商品的名称做模糊查询 1.1 对于数据库的查询的 select * from t_goods where goodsName like “%手机%” ; 问题: 这个查询…

开关电源基础01:电源变换器基础(2)

说在开头:关于德布罗意的电子波(3) 1923年,德布罗意在求出他的相波之前,康普顿刚好用光子说解释了康普顿效应(记性好的胖友们应该还记得:散射波的波长变长问题),从而带领…
最新文章