人脸五官标注

2024-06-11 10:20
文章标签 人脸 标注 五官

本文主要是介绍人脸五官标注,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.导入必要的包

dlib这个包可以在浏览器下载,然后解压

import tkinter as tk
from tkinter import filedialog
import cv2
from PIL import Image, ImageTk
import dlib
import subprocess

2.创建窗口

窗口的名字跟大小都可以自己设置

win = tk.Tk()
win.title("人脸识别")
win.geometry("1000x500")

3.界面美化

创建了两个框架,一个用于放置按钮,另一个用于放置图片。按钮框架位于窗口的顶部,图片框架位于按钮框架的下方。两个框架都有一定的空白空间,使得界面更加美观

# 创建一个Frame用于放置按钮
button_frame = tk.Frame(win)
button_frame.pack(side="top", fill="x", padx=10, pady=10)# 创建一个Frame用于放置图片
image_frame = tk.Frame(win)
image_frame.pack(side="top", fill="both", expand=True, padx=10, pady=10)

4.设置窗口显示图片

# 使用 grid 来布局图片
def layout_images():# 清除原有的图片for label in image_labels:label.destroy()image_labels.clear()# 计算每张图片的显示尺寸img_width = int(win.winfo_width() / 4) - 20  # 20是列间距的总和img_height = 200  # 可以根据需要调整for i, path in enumerate(selected_image_paths):img = cv2.imread(path)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)detector = dlib.get_frontal_face_detector()predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")  # 确保该文件存在faces = detector(gray, 1)if len(faces) > 0:landmarks = predictor(gray, faces[0])for n in range(0, 68):x = landmarks.part(n).xy = landmarks.part(n).ycv2.circle(img, (x, y), 1, (255, 0, 0), -1)img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)img_pil = Image.fromarray(img_rgb)img_pil = img_pil.resize((img_width, img_height))  # 调整图片大小img_tk = ImageTk.PhotoImage(image=img_pil)# 创建一个新的标签来显示图片,并使用 grid 来布局image_label = tk.Label(image_frame, image=img_tk)image_label.image = img_tk  # 保持对图像的引用image_label.grid(row=0, column=i, padx=10, pady=10)image_labels.append(image_label)

5.设置窗口最大显示图片数量

def select_image():global selected_image_paths# 限制选择的图片数量if len(selected_image_paths) < 4:selected_path = filedialog.askopenfilename()if selected_path:selected_image_paths.append(selected_path)layout_images()

6.设置关闭窗口

def Esc():win.destroy()

7.连接主窗口

这里因为这只是一个大的项目中的一部分 ,所以你这里可以把函数改为pass,程序即可正常使用

def zhu():subprocess.Popen(["python", "main.py"])win. Destroy()

8.设置按钮和循环

button_select = tk.Button(button_frame, text="选择图片", font=my_font, command=select_image, fg='blue')
button_select.grid(row=0, column=0, padx=10, pady=10)esc = tk.Button(button_frame, text='返回系统', font=my_font, command=zhu, fg='blue')
esc.grid(row=0, column=1, padx=10, pady=10)esc2 = tk.Button(button_frame, text='退出系统', font=my_font, command=Esc, fg='blue')
esc2.grid(row=0, column=2, padx=10, pady=10)win.mainloop()

源码

import tkinter as tk
from tkinter import filedialog
import cv2
from PIL import Image, ImageTk
import dlib
import subprocess# 初始化变量
selected_image_paths = []  # 存储图片路径
image_labels = []  # 存储已显示的图片标签
my_font = ("Times New Roman", 20)# 创建主窗口
win = tk.Tk()
win.title("人脸识别")
win.geometry("1000x500")# 创建一个Frame用于放置按钮
button_frame = tk.Frame(win)
button_frame.pack(side="top", fill="x", padx=10, pady=10)# 创建一个Frame用于放置图片
image_frame = tk.Frame(win)
image_frame.pack(side="top", fill="both", expand=True, padx=10, pady=10)# 使用 grid 来布局图片
def layout_images():# 清除原有的图片for label in image_labels:label.destroy()image_labels.clear()# 计算每张图片的显示尺寸img_width = int(win.winfo_width() / 4) - 20  # 20是列间距的总和img_height = 200  # 可以根据需要调整for i, path in enumerate(selected_image_paths):img = cv2.imread(path)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)detector = dlib.get_frontal_face_detector()predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")  # 确保该文件存在faces = detector(gray, 1)if len(faces) > 0:landmarks = predictor(gray, faces[0])for n in range(0, 68):x = landmarks.part(n).xy = landmarks.part(n).ycv2.circle(img, (x, y), 1, (255, 0, 0), -1)img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)img_pil = Image.fromarray(img_rgb)img_pil = img_pil.resize((img_width, img_height))  # 调整图片大小img_tk = ImageTk.PhotoImage(image=img_pil)# 创建一个新的标签来显示图片,并使用 grid 来布局image_label = tk.Label(image_frame, image=img_tk)image_label.image = img_tk  # 保持对图像的引用image_label.grid(row=0, column=i, padx=10, pady=10)image_labels.append(image_label)def select_image():global selected_image_paths# 限制选择的图片数量if len(selected_image_paths) < 4:selected_path = filedialog.askopenfilename()if selected_path:selected_image_paths.append(selected_path)layout_images()def Esc():win.destroy()def zhu():subprocess.Popen(["python", "main.py"])win.destroy()# 创建按钮并使用 grid 来布局
button_select = tk.Button(button_frame, text="选择图片", font=my_font, command=select_image, fg='blue')
button_select.grid(row=0, column=0, padx=10, pady=10)esc = tk.Button(button_frame, text='返回系统', font=my_font, command=zhu, fg='blue')
esc.grid(row=0, column=1, padx=10, pady=10)esc2 = tk.Button(button_frame, text='退出系统', font=my_font, command=Esc, fg='blue')
esc2.grid(row=0, column=2, padx=10, pady=10)win.mainloop()

这篇关于人脸五官标注的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1050899

相关文章

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

使用JavaScript将PDF页面中的标注扁平化的操作指南

《使用JavaScript将PDF页面中的标注扁平化的操作指南》扁平化(flatten)操作可以将标注作为矢量图形包含在PDF页面的内容中,使其不可编辑,DynamsoftDocumentViewer... 目录使用Dynamsoft Document Viewer打开一个PDF文件并启用标注添加功能扁平化

使用 Python 和 LabelMe 实现图片验证码的自动标注功能

《使用Python和LabelMe实现图片验证码的自动标注功能》文章介绍了如何使用Python和LabelMe自动标注图片验证码,主要步骤包括图像预处理、OCR识别和生成标注文件,通过结合Pa... 目录使用 python 和 LabelMe 实现图片验证码的自动标注环境准备必备工具安装依赖实现自动标注核心

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

vue3 为组件的 emits 标注类型,defineEmits基于类型的定义的简单理解

1)在 <script setup> 中,emit 函数的类型标注也可以通过运行时声明或是类型声明进行。 2)基于类型的: const emit = defineEmits<{ (e: 'change', id: number): void (e: 'update', value: string): void }>() 说明:e: 指定了方法名,id:数字型的参数,这个就是限定了方法名及

水面垃圾检测数据集 3000张 水面垃圾 带标注 voc yolo

数据集概述 该数据集包含3000张图像,专注于水面垃圾的检测。数据集已经按照VOC(Visual Object Classes)和YOLO(You Only Look Once)两种格式进行了标注,适用于训练深度学习模型,特别是物体检测模型,用于识别水面上的各种垃圾。 数据集特点 多样性:包含3000张图像,涵盖了多种类型的水面垃圾,确保模型能够识别各种类型的垃圾。双标注格式:提供VO

军事目标无人机视角检测数据集 3500张 坦克 带标注voc

数据集概述 该数据集包含3500张无人机拍摄的图像,主要用于坦克目标的检测。数据集已经按照VOC(Visual Object Classes)标准进行了标注,适用于训练深度学习模型,特别是物体检测模型。 数据集特点 目标明确:专注于坦克这一特定军事目标的检测。多样视角:图像采集自无人机的不同飞行高度和角度,涵盖了各种环境下的坦克图像。高质量标注:每个坦克实例都被精确标注,包括位置信息和类别