人脸匹配——OpenCV

news2025/1/9 23:14:38

人脸匹配

    • 导入所需的库
    • 加载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, image1
    image1_path = filedialog.askopenfilename()
    image1 = Image.open(image1_path)
    image1 = image1.resize((300, 300), Image.LANCZOS)  # 使用Image.LANCZOS替换ANTIALIAS
    photo1 = ImageTk.PhotoImage(image1)
    canvas1.create_image(0, 0, anchor='nw', image=photo1)
    canvas1.image = photo1


def select_image2():
    global image2_path, image2
    image2_path = filedialog.askopenfilename()
    image2 = Image.open(image2_path)
    image2 = image2.resize((300, 300), Image.LANCZOS)  # 使用Image.LANCZOS替换ANTIALIAS
    photo2 = ImageTk.PhotoImage(image2)
    canvas2.create_image(0, 0, anchor='nw', image=photo2)
    canvas2.image = photo2


def select_image3():
    global image3_path, image3
    image3_path = filedialog.askopenfilename()
    image3 = Image.open(image3_path)
    image3 = image3.resize((300, 300), Image.LANCZOS)  # 使用Image.LANCZOS替换ANTIALIAS
    photo3 = 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, image1
    image1_path = filedialog.askopenfilename()
    image1 = Image.open(image1_path)
    image1 = image1.resize((300, 300), Image.LANCZOS)  # 使用Image.LANCZOS替换ANTIALIAS
    photo1 = ImageTk.PhotoImage(image1)
    canvas1.create_image(0, 0, anchor='nw', image=photo1)
    canvas1.image = photo1


def select_image2():
    global image2_path, image2
    image2_path = filedialog.askopenfilename()
    image2 = Image.open(image2_path)
    image2 = image2.resize((300, 300), Image.LANCZOS)  # 使用Image.LANCZOS替换ANTIALIAS
    photo2 = ImageTk.PhotoImage(image2)
    canvas2.create_image(0, 0, anchor='nw', image=photo2)
    canvas2.image = photo2


def select_image3():
    global image3_path, image3
    image3_path = filedialog.askopenfilename()
    image3 = Image.open(image3_path)
    image3 = image3.resize((300, 300), Image.LANCZOS)  # 使用Image.LANCZOS替换ANTIALIAS
    photo3 = ImageTk.PhotoImage(image3)
    canvas3.create_image(0, 0, anchor='nw', image=photo3)
    canvas3.image = photo3


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
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()


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

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

相关文章

opencv-python(八)

import cv2 import numpy as npheight 160 width 280 image np.zeros((height, width),np.uint8) cv2.imshow(image,image) cv2.waitKeyEx(0) cv2.destroyAllWindows() 二维数组代表一幅灰度图像。 import cv2 import numpy as npheight 160 width 280 image np.zeros((he…

数据结构习题(快期末了)

一个数据结构是由一个逻辑结构和这个逻辑结构上的一个基本运算集构成的整体。 从逻辑关系上讲&#xff0c;数据结构主要分为线性结构和非线性结构两类。 数据的存储结构是数据的逻辑结构的存储映像。 数据的物理结构是指数据在计算机内实际的存储形式。 算法是对解题方法和…

.NET MAUI Sqlite程序应用-数据库配置(一)

项目名称:Ownership&#xff08;权籍信息采集&#xff09; 一、安装 NuGet 包 安装 sqlite-net-pcl 安装 SQLitePCLRawEx.bundle_green 二、创建多个表及相关字段 Models\OwnershipItem.cs using SQLite;namespace Ownership.Models {public class fa_rural_base//基础数据…

springboot和mybatis项目学习

#项目整体样貌 ##bean package com.example.demo.bean;public class informationBean {private int id;private String name;private String password;private String attchfile;public int getId() {return id;}public String getName() {return name;}public String getPas…

独具韵味的移动端 UI 风格

独具韵味的移动端 UI 风格

ACL原理和基础配置

ACL&#xff08;Access Control List&#xff0c;访问控制列表&#xff09;是一种用于控制网络设备或操作系统上资源访问权限的方法。ACL能够基于规则和条件来允许或拒绝对资源的访问。 标准ACL&#xff08;Standard ACL&#xff09;&#xff1a;基于源IP地址来进行流量过滤&a…

改进YOLOv8 | 主干网络篇 | YOLOv8 更换主干网络之 StarNet | 《重写星辰⭐》

本改进已集成到 YOLOv8-Magic 框架。 论文地址:https://arxiv.org/abs/2403.19967 论文代码:https://github.com/ma-xu/Rewrite-the-Stars 最近的研究引起了人们对“星形运算”(按元素乘法)在网络设计中未被充分利用的潜力的关注。虽然直观的解释很多,但其应用的基本原理…

Vue30-自定义指令:对象式

一、需求&#xff1a;创建fbind指定 要用js代码实现自动获取焦点的功能&#xff01; 二、实现 2-1、步骤一&#xff1a;绑定元素 2-2、步骤二&#xff1a;input元素获取焦点 此时&#xff0c;页面初始化的时候&#xff0c;input元素并没有获取焦点&#xff0c;点击按钮&…

计算机网络 —— 运输层(TCP三次握手)

计算机网络 —— 运输层&#xff08;TCP三次握手&#xff09; 三次握手第一次握手第二次握手第三次握手两次握手行不行&#xff1f; 我们今天来学习TCP的三次握手&#xff1a; 三次握手 TCP三次握手是TCP协议中建立连接的过程&#xff0c;旨在确保双方准备好进行可靠的通信。…

一个电话客服系统

简介 这是一个客服系统&#xff0c;使用的是USB电话盒。电话盒接入电话线 &#xff0c;然后再插在在计算机上。当有电话拨入时&#xff0c;可以在电脑中自动弹出拨入电话号码的相关客户资料&#xff0c;并能够自动录音。 安装 一、运行setup.exe 二、按照提示安装好程序后&am…

Android Jetpack Compose入门教程(二)

一、列表和动画 列表和动画在应用内随处可见。在本课中&#xff0c;您将学习如何利用 Compose 轻松创建列表并添加有趣的动画效果。 1、创建消息列表 只包含一条消息的聊天略显孤单&#xff0c;因此我们将更改对话&#xff0c;使其包含多条消息。您需要创建一个可显示多条消…

openh264 帧内预测编码过程源码分析

函数关系 说明&#xff1a; 可以看到完成帧内预测编码的核心函数就是 WelsMdI16x16、WelsMdI4x4、WelsMdI4x4Fast 、WelsMdIntraChroma 四个函数。 原理 WelsMdI16x16函数 功能&#xff1a;针对16x16像素块的帧内模式决策过程&#xff1a; 局部变量申明&#xff1b;根据宏块…

python如何终止程序运行

方法1&#xff1a;采用sys.exit(0)&#xff0c;正常终止程序&#xff0c;从图中可以看到&#xff0c;程序终止后shell运行不受影响。 方法2&#xff1a;采用os._exit(0)关闭整个shell&#xff0c;从图中看到&#xff0c;调用sys._exit(0)后整个shell都重启了&#xff08;RESTAR…

卡塔尔.巴林:海外媒体投放-宣发.发稿效果显著提高

引言 卡塔尔和巴林两国积极采取措施&#xff0c;通过海外媒体投放和宣发&#xff0c;将本国的商业新闻和相关信息传达给更广泛的受众。在这一过程中&#xff0c;卡塔尔新闻网、巴林商业新闻和摩纳哥新闻网等媒体起到了关键作用。通过投放新闻稿&#xff0c;这些国际化的媒体平…

UITableView之显示单组数据Demo

需求 UITableView实现显示单组数据。尝试设置不同行高度不同。 效果&#xff1a; 数据展示 实现 与之前分组显示数据的区别在于懒加载的数据模型不同。 &#xff08;1&#xff09;声明数据模型类 类的属性一定要和plist中数据的字段保持一致 interface CZhero : NSObject /…

idea在空工程中添加新模块并测试的步骤

ServicesTest是空的工程&#xff0c;没有pom文件。现在需要在ServicesTest目录下添加新模块作为新的工程&#xff0c;目的是写一下别的技术功能。 原先目录结构&#xff0c;ServicesTest是空的工程&#xff0c;没有pom文件。下面的几个模块是新的工程&#xff0c;相互独立。 1.…

数栈xAI:轻量化、专业化、模块化,四大功能革新 SQL 开发体验

在这个数据如潮的时代&#xff0c;SQL 已远远超越了简单的查询语言范畴&#xff0c;它已成为数据分析和决策制定的基石&#xff0c;成为撬动企业智慧决策的关键杠杆。SQL 的编写和执行效率直接关系到数据处理的速度和分析结果的深度&#xff0c;对企业洞察市场动态、优化业务流…

谁说Python GUI难?用pywebview打造现代化GUI界面

在Python的世界里&#xff0c;我们经常需要为程序添加一个图形用户界面&#xff08;GUI&#xff09;。传统上&#xff0c;Tkinter、PyQt或Kivy等库是常用的选择。但是&#xff0c;今天我们要介绍的是一个更简单、更现代的方法——pywebview。它让你可以使用HTML、CSS和JavaScri…

OpenCV查找图像中的轮廓并且展示

1、查找轮廓随机用不同的颜色画出 import cv2 import numpy as npdef get_contour_colors(num_contours):# 定义颜色表 (BGR 格式)colors [(255, 0, 0),(255, 50, 0),(255, 100, 0),(255, 150, 0),(255, 200, 0),(255, 255, 0),(200, 255, 0),(150, 255, 0),(100, 255, 0),(5…

2.6数据报与虚电路

数据报 当作为通信子网用户的端系统要发送一个报文时&#xff0c;在端系统中实现的高层协议先把报文拆成若干个带有序号的数据单元&#xff0c;并在网络层加上地址等控制信息后形成数据报分组(即网络层PDU)中间结点存储分组一段很短的时间&#xff0c;找到最佳的路由后&#x…