提取人脸
导入所需的库
tkinter
:用于创建图形用户界面。filedialog
:用于打开文件对话框。
cv2
:OpenCV库,用于图像处理和计算机视觉。PIL(Python Imaging Library
)和ImageTk
:用于处理和显示图像。messagebox
:用于显示消息框。
subprocess
:用于执行系统命令。
import tkinter as tk
from tkinter import filedialog
import cv2
from PIL import Image, ImageTk
from tkinter import messagebox
import subprocess
创建窗口
创建一个
Tkinter
窗口对象win
,并设置窗口的标题和大小。
win = tk.Tk()
win.title("人脸提取")
win.geometry("800x650")
显示原始图片
创建一个标签(Label)对象
image_label_original
,用于显示原始图片。然后使用pack()方法将标签放置在窗口的左侧,并设置一些填充和边距。
image_label_original = tk.Label(win)
image_label_original.pack(side=tk.LEFT, padx=10, pady=80)
显示检测到的人脸
创建另一个标签(Label)对象
image_label_detected
,用于显示检测到的人脸。同样使用pack()方法将标签放置在窗口的左侧,并设置一些填充和边距。
image_label_detected = tk.Label(win)
image_label_detected.pack(side=tk.LEFT, padx=10, pady=80)
创建全局变量
创建一个全局变量
selected_image_path
,用于存储选择的图片路径。
selected_image_path = None
定义字体对象
定义一个字体对象
my_font
,用于按钮和其他文本控件。
my_font = ("Times New Roman", 20)
定义一个函数select_image
定义一个函数
select_image
,当按钮被点击时,它会打开文件选择对话框,让用户选择图片。然后使用OpenCV
加载图片,转换颜色空间,使用PIL调整图片大小,并使用Tkinter
显示图片。
def select_image()
: - 定义一个函数,当按钮被点击时,会执行这个函数。global selected_image_path
:声明selected_image_path是一个全局变量,这样在函数内部可以修改它的值。
selected_image_path = filedialog.askopenfilename()
:
打开文件选择对话框,让用户选择一个文件。askopenfilename():函数返回用户选择的文件路径。img = cv2.imread(selected_image_path)
: 使用OpenCV的imread函数从选择的文件路径中读取图片。
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
:将图片从BGR颜色空间转换到RGB颜色空间。img_pil = Image.fromarray(img_rgb)
:将NumPy数组转换为PIL图像。img_pil = img_pil.resize((300, 300), Image.Resampling.LANCZOS)
: 使用LANCZOS插值方法将图像大小调整为300x300像素。img_tk = ImageTk.PhotoImage(image=img_pil)
:将PIL图像转换为Tkinter可以显示的PhotoImage对象。
image_label_original.config(image=img_tk)
:
配置标签image_label_original以显示新加载的图片。image_label_original.image = img_tk
: 设置标签的image属性,以便在Tkinter中显示图像。
def select_image():
global selected_image_path
# 打开文件选择对话框
selected_image_path = filedialog.askopenfilename()
# 使用OpenCV加载图片
img = cv2.imread(selected_image_path)
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img_pil = Image.fromarray(img_rgb)
img_pil = img_pil.resize((300