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

人脸匹配——OpenCV

人脸匹配

    • 导入所需的库
    • 加载dlib的人脸识别模型和面部检测器
    • 读取图片并转换为灰度图
    • 比较两张人脸
    • 选择图片并显示结果
    • 比较图片
    • 创建GUI界面
    • 运行GUI主循环
    • 运行显示
    • 全部代码

导入所需的库

cv2:OpenCV库,用于图像处理。
dlib:一个机器学习库,用于人脸检测和特征点预测。
numpy:用于数值计算的库。
PILImageTk:用于处理图像和创建Tkinter兼容的图像对象。
filedialog:Tkinter的一个模块,用于打开文件对话框。
TkLabelButtonCanvas:Tkinter库的组件,用于创建GUI。

import cv2
import dlib
import numpy as np
from PIL import Image, ImageTk
from tkinter import filedialog
from tkinter import Tk, Label, Button, Canvas

加载dlib的人脸识别模型和面部检测器

使用dlib.get_frontal_face_detector()加载面部检测器。
使用dlib.shape_predictor()加载面部特征点预测模型。
使用dlib.face_recognition_model_v1()加载人脸识别模型。

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
face_rec = dlib.face_recognition_model_v1("dlib_face_recognition_resnet_model_v1.dat")

读取图片并转换为灰度图

读取图片并转换为灰度图。
使用面部检测器检测图像中的面部。
如果检测到多张或没有脸,则抛出异常。
提取面部特征点并计算人脸编码。

def get_face_encoding(image_path):img = cv2.imread(image_path)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)faces = detector(gray)if len(faces) != 1:raise ValueError("图片中检测到多张或没有脸")face = faces[0]shape = predictor(gray, face)face_encoding = np.array(face_rec.compute_face_descriptor(img, shape))return face_encoding

比较两张人脸

比较两个人脸编码。
计算两个编码之间的欧氏距离。
如果距离小于0.6,则认为它们是同一个人脸。

def compare_faces(face1, face2):distance = np.linalg.norm(face1 - face2)if distance < 0.6:return "相同人脸"else:return "不同人脸"

选择图片并显示结果

定义select_image1、select_image2和select_image3函数。
打开文件对话框让用户选择图片。
将选择的图片显示在相应的画布上。

def select_image1():global image1_path, image1image1_path = filedialog.askopenfilename()image1 = Image.open(image1_path)image1 = image1.resize((300, 300), Image.LANCZOS)  # 使用Image.LANCZOS替换ANTIALIASphoto1 = ImageTk.PhotoImage(image1)canvas1.create_image(0, 0, anchor='nw', image=photo1)canvas1.image = photo1def select_image2():global image2_path, image2image2_path = filedialog.askopenfilename()image2 = Image.open(image2_path)image2 = image2.resize((300, 300), Image.LANCZOS)  # 使用Image.LANCZOS替换ANTIALIASphoto2 = ImageTk.PhotoImage(image2)canvas2.create_image(0, 0, anchor='nw', image=photo2)canvas2.image = photo2def select_image3():global image3_path, image3image3_path = filedialog.askopenfilename()image3 = Image.open(image3_path)image3 = image3.resize((300, 300), Image.LANCZOS)  # 使用Image.LANCZOS替换ANTIALIASphoto3 = ImageTk.PhotoImage(image3)canvas3.create_image(0, 0, anchor='nw', image=photo3)canvas3.image = photo3

比较图片

定义compare_images1和compare_images2函数:
获取两个人脸编码并进行对比。
显示对比结果。

def compare_images1():try:face1 = get_face_encoding(image1_path)face2 = get_face_encoding(image2_path)result1 = compare_faces(face1, face2)result_label1.config(text=result1)except Exception as e:result_label1.config(text="发生错误: " + str(e))def compare_images2():try:face2 = get_face_encoding(image2_path)face3 = get_face_encoding(image3_path)result2 = compare_faces(face2, face3)result_label2.config(text=result2)except Exception as e:result_label2.config(text="发生错误: " + str(e))

创建GUI界面

设置窗口标题和大小。
创建画布来显示图片。
创建标签来显示对比结果。
创建按钮让用户选择图片和进行对比。

# 创建GUI
root = Tk()
root.title("人脸对比")
root.geometry("1000x620")# 创建画布来显示图片
canvas1 = Canvas(root, width=300, height=300, bg='white')
canvas1.pack(side='left', padx=10, pady=10)
canvas2 = Canvas(root, width=300, height=300, bg='white')
canvas2.pack(side='left', padx=10, pady=10)
canvas3 = Canvas(root, width=300, height=300, bg='white')
canvas3.pack(side='left', padx=10, pady=10)# 创建标签来显示结果
result_label1 = Label(root, text="")
result_label1.place(x=300, y=120)
result_label2 = Label(root, text="")
result_label2.place(x=640, y=120)# 创建按钮来选择图片
button1 = Button(root, text="选择第一张图片", command=select_image1)
button1.place(x=100, y=50)
button2 = Button(root, text="选择第二张图片", command=select_image2)
button2.place(x=450, y=50)
button3 = Button(root, text="选择第三张图片", command=select_image3)
button3.place(x=800, y=50)# 创建按钮来对比图片
compare_button1 = Button(root, text="对比图像12", command=compare_images1)
compare_button1.place(x=300, y=80)
compare_button2 = Button(root, text="对比图像23", command=compare_images2)
compare_button2.place(x=640, y=80)

运行GUI主循环

root.mainloop()

运行显示

在这里插入图片描述

全部代码

import cv2
import dlib
import numpy as np
from PIL import Image, ImageTk
from tkinter import filedialog
from tkinter import Tk, Label, Button, Canvas# 加载dlib的人脸识别模型和面部检测器
#使用dlib.get_frontal_face_detector()加载面部检测器,
# 使用dlib.shape_predictor()加载面部特征点预测模型,
# 使用dlib.face_recognition_model_v1()加载人脸识别模型
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
face_rec = dlib.face_recognition_model_v1("dlib_face_recognition_resnet_model_v1.dat")# 读取图片并转换为灰度图
def get_face_encoding(image_path):img = cv2.imread(image_path)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)faces = detector(gray)if len(faces) != 1:raise ValueError("图片中检测到多张或没有脸")face = faces[0]shape = predictor(gray, face)face_encoding = np.array(face_rec.compute_face_descriptor(img, shape))return face_encoding# 比较两张人脸
def compare_faces(face1, face2):distance = np.linalg.norm(face1 - face2)if distance < 0.6:return "相同人脸"else:return "不同人脸"# 选择图片并显示结果
def select_image1():global image1_path, image1image1_path = filedialog.askopenfilename()image1 = Image.open(image1_path)image1 = image1.resize((300, 300), Image.LANCZOS)  # 使用Image.LANCZOS替换ANTIALIASphoto1 = ImageTk.PhotoImage(image1)canvas1.create_image(0, 0, anchor='nw', image=photo1)canvas1.image = photo1def select_image2():global image2_path, image2image2_path = filedialog.askopenfilename()image2 = Image.open(image2_path)image2 = image2.resize((300, 300), Image.LANCZOS)  # 使用Image.LANCZOS替换ANTIALIASphoto2 = ImageTk.PhotoImage(image2)canvas2.create_image(0, 0, anchor='nw', image=photo2)canvas2.image = photo2def select_image3():global image3_path, image3image3_path = filedialog.askopenfilename()image3 = Image.open(image3_path)image3 = image3.resize((300, 300), Image.LANCZOS)  # 使用Image.LANCZOS替换ANTIALIASphoto3 = ImageTk.PhotoImage(image3)canvas3.create_image(0, 0, anchor='nw', image=photo3)canvas3.image = photo3def compare_images1():try:face1 = get_face_encoding(image1_path)face2 = get_face_encoding(image2_path)result1 = compare_faces(face1, face2)result_label1.config(text=result1)except Exception as e:result_label1.config(text="发生错误: " + str(e))def compare_images2():try:face2 = get_face_encoding(image2_path)face3 = get_face_encoding(image3_path)result2 = compare_faces(face2, face3)result_label2.config(text=result2)except Exception as e:result_label2.config(text="发生错误: " + str(e))# 创建GUI
root = Tk()
root.title("人脸对比")
root.geometry("1000x620")# 创建画布来显示图片
canvas1 = Canvas(root, width=300, height=300, bg='white')
canvas1.pack(side='left', padx=10, pady=10)
canvas2 = Canvas(root, width=300, height=300, bg='white')
canvas2.pack(side='left', padx=10, pady=10)
canvas3 = Canvas(root, width=300, height=300, bg='white')
canvas3.pack(side='left', padx=10, pady=10)# 创建标签来显示结果
result_label1 = Label(root, text="")
result_label1.place(x=300, y=120)
result_label2 = Label(root, text="")
result_label2.place(x=640, y=120)# 创建按钮来选择图片
button1 = Button(root, text="选择第一张图片", command=select_image1)
button1.place(x=100, y=50)
button2 = Button(root, text="选择第二张图片", command=select_image2)
button2.place(x=450, y=50)
button3 = Button(root, text="选择第三张图片", command=select_image3)
button3.place(x=800, y=50)# 创建按钮来对比图片
compare_button1 = Button(root, text="对比图像12", command=compare_images1)
compare_button1.place(x=300, y=80)
compare_button2 = Button(root, text="对比图像23", command=compare_images2)
compare_button2.place(x=640, y=80)root.mainloop()

相关文章:

人脸匹配——OpenCV

人脸匹配 导入所需的库加载dlib的人脸识别模型和面部检测器读取图片并转换为灰度图比较两张人脸选择图片并显示结果比较图片创建GUI界面运行GUI主循环运行显示全部代码 导入所需的库 cv2&#xff1a;OpenCV库&#xff0c;用于图像处理。 dlib&#xff1a;一个机器学习库&#x…...

韩顺平0基础学java——第22天

p441-459 异常exception 选中代码块&#xff0c;快捷键ctraltt6&#xff0c;即trt-catch 如果进行了异常处理&#xff0c;那么即使出现了异常&#xff0c;但是会继续执行 程序过程中发生的异常事件分为两大类&#xff1a; 异常体系图※ 常见的运行异常&#xff1a;类型转换…...

神经网络介绍及教程案例

神经网络介绍及教程&案例 神经网络&#xff08;Neural Networks&#xff09;是机器学习和人工智能中的一种关键技术&#xff0c;模仿了人类大脑的工作方式&#xff0c;能够处理复杂的数据和任务。以下是神经网络的一些基础介绍&#xff1a; 基本概念 神经元&#xff08;N…...

16个不为人知的资源网站,强烈建议收藏!

整理了16个不为人知的资源网站&#xff0c;涵盖了课程学习、办公技能、娱乐休闲、小说音乐等多种资源&#xff0c;强烈建议收藏&#xff01; #学习网站 1、中国大学MOOC icourse163.org/ 这是一个汇集了国内顶尖大学免费课程资源的平台&#xff0c;众多985工程院校如北京大…...

pandas获取某列最大值的所有数据

第一种方法&#xff1a; 按照某列进行由大到小的排序&#xff0c;然后再进去去重&#xff0c;保留第一个值&#xff0c;最终保留的结果就是最大值的数据 # 由大到小排序 data_frame data_frame.sort_values(bycolumn_a, ascendingFalse)# 按照column_b列去重保留第一条&#…...

App UI 风格展现非凡创意

App UI 风格展现非凡创意...

rocketmq-5.1.2的dleger高可用集群部署

1、背景 原先为5.0.0版本&#xff0c;因检查出有漏洞&#xff0c;升级到5.1.2版本。 【Rocketmq是阿里巴巴在2012年开发的分布式消息中间件&#xff0c;专为万亿级超大规模的消息处理而设计&#xff0c;具有高吞吐量、低延迟、海量堆积、顺序收发等特点。在一定条件下&#xf…...

无线网络与物联网技术[1]之近距离无线通信技术

无线网络与物联网技术 近距离无线通信技术WIFIWi-Fi的协议标准Wi-Fi的信道Wi-Fi技术的术语Wi-Fi的组网技术Ad-hoc模式无线接入点-APAP&#xff1a;FAT AP vs FIT AP Wi-Fi的特点与应用Wi-Fi的安全技术 Bluetooth蓝牙技术概论蓝牙的技术协议蓝牙的组网技术微微网piconet(了解)散…...

Codeforces Round 952 (Div. 4)

题解写到博客园了&#xff0c;懒得复制过来了了&#xff0c;放个链接 https://www.cnblogs.com/yxcblogs/p/18243276 推广一下自己记录的算法编程竞赛模板仓库 GitHub - yxc-s/programming-template: This repository contains C programming templates optimized for competi…...

spark MLlib (DataFrame-based) 中的聚类算法Bisecting K-Means、K-Means、Gaussian Mixture

Bisecting K-Means 核心原理&#xff1a; Bisecting K-Means 是一种层次 K-Means 聚类算法&#xff0c;基于 Steinbach、Karypis 和 Kumar 的论文《A comparison of document clustering techniques》&#xff0c;并对 Spark 环境进行了修改和适应。 该算法通过递归地将数据集…...

天降流量于雀巢?元老品牌如何创新营销策略焕新生

大家最近有看到“南京阿姨手冲咖啡”的视频吗&#xff1f;三条雀巢速溶咖啡入杯&#xff0c;当面加水手冲&#xff0c;十元一份售出&#xff0c;如此朴实的售卖方式迅速在网络上走红。而面对这一波天降的热度&#xff0c;雀巢咖啡迅速做出了回应&#xff0c;品牌组特地去到了阿…...

新疆在线测宽仪配套软件实现的9大功能!

在线测宽仪可应用于各种热轧、冷轧板带材的宽度尺寸检测&#xff0c;材质不限&#xff0c;木质、钢制、铁质、金属、纸质、塑料、橡胶等都可以进行无损非接触式的检测&#xff0c;在各式各样的产线应用中&#xff0c;有些厂家&#xff0c;需要更加详尽完备的分析信息&#xff0…...

考研计组chap3存储系统

目录 一、存储器的基本概念 80 1.按照层次结构 2.按照各种分类 &#xff08;41&#xff09;存储介质 &#xff08;2&#xff09;存取方式 &#xff08;3&#xff09;内存是否可更改 &#xff08;4&#xff09;信息的可保存性 &#xff08;5&#xff09;读出之后data是否…...

杨氏矩阵和杨辉三角的空间复杂度较小的解题思路

文章目录 题目1 杨氏矩阵题目2 杨辉三角 题目1 杨氏矩阵 有一个数字矩阵&#xff0c;矩阵的每行从左到右是递增的&#xff0c;矩阵从上到下是递增的&#xff0c;请编写程序在这样的矩阵中查找某个数字是否存在。 要求&#xff1a;时间复杂度小于O(N); 思路: 我们可以通过题目…...

【第六篇】SpringSecurity的权限管理

一、权限管理的实现 服务端的各种资源要被SpringSecurity的权限管理控制可以通过注解和标签两种方式来处理。 放开了相关的注解后在Controller中就可以使用相关的注解来控制了 JSR250注解 /*** JSR250*/ @Controller @RequestMapping("/user") public class UserC…...

未来工作场所:数字化转型的无限可能

探索技术如何重塑我们的工作环境与协作方式 引言 在21世纪的第三个十年&#xff0c;数字化转型已不再仅仅是科技公司的专利&#xff0c;它如同一股不可阻挡的潮流&#xff0c;深刻地渗透到了每一个行业的血脉之中。从灵活的远程办公模式到工作流程的智能化重构&#xff0c;技术…...

Landsat8的质量评估波段的一个应用

Landsat8一直是遥感界的热门话题。这不仅延续了自1972年以来NASA连续对地观测&#xff0c;而且这颗卫星为科学界带来了一些新的东西——质量评估波段&#xff08;the Quality Assessment (QA) Band&#xff09;。根据USGS Landsat Missions webpage&#xff0c;“QA通过标示哪个…...

OpenZeppelin Ownable合约 怎么使用

文章目录 智能合约的访问控制Ownable合约使用方法 智能合约的访问控制 熟悉OpenZeppelin的智能合约库的开发者都知道这个库已经提供了根据访问等级进行访问限制的选项&#xff0c;其中最常见的就是Ownable合约管理的onlyOwner模式&#xff0c;另一个是OpenZeppelin的Roles库&a…...

vue3框架基本使用(基础指令)

一、响应式数据 1.ref ref可以定义 基本类型的响应式数据&#xff0c; 也可以定义对象类型响应式数据 <template><h1>{{ name }}</h1><button click"test">修改姓名</button> </template><script setup lang"ts"…...

ubuntu20.04设置共享文件夹

ubuntu20.04设置共享文件夹 一&#xff0c;简介二&#xff0c;操作步骤1&#xff0c;设置Windows下的共享目录2&#xff0c;挂载共享文件夹3&#xff0c;测试是否挂载成功 一&#xff0c;简介 在公司电脑上&#xff0c;使用samba设置共享文件夹&#xff0c;IT安全部门权限不通…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

stm32wle5 lpuart DMA数据不接收

配置波特率9600时&#xff0c;需要使用外部低速晶振...