人脸辨认——OpenCV

打印 上一主题 下一主题

主题 1854|帖子 1854|积分 5562

创建窗口

导入tkinter库,创建窗口,设置窗口标题和窗口大小。
  1. import tkinter as tk
  2. win = tk.Tk()
  3. win.title("人脸识别")
  4. win.geometry("1000x800")
  5. win.mainloop()
复制代码
创建按钮

创建选择图片和辨认人脸,退出系统,返回系统的按钮
  1. button_select = tk.Button(win, text="选择图片",fg='red')
  2. button_select.place(x=333,y=12)
  3. button_detect = tk.Button(win, text="识别人脸", fg='red')
  4. button_detect.place(x=666,y=12)
  5. esc = tk.Button(win,text='退出系统',fg='red')
  6. esc.place(x=10,y=10)
  7. t = tk.Button(win,text='返回系统',fg='red')
  8. t.place(x=900,y=10)
复制代码
设置字体

“Times New Roman”:这是字体名称。20:这是字体大小。
  1. my_font = ("Times New Roman", 20)
复制代码
并添加在按钮中

代码位置:

界说标签用于显示图片

两个标签控件用于显示图片,并将它们放置在窗口中。image_label_original和image_label_detected,分别用于显示原始图像和检测到人脸的图像。将这两个标签放置在窗口的左侧,并设置内边距。
  1. image_label_original = tk.Label(win)
  2. image_label_original.pack(side=tk.LEFT, padx=10, pady=80)
  3. image_label_detected = tk.Label(win)
  4. image_label_detected.pack(side=tk.LEFT, padx=10, pady=80)
复制代码
代码位置:


选择并显示图片

界说全局变量用于存储用户选择的图片路径
  1. selected_image_path = None
复制代码
导入所必要的包
filedialog: 这是tkinter的一个扩展模块,它提供了一个对话框,允许用户选择文件或目次。在您的程序中,它用于打开一个文件选择对话框,让用户可以选择一张图片。
cv2: 这是OpenCV库的Python接口。OpenCV是一个强盛的盘算机视觉库,支持各种图像和视频处理功能。在您的程序中,它用于加载和处理图像,以及进行人脸检测。
PIL.Image 和 PIL.ImageTk: 这些是Python Imaging Library (PIL)的一部门,如今被称为Pillow。PIL是一个用于处理图像的库,而PIL.ImageTk是一个将PIL图像转换为tkinter兼容的PhotoImage对象的模块。在您的程序中,它们用于将OpenCV的图像转换为可以在tkinter中显示的格式。
  1. from tkinter import filedialog
  2. import cv2
  3. from PIL import Image, ImageTk
复制代码
界说一个函数来打开文件选择对话框,加载用户选择的图片,并将其显示在标签上。
  1. def select_image():
  2.     global selected_image_path
  3. # filedialog.askopenfilename() 打开一个文件选择对话框,允许用户选择一个图片文件。
  4.     selected_image_path = filedialog.askopenfilename()
  5.         # 使用OpenCV的 imread 函数加载用户选择的图片。
  6.     img = cv2.imread(selected_image_path)
  7.          #将OpenCV加载的BGR格式图片转换为RGB格式,因为PIL和Tkinter只支持RGB格式。
  8.     img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  9.     #使用PIL的 fromarray 函数将RGB格式的图片转换为PIL图像
  10.     img_pil = Image.fromarray(img_rgb)
  11.         #使用Tkinter的 PhotoImage 函数将PIL图像转换为Tkinter可以识别的格式。
  12.     img_tk = ImageTk.PhotoImage(image=img_pil)
  13.     # 显示原始图片
  14.     # config 方法用于修改控件的配置
  15.     image_label_original.config(image=img_tk)
  16.     #将Tkinter的 PhotoImage 对象绑定到标签上。
  17.     image_label_original.image = img_tk
复制代码
在选择图片的按钮上调用此函数

代码位置:


检测图片中的人脸

导入所必要的库:
messagebox: 这是tkinter的一个模块,用于显示消息框。消息框可以用于显示信息、警告或错误提示。在您的程序中,它用于在未检测到人脸时显示提示信息。
  1. from tkinter import messagebox
复制代码
界说一个函数来检测图片中的人脸,假如检测到人脸,就在人脸周围画矩形框,并显示检测结果。
  1. def detect_faces():
  2.     global selected_image_path
  3. #检查是否已经被赋值。如果已经选择了图片,这个变量将包含图片的路径。
  4.     if selected_image_path:
  5.         # 使用OpenCV的imread函数加载用户选择的图片
  6.         img = cv2.imread(selected_image_path)
  7. #cvtColor函数将加载的图片从BGR颜色空间转换为灰度颜色空间
  8.         gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  9. #haarcascade_frontalface_default.xml是OpenCV提供的一个预训练的人脸检测模型,用于检测图像中的人脸。
  10.         face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
  11. #人脸检测模型在灰度图像上检测人脸。detectMultiScale函数返回一个包含检测到的脸部位置的矩形列表。
  12.         faces = face_cascade.detectMultiScale(gray, 1.1, 4)
  13.         # 判断是否检测到人脸
  14.         if len(faces) > 0:
  15.             # 在人脸周围画矩形框
  16.             for (x, y, w, h) in faces:
  17. #原始图像上画一个矩形框,表示检测到的人脸位置。矩形的坐标是(x, y),宽度和高度分别是w和h,矩形的颜色是蓝色(RGB值255, 0, 0),线宽为2。
  18.                 cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
  19.             # 转换为PIL格式并显示
  20. #检测到人脸后的图像从BGR颜色空间转换为RGB颜色空间。因为Tkinter和PIL库不支持BGR颜色空间。
  21.             img_rgb_detected = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  22. #将转换后的图像从NumPy数组转换为PIL图像对象。
  23.             img_pil_detected = Image.fromarray(img_rgb_detected)
  24. #将PIL图像对象转换为Tkinter可以显示的格式。
  25.             img_tk_detected = ImageTk.PhotoImage(image=img_pil_detected)
  26. #显示转换后的图像。
  27.             image_label_detected.config(image=img_tk_detected)
  28. #将Tkinter的PhotoImage对象绑定到标签上,以保持图片的引用。这样,即使图片被更新,标签仍然会显示最新的图片。
  29.             image_label_detected.image = img_tk_detected  # keep a reference
  30.         else:
  31.             # 提示未检测到人脸
  32.             messagebox.showinfo("提示", "未检测到人脸")
  33.     else:
  34.         messagebox.showinfo("提示", "请先选择一张图片")
复制代码
在辨认人脸的按钮上调用此函数


退出程序

  1. def Esc():
  2.     win.destroy()
复制代码
在退出系统的按钮上调用此函数

代码位置:

返回主界面

导入所必要的库:
subprocess: 这个模块允许你创建新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回值。在您的程序中,它用于启动一个新的Python进程来运行另一个脚本main.py。
  1. import subprocess
  2. def one():
  3.     subprocess.Popen(["python", "main.py"])
  4.     win.destroy()
复制代码
在返回系统的按钮上调用此函数

代码位置:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

石小疯

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表