OpenCv之简单的人脸识别项目(动态处理页面)
人脸识别
- 准备
- 九、动态处理页面
- 1.导入所需的包
- 2.设置窗口
- 2.1定义窗口外观和大小
- 2.2设置窗口背景
- 2.2.1设置背景图片
- 2.2.2创建label控件
- 3.定义视频处理脚本
- 4.定义相机抓取脚本
- 5.定义关闭窗口的函数
- 6.按钮设计
- 6.1视频处理按钮
- 6.2相机抓取按钮
- 6.3返回按钮
- 7.定义关键函数
- 8.动态处理页面运行结果图
- 动态处理页面完整代码
- 十、视频处理页面
- 1.导入所需的包
- 2.设置窗口
- 2.1定义窗口外观和大小
- 2.2设置窗口背景
- 2.2.1设置背景图片
- 2.2.2创建label控件
- 3.定义全局变量
- 4.定义选择视频并自动识别人脸函数
- 5.定义识别人脸函数
- 5.1 函数定义和全局变量声明
- 5.2 条件判断和文件夹创建
- 5.3 加载视频和初始化Canvas
- 5.4 视频处理循环
- 5.5 释放视频和清理资源
- 6.定义打开人脸文件夹的函数
- 7.定义关闭窗口的函数
- 8.按钮设计
- 8.1选择视频按钮
- 8.2打开文件夹按钮
- 8.3返回按钮
- 9.定义关键函数
- 10. 视频处理页面运行结果图
- 11.视频处理页面功能展示图
- 视频处理页面完整代码
- 十一、相机抓取页面
- 1.导入所需的包
- 2.设置窗口
- 2.1定义窗口外观和大小
- 2.2设置窗口背景
- 2.2.1设置背景图片
- 2.2.2创建label控件
- 3.定义全局变量存储文件夹
- 4.创建一个实时视频流
- 4.1加载 Haar 级联分类器
- 4.2打开摄像头
- 5.定义使用摄像头捕获视频帧的函数
- 5.1函数定义和初始化
- 5.2处理摄像头帧
- 5.3转换图像颜色和检测人脸
- 5.4处理检测到的人脸
- 5.5保存整个图像和显示处理后的图像
- 5.6等待用户操作和退出循环
- 5.7释放摄像头资源和关闭窗口
- 6.定义选择文件夹的函数
- 7.定义关闭窗口的函数
- 8.按钮设计
- 8.1打开相机按钮
- 8.2打开文件夹按钮
- 8.3返回按钮
- 10.定义关键函数
- 11. 相机抓取页面运行结果图
- 11.相机抓取功能展示结果图
- 相机抓取页面完整代码
准备
本篇将展示动态处理页面,并与登录页面连接起来。动态处理页面分为视频处理和相机抓取两个分页面。
九、动态处理页面
1.导入所需的包
tkinter:
Tkinter是Python的标准GUI(图形用户界面)库。它提供了一个快速和简单的方式来创建GUI应用程序。tkinter模块是Tkinter库的主模块,包含了创建窗口、按钮、文本框等基本GUI组件的类和函数。
messagebox:
这个模块是tkinter的一个扩展,提供了一个对话框,允许您显示消息框、警告框、错误框等。它是tkinter的一部分,通常与tkinter一起使用来与用户进行交互。
subprocess:
这个模块允许您启动新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回码。通常用于执行系统命令或运行外部程序。
ImageTk:
ImageTk是PIL库中用于与Tkinter一起使用的模块,它提供了在Tkinter中显示图像的功能。它通常与Tkinter的PhotoImage类一起使用,以在Tkinter应用程序中显示PIL的Image对象。
import tkinter as tk
from tkinter import messagebox
import subprocess
from PIL import ImageTk, Image
2.设置窗口
2.1定义窗口外观和大小
实例化窗口,设置窗口标题,尺寸。
#设置窗口
win=tk.Tk()
win.title('动态处理')
win.geometry('600x450')
2.2设置窗口背景
2.2.1设置背景图片
调用image对象的resize方法来调整图像的大小。将调整大小后的PIL Image对象转换为Tkinter兼容的PhotoImage对象。
#背景设计
image = Image.open("10.gif")
image = image.resize((600, 450)) # 调整背景图片大小
photo1 = ImageTk.PhotoImage(image)
canvas = tk.Label(win, image=photo1)
canvas.pack()
2.2.2创建label控件
Label控件可以用来显示文本、图像或其他内容。在这里,它被用来显示前面创建的PhotoImage对象,即背景图片。
canvas = tk.Label(win, image=photo1)
canvas.pack()
3.定义视频处理脚本
定义一个名为Spcl的函数,在Python中运行另一个名为 “视频处理.py” 的脚本,并在成功执行后关闭当前的Tkinter窗口 win。如果在这个过程中出现任何异常,它会弹出一个错误消息框,显示具体的错误信息。
# 定义视频处理
def Spcl():script_path = "视频处理.py"try:#运行文件subprocess.Popen(["python", script_path])win.destroy()except Exception as e:# 如果有错误,弹出消息框messagebox.showerror("Error", f"无法打开脚本:{e}")
4.定义相机抓取脚本
定义一个名为Xjzq的函数,在Python中运行另一个名为 “相机抓取.py” 的脚本,并在成功执行后关闭当前的Tkinter窗口 win。如果在这个过程中出现任何异常,它会弹出一个错误消息框,显示具体的错误信息。
# 定义相机抓取
def TWO():script_path = "相机抓取.py"try:#运行文件subprocess.Popen(["python", script_path])win.destroy()except Exception as e:# 如果有错误,弹出消息框messagebox.showerror("Error", f"无法打开脚本:{e}")
5.定义关闭窗口的函数
当用户点击一个按钮或执行其他操作以触发 close 函数时,当前的 Tkinter 窗口将
被关闭,并且一个新的 Python 进程将被启动来执行 登录页面.py 脚本。
def close():subprocess.Popen(["python","登录页面.py"])win.destroy()
用法:close函数可以用来在应用程序中创建一个简单的退出功能,或者在需要时启动新的应用程序或脚本。
6.按钮设计
6.1视频处理按钮
设计一个按钮,用于在Tkinter图形用户界面中触发人脸识别功能。当用户点击这个按钮时,会调用之前定义的 Spcl函数。
# 按钮设计
image = Image.open("F6.gif") # 加载一张图片
photo2 = ImageTk.PhotoImage(image)
bt1 = tk.Button(win, image=photo2, width=198, height=31,command=Spcl)
bt1.place(x=190, y=130)
6.2相机抓取按钮
设计一个按钮,用于在Tkinter图形用户界面中触发人脸识别功能。当用户点击这个按钮时,会调用之前定义的 Xjzq函数。
image = Image.open("F7.gif") # 加载一张图片
photo3 = ImageTk.PhotoImage(image)
bt2 = tk.Button(win, image=photo3, width=198, height=31,command=TWO)
bt2.place(x=190, y=230)
6.3返回按钮
定义一个名为 bt3的按钮,该按钮将显示一个前面导入的名为 “B.gif” 的 图像,并且当用户点击这个按钮时,会执行一个名为 sb 的函数。
image = Image.open("B.gif") # 加载一张图片
photo4 = ImageTk.PhotoImage(image)
bt3 = tk.Button(win, image=photo4, width=198, height=32,command=close)
bt3.place(x=520, y=30)
用法:close函数通常这个函数用来关闭应用程序窗口。
7.定义关键函数
win.mainloop() 是 Tkinter GUI 应用程序中的一个关键函数,它启动了 Tkinter 的事件循环。
这个事件循环是 GUI 应用程序的核心,它负责处理用户输入(如鼠标点击、按键等),更新窗口内容,以及响应用户的操作。
win.mainloop()
注:当你调用 win.mainloop() 时,以下几件事情会发生:
1.窗口 win 会显示在屏幕上。
2.应用程序会开始监听和响应事件,如按钮点击、输入框文字变化等。
3.当用户进行操作(如点击按钮),Tkinter 会触发相应的事件处理函数(例如,你设置的 command 参数对应的函数)。
4.如果没有事件发生,应用程序会保持空闲状态,不会占用太多CPU资源。
5.当你关闭窗口或者调用 win.destroy() 时,win.mainloop() 会退出,事件循环结束,应用程序终止。
8.动态处理页面运行结果图
动态处理页面完整代码
import tkinter as tk
from tkinter import messagebox
import subprocess
from PIL import ImageTk, Image#设置窗口
win=tk.Tk()
win.title('动态处理')
win.geometry('600x450')#背景设计
image = Image.open("10.gif")
image = image.resize((600, 450)) # 调整背景图片大小
photo1 = ImageTk.PhotoImage(image)
canvas = tk.Label(win, image=photo1)
canvas.pack()#定义视频处理
def Spcl():script_path = "视频处理.py"try:#运行文件subprocess.Popen(["python", script_path])win.destroy()except Exception as e:# 如果有错误,弹出消息框messagebox.showerror("Error", f"无法打开脚本:{e}")#定义相机抓取
def Xjzq():script_path = "相机抓取.py"try:# 运行文件subprocess.Popen(["python", script_path])win.destroy()except Exception as e:# 如果有错误,弹出消息框messagebox.showerror("Error", f"无法打开脚本:{e}")def close():subprocess.Popen(["python","登录页面.py"])win.destroy()#按钮、
image = Image.open("F6.gif") # 加载一张图片
photo2 = ImageTk.PhotoImage(image)
bt1 = tk.Button(win, image=photo2, width=198, height=32,command=Spcl)
bt1.place(x=190, y=130)image = Image.open("F7.gif") # 加载一张图片
photo3 = ImageTk.PhotoImage(image)
bt2 = tk.Button(win, image=photo3, width=198, height=32,command=Xjzq)
bt2.place(x=190, y=230)image = Image.open("B.gif") # 加载一张图片
photo4 = ImageTk.PhotoImage(image)
bt3 = tk.Button(win, image=photo4, width=198, height=32,command=close)
bt3.place(x=190, y=330)win.mainloop()
十、视频处理页面
1.导入所需的包
cv2 (OpenCV):
OpenCV是一个开源的计算机视觉库,它提供了大量用于图像和视频处理的功能。cv2模块是OpenCV的Python接口,它允许您在Python中使用OpenCV的功能。OpenCV广泛用于图像识别、图像处理、物体检测、视频分析等任务。
tkinter:
Tkinter是Python的标准GUI(图形用户界面)库。它提供了一个快速和简单的方式来创建GUI应用程序。tkinter模块是Tkinter库的主模块,包含了创建窗口、按钮、文本框等基本GUI组件的类和函数。
filedialog:
这个模块是tkinter的一个扩展,提供了一个文件对话框,允许用户选择文件或目录。它是tkinter的一部分,通常与tkinter一起使用来创建文件选择器。
face_recognition:
这个模块是一个Python库,用于对人脸进行识别和对图片中的人脸进行定位。它使用深度学习算法来识别人脸,并且可以处理实时视频或静态图片。
os:
os模块提供了与操作系统交互的功能。它提供了用于文件和目录操作的函数,如文件读写、目录遍历、文件路径处理等。
subprocess:
这个模块允许您启动新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回码。通常用于执行系统命令或运行外部程序。
PIL (Python Imaging Library):
PIL是一个强大的图像处理库,它支持多种图像文件格式,并提供了一系列图像处理功能,如打开、修改、保存图像,以及图像处理操作(如缩放、裁剪、颜色转换等)。
import cv2
import tkinter as tk
from tkinter import filedialog
import face_recognition
import os
import subprocess
from PIL import Image, ImageTk
2.设置窗口
2.1定义窗口外观和大小
实例化窗口,设置窗口标题,尺寸。
#设置窗口
win=tk.Tk()
win.title('Welocome')
win.geometry('750x600')
2.2设置窗口背景
2.2.1设置背景图片
调用image对象的resize方法来调整图像的大小。将调整大小后的PIL Image对象转换为Tkinter兼容的PhotoImage对象。
#背景设计
image = Image.open("12.gif")
image = image.resize((750, 600)) # 调整背景图片大小
photo1 = ImageTk.PhotoImage(image)
canvas = tk.Label(win, image=photo1)
canvas.pack()
2.2.2创建label控件
Label控件可以用来显示文本、图像或其他内容。在这里,它被用来显示前面创建的PhotoImage对象,即背景图片。
canvas = tk.Label(win, image=photo1)
canvas.pack()
3.定义全局变量
用了None来初始化它们,这意味着在程序开始时,它们不指向任何具体的文件路径、组件对象或检测结果。在实际的应用程序中,您会通过用户的操作或程序的逻辑来更新这些变量,以便它们能够存储视频文件的路径、显示视频内容以及存储人脸检测结果。
# 定义一个全局变量来保存视频路径
save_video = None
canvas = None
face_dir = None
用法:
save_video:
这个变量被用来保存用户选择的视频文件的路径。在视频处理或显示视频的应用程序中,您可能需要存储用户选择的视频文件的路径,以便之后进行操作,如加载、显示或处理视频。
canvas:
这个变量通常用于在Tkinter应用程序中显示视频。在Tkinter中,Canvas组件可以用来绘制图形和文本,以及放置其他组件。在这个上下文中,canvas可能被用来引用一个Canvas组件,该组件被配置为显示视频。
face_dir:
这个变量通常用于存储与视频相关的人脸检测结果。在视频处理和分析的应用程序中,您可能需要存储检测到的人脸的位置或属性,以便后续分析和处理。
4.定义选择视频并自动识别人脸函数
让用户通过文件对话框选择一个视频文件,然后将这个视频文件的路径保存到全局变量 save_video 中,并调用 sb_video 函数来处理这个视频文件。
# 选择视频并自动识别人脸
def xz_video():global save_videofile_path = filedialog.askopenfilename(title="选择视频",filetypes=(("视频文件", "*.mp4;*.avi;*.mkv;*.mov"),("所有文件", "*.*")))if file_path:save_video = file_pathsb_video()
5.定义识别人脸函数
5.1 函数定义和全局变量声明
定义一个名为 sb_video 的函数,并在函数内部声明了三个全局变量 save_video、canvas 和 face_dir。这意味着函数内部对这些变量的修改将会影响函数外部的同名变量。
# 识别视频并在Canvas上显示
def sb_video():global save_video, canvas, face_dir
5.2 条件判断和文件夹创建
首先检查 save_video 是否有值,如果有,则定义 face_dir 为 ‘video_image’。然后,它检查这个文件夹是否存在。如果不存在,它会创建这个文件夹。
if save_video:# 创建保存人脸的文件夹if not face_dir:face_dir = 'video_image'if not os.path.exists(face_dir):os.makedirs(face_dir)
5.3 加载视频和初始化Canvas
使用 OpenCV 库的 VideoCapture 函数加载 save_video 指定的视频文件。然后,它创建了一个 Canvas 组件,用于显示视频帧。
# 加载视频
video_capture = cv2.VideoCapture(save_video)# 初始化Canvas
canvas = tk.Canvas(win, width=640, height=480)
canvas.place(x=80,y=180)
5.4 视频处理循环
这部分代码包含在一个 try 和 finally 块中,确保在视频处理过程中出现任何异常时能够正确释放视频。
在循环中,它逐帧读取视频,并转换颜色从BGR到RGB。然后,它使用 face_recognition 库来查找图像中的人脸位置,并在每个检测到的人脸周围画框。接着,它裁剪人脸并保存到 face_dir 指定的文件夹中。
它还使用 PIL 库将OpenCV图像格式转换为PIL图像格式,并使用 ImageTk 将其转换为Tkinter可以显示的格式。最后,它将图像显示在 canvas 上,并更新Tkinter窗口。
如果用户按下 ‘q’ 键,循环会提前终止。
try:# 初始化变量face_count = 0while True:# 抓取一帧视频ret, frame = video_capture.read()if not ret:break# 转换颜色从BGR到RGBrgb_frame = frame[:, :, ::-1]# 查找图像中的人脸位置face_locations = face_recognition.face_locations(rgb_frame)# 在每个检测到的人脸周围画框for top, right, bottom, left in face_locations:cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)# 裁剪人脸并保存face_image = frame[top:bottom, left:right]face_path = os.path.join(face_dir, f'face_{face_count}.jpg')cv2.imwrite(face_path, face_image)face_count += 1# 转换OpenCV图像格式到PIL图像格式pil_image = Image.fromarray(frame[:, :, ::-1])photo = ImageTk.PhotoImage(image=pil_image)# 在Canvas上显示图像canvas.create_image(0, 0, anchor=tk.NW, image=photo)win.update_idletasks()win.update()if cv2.waitKey(1) & 0xFF == ord('q'):break
5.5 释放视频和清理资源
确保在处理完视频后,视频捕获对象被正确释放,释放所有分配的资源。
finally:
# 释放视频
video_capture.release()
6.定义打开人脸文件夹的函数
检查是否存在一个名为 face_dir 的文件夹,并如果存在,则打开这个文件夹。这个函数通常会在应用程序中用于允许用户查看和浏览检测到的人脸图像。
def open_face():if face_dir and os.path.exists(face_dir):os.startfile(face_dir)
7.定义关闭窗口的函数
当用户点击一个按钮或执行其他操作以触发 close 函数时,当前的 Tkinter 窗口将被关闭,并且一个新的 Python 进程将被启动来执行 登录页面.py 脚本。
def close():subprocess.Popen(["python","动态页面.py"])win.destroy()
用法:close函数可以用来在应用程序中创建一个简单的退出功能,或者在需要时启动新的应用程序或脚本。
8.按钮设计
8.1选择视频按钮
定义一个名为 bt1 的按钮,该按钮将显示一个前面导入的名为 “F8…gif” 的 图像,并且当用户点击这个按钮时,会执行一个名为 xz_video 的函数。
image = Image.open("F8.gif") # 加载一张图片
photo2 = ImageTk.PhotoImage(image)
bt1 = tk.Button(win, image=photo2, width=198, height=32,command=xz_video)
bt1.place(x=30, y=30)
8.2打开文件夹按钮
定义一个名为 bt2 的按钮,该按钮将显示一个前面导入的名为 “F9.gif” 的 图像,并且当用户点击这个按钮时,会执行一个名为 open_face的函数。
image = Image.open("F1.gif") # 加载一张图片
photo3 = ImageTk.PhotoImage(image)
bt2 = tk.Button(win, image=photo3, width=198, height=32,command=open_face)
bt2.place(x=275, y=30)
8.3返回按钮
定义一个名为 bt3的按钮,该按钮将显示一个前面导入的名为 “B.gif” 的 图像,并且当用户点击这个按钮时,会执行一个名为 close的函数。
image = Image.open("B.gif") # 加载一张图片
photo4 = ImageTk.PhotoImage(image)
bt3 = tk.Button(win, image=photo4, width=198, height=32,command=close)
bt3.place(x=520, y=30)
用法:close函数通常这个函数用来关闭应用程序窗口。
9.定义关键函数
win.mainloop() 是 Tkinter GUI 应用程序中的一个关键函数,它启动了 Tkinter 的事件循环。
这个事件循环是 GUI 应用程序的核心,它负责处理用户输入(如鼠标点击、按键等),更新窗口内容,以及响应用户的操作。
win.mainloop()
注:当你调用 win.mainloop() 时,以下几件事情会发生:
1.窗口 win 会显示在屏幕上。
2.应用程序会开始监听和响应事件,如按钮点击、输入框文字变化等。
3.当用户进行操作(如点击按钮),Tkinter 会触发相应的事件处理函数(例如,你设置的 command 参数对应的函数)。
4.如果没有事件发生,应用程序会保持空闲状态,不会占用太多CPU资源。
5.当你关闭窗口或者调用 win.destroy() 时,win.mainloop() 会退出,事件循环结束,应用程序终止。
10. 视频处理页面运行结果图
11.视频处理页面功能展示图
视频处理页面完整代码
import cv2
import tkinter as tk
from tkinter import filedialog
import face_recognition
import os
import subprocess
from PIL import Image, ImageTkwin = tk.Tk()
win.title('Welcome')
win.geometry('750x600')# 背景设计
image = Image.open("12.gif")
image = image.resize((750, 600)) # 调整背景图片大小
photo1 = ImageTk.PhotoImage(image)
canvas = tk.Label(win, image=photo1)
canvas.pack()# 定义一个全局变量来保存视频路径
save_video = None
canvas = None
face_dir = None# 选择视频并自动识别人脸
def xz_video():global save_videofile_path = filedialog.askopenfilename(title="选择视频",filetypes=(("视频文件", "*.mp4;*.avi;*.mkv;*.mov"),("所有文件", "*.*")))if file_path:save_video = file_pathsb_video()# 识别视频并在Canvas上显示
def sb_video():global save_video, canvas, face_dirif save_video:# 创建保存人脸的文件夹if not face_dir:face_dir = 'video_image'if not os.path.exists(face_dir):os.makedirs(face_dir)# 加载视频video_capture = cv2.VideoCapture(save_video)# 初始化Canvascanvas = tk.Canvas(win, width=640, height=480)canvas.place(x=80,y=180)try:# 初始化变量face_count = 0while True:# 抓取一帧视频ret, frame = video_capture.read()if not ret:break# 转换颜色从BGR到RGBrgb_frame = frame[:, :, ::-1]# 查找图像中的人脸位置face_locations = face_recognition.face_locations(rgb_frame)# 在每个检测到的人脸周围画框for top, right, bottom, left in face_locations:cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)# 裁剪人脸并保存face_image = frame[top:bottom, left:right]face_path = os.path.join(face_dir, f'face_{face_count}.jpg')cv2.imwrite(face_path, face_image)face_count += 1# 转换OpenCV图像格式到PIL图像格式pil_image = Image.fromarray(frame[:, :, ::-1])photo = ImageTk.PhotoImage(image=pil_image)# 在Canvas上显示图像canvas.create_image(0, 0, anchor=tk.NW, image=photo)win.update_idletasks()win.update()if cv2.waitKey(1) & 0xFF == ord('q'):breakfinally:# 释放视频video_capture.release()def open_face():if face_dir and os.path.exists(face_dir):os.startfile(face_dir)def close():subprocess.Popen(["python", "动态处理.py"])win.destroy()#按钮设计
image = Image.open("F8.gif") # 加载一张图片
photo2 = ImageTk.PhotoImage(image)
bt1 = tk.Button(win, image=photo2, width=198, height=32,command=xz_video)
bt1.place(x=30, y=30)image = Image.open("F9.gif") # 加载一张图片
photo3 = ImageTk.PhotoImage(image)
bt2 = tk.Button(win, image=photo3, width=198, height=32,command=open_face)
bt2.place(x=275, y=30)image = Image.open("B.gif") # 加载一张图片
photo4 = ImageTk.PhotoImage(image)
bt3 = tk.Button(win, image=photo4, width=198, height=32,command=close)
bt3.place(x=520, y=30)win.mainloop()
十一、相机抓取页面
1.导入所需的包
cv2 (OpenCV):
OpenCV是一个开源的计算机视觉库,它提供了大量用于图像和视频处理的功能。cv2模块是OpenCV的Python接口,它允许您在Python中使用OpenCV的功能。OpenCV广泛用于图像识别、图像处理、物体检测、视频分析等任务。
tkinter:
Tkinter是Python的标准GUI(图形用户界面)库。它提供了一个快速和简单的方式来创建GUI应用程序。tkinter模块是Tkinter库的主模块,包含了创建窗口、按钮、文本框等基本GUI组件的类和函数。
filedialog:
这个模块是tkinter的一个扩展,提供了一个文件对话框,允许用户选择文件或目录。它是tkinter的一部分,通常与tkinter一起使用来创建文件选择器。
face_recognition:
这个模块是一个Python库,用于对人脸进行识别和对图片中的人脸进行定位。它使用深度学习算法来识别人脸,并且可以处理实时视频或静态图片。
os:
os模块提供了与操作系统交互的功能。它提供了用于文件和目录操作的函数,如文件读写、目录遍历、文件路径处理等。
subprocess:
这个模块允许您启动新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回码。通常用于执行系统命令或运行外部程序。
PIL (Python Imaging Library):
PIL是一个强大的图像处理库,它支持多种图像文件格式,并提供了一系列图像处理功能,如打开、修改、保存图像,以及图像处理操作(如缩放、裁剪、颜色转换等)。
import cv2
import os
import tkinter as tk
from tkinter import filedialog
import subprocess
from PIL import Image, ImageTk
2.设置窗口
2.1定义窗口外观和大小
实例化窗口,设置窗口标题,尺寸。
#设置窗口
win=tk.Tk()
win.title('相机抓取')
win.geometry('750x600')
2.2设置窗口背景
2.2.1设置背景图片
调用image对象的resize方法来调整图像的大小。将调整大小后的PIL Image对象转换为Tkinter兼容的PhotoImage对象。
#背景设计
image = Image.open("12.gif")
image = image.resize((750, 600)) # 调整背景图片大小
photo1 = ImageTk.PhotoImage(image)
canvas = tk.Label(win, image=photo1)
canvas.pack()
2.2.2创建label控件
Label控件可以用来显示文本、图像或其他内容。在这里,它被用来显示前面创建的PhotoImage对象,即背景图片。
canvas = tk.Label(win, image=photo1)
canvas.pack()
3.定义全局变量存储文件夹
使用了 None 来初始化它们,这意味着在程序开始时,它们不指向任何具体的文件路径。在实际的应用程序中,您会通过用户的操作或程序的逻辑来更新这些变量,以便它们能够存储图像文件的路径和检测到的人脸图像的路径。
接下来,代码检查这两个文件夹是否已经存在。如果不存在,它会使用 os 模块的 makedirs 函数来创建这些文件夹。os.makedirs 函数会创建指定的文件夹路径,包括所有必要的父文件夹。
# 创建一个文件夹来保存图像,如果文件夹不存在的话
save_images = 'tq_faces'
save_faces = 'tq_faces'
if not os.path.exists(save_images):os.makedirs(save_images)
if not os.path.exists(save_faces):os.makedirs(save_faces)
用法:
save_images:
这个变量被用来保存图像的文件夹路径。在图像处理或显示图像的应用程序中,您可能需要存储用户选择的图像文件的路径,以便之后进行操作,如加载、显示或处理图像。
save_faces:
这个变量被用来保存检测到的人脸图像的文件夹路径。在图像处理和分析的应用程序中,您可能需要存储检测到的人脸的位置或属性,以便后续分析和处理。
4.创建一个实时视频流
4.1加载 Haar 级联分类器
使用 OpenCV 的 CascadeClassifier 函数加载了一个预先训练的人脸检测模型。
# 加载Haar级联分类器用于人脸检测
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
4.2打开摄像头
cap 是一个视频捕获对象,它允许您读取摄像头捕获的帧。
# 打开摄像头(0表示默认摄像头,如果有多个摄像头,可以使用不同的编号)
cap = cv2.VideoCapture(0)
5.定义使用摄像头捕获视频帧的函数
5.1函数定义和初始化
定义了一个名为 xzsp 的函数,并在函数内部初始化了一个帧计数器 frame_count。然后,它进入一个无限循环,用于捕获和处理摄像头捕获的帧。
def xzsp():frame_count = 0 # 初始化帧计数器while True:# 从摄像头中读取一帧图像ret, image = cap.read()
说明:ret 是一个布尔值,表示是否成功读取了帧。如果成功,image 将包含摄像头捕获的帧。
5.2处理摄像头帧
首先将捕获的图像进行水平翻转,因为通常摄像头捕捉到的图像是镜像的。然后,它检查是否成功读取了图像。如果未成功读取图像,可能是由于摄像头故障或未连接,此时循环会提前终止。
# 水平翻转图像,因为通常摄像头捕捉到的图像是镜像的
image = cv2.flip(image, 1)# 如果无法读取图像(可能是摄像头故障或摄像头未连接),则退出循环
if not ret:break
5.3转换图像颜色和检测人脸
将摄像头捕获的图像转换为灰度图像,以便进行人脸检测。然后,它使用 faceCascade 对象(之前在函数外部定义的Haar级联分类器)来检测灰度图像中的人脸。detectMultiScale 函数返回一个包含所有检测到的人脸的边界框的列表。
# 将图像转换为灰度图像,以便进行人脸检测
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 使用Haar级联分类器检测灰度图像中的人脸
faces = faceCascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
5.4处理检测到的人脸
遍历检测到的人脸,并在原始图像上绘制矩形框来标记这些人脸。它还提取每个检测到的人脸,并将其保存到指定的文件夹中。
# 遍历检测到的人脸
for (x, y, w, h) in faces:# 在图像上绘制矩形框来标记检测到的人脸,颜色为绿色,线宽为2cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)# 提取人脸图像并保存到文件夹face_img = image[y:y+h, x:x+w]if face_img.any(): # 检查人脸图像是否为空face_save_path = f"{save_faces}/face_{frame_count}.jpg"cv2.imwrite(face_save_path, face_img)
5.5保存整个图像和显示处理后的图像
保存整个图像到指定的文件夹中,并在一个名为 ‘rljc’ 的窗口中显示带有人脸标记的图像。
# 保存整个图像到文件夹
save_path = f"{save_images}/frame_{frame_count}.jpg"
cv2.imwrite(save_path, image)
frame_count += 1 # 帧计数器增加# 显示带有人脸标记的图像
cv2.imshow('rljc', image)
5.6等待用户操作和退出循环
等待用户操作,如按下键盘上的Esc键(ASCII码为27),并检查是否按下了Esc键。如果按下,循环会提前终止。
# 等待10毫秒,同时检查是否按下了键盘上的Esc键(ASCII码为27)
key = cv2.waitKey(10)# 如果按下了Esc键,则退出循环
if key == 27:break
5.7释放摄像头资源和关闭窗口
释放摄像头资源,并关闭所有打开的图像窗口。
# 释放摄像头资源
cap.release()# 关闭所有打开的图像窗口
cv2.destroyAllWindows()
6.定义选择文件夹的函数
用 os 模块的 startfile 函数来打开这个文件夹。
def xzwj():folder_path = filedialog.askopenfilename(title="选择文件")if os.path.exists(folder_path): # 检查文件夹路径是否存在os.startfile
7.定义关闭窗口的函数
当用户点击一个按钮或执行其他操作以触发 close 函数时,当前的 Tkinter 窗口将被关闭,并且一个新的 Python 进程将被启动来执行 登录页面.py 脚本。
def close():subprocess.Popen(["python","动态页面.py"])win.destroy()
用法:close函数可以用来在应用程序中创建一个简单的退出功能,或者在需要时启动新的应用程序或脚本。
8.按钮设计
8.1打开相机按钮
定义一个名为 bt1 的按钮,该按钮将显示一个前面导入的名为 “F10…gif” 的 图像,并且当用户点击这个按钮时,会执行一个名为 xzsp的函数。
image = Image.open("F10.gif") # 加载一张图片
photo2 = ImageTk.PhotoImage(image)
bt1 = tk.Button(win, image=photo2, width=198, height=32,command=xzsp)
bt1.place(x=30, y=30)
8.2打开文件夹按钮
定义一个名为 bt2 的按钮,该按钮将显示一个前面导入的名为 “F9.gif” 的 图像,并且当用户点击这个按钮时,会执行一个名为 xzwj的函数。
image = Image.open("F9.gif") # 加载一张图片
photo3 = ImageTk.PhotoImage(image)
bt2 = tk.Button(win, image=photo3, width=198, height=32,command=xzwj)
bt2.place(x=275, y=30)
8.3返回按钮
定义一个名为 bt3的按钮,该按钮将显示一个前面导入的名为 “B.gif” 的 图像,并且当用户点击这个按钮时,会执行一个名为 close的函数。
image = Image.open("B.gif") # 加载一张图片
photo4 = ImageTk.PhotoImage(image)
bt3 = tk.Button(win, image=photo4, width=198, height=32,command=close)
bt3.place(x=520, y=30)
用法:close函数通常这个函数用来关闭应用程序窗口。
10.定义关键函数
win.mainloop() 是 Tkinter GUI 应用程序中的一个关键函数,它启动了 Tkinter 的事件循环。
这个事件循环是 GUI 应用程序的核心,它负责处理用户输入(如鼠标点击、按键等),更新窗口内容,以及响应用户的操作。
win.mainloop()
注:当你调用 win.mainloop() 时,以下几件事情会发生:
1.窗口 win 会显示在屏幕上。
2.应用程序会开始监听和响应事件,如按钮点击、输入框文字变化等。
3.当用户进行操作(如点击按钮),Tkinter 会触发相应的事件处理函数(例如,你设置的 command 参数对应的函数)。
4.如果没有事件发生,应用程序会保持空闲状态,不会占用太多CPU资源。
5.当你关闭窗口或者调用 win.destroy() 时,win.mainloop() 会退出,事件循环结束,应用程序终止。
11. 相机抓取页面运行结果图
11.相机抓取功能展示结果图
相机抓取页面完整代码
import cv2
import os
import tkinter as tk
from tkinter import filedialog
import subprocess
from PIL import Image, ImageTk# 初始化Tkinter窗口
win = tk.Tk()
win.title('相机抓取')
win.geometry('750x600')# 背景设计
image = Image.open("11.gif")
image = image.resize((750, 600)) # 调整背景图片大小
photo1 = ImageTk.PhotoImage(image)
canvas = tk.Label(win, image=photo1)
canvas.pack()# 创建一个文件夹来保存图像,如果文件夹不存在的话
save_images = 'tq_faces'
save_faces = 'tq_faces'
if not os.path.exists(save_images):os.makedirs(save_images)
if not os.path.exists(save_faces):os.makedirs(save_faces)# 加载Haar级联分类器用于人脸检测
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')# 打开摄像头(0表示默认摄像头,如果有多个摄像头,可以使用不同的编号)
cap = cv2.VideoCapture(0)def xzsp():frame_count = 0 # 初始化帧计数器while True:# 从摄像头中读取一帧图像ret, image = cap.read()# 水平翻转图像,因为通常摄像头捕捉到的图像是镜像的image = cv2.flip(image, 1)# 如果无法读取图像(可能是摄像头故障或摄像头未连接),则退出循环if not ret:break# 将图像转换为灰度图像,以便进行人脸检测gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 使用Haar级联分类器检测灰度图像中的人脸faces = faceCascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))# 遍历检测到的人脸for (x, y, w, h) in faces:# 在图像上绘制矩形框来标记检测到的人脸,颜色为绿色,线宽为2cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)# 提取人脸图像并保存到文件夹face_img = image[y:y+h, x:x+w]if face_img.any(): # 检查人脸图像是否为空face_save_path = f"{save_faces}/face_{frame_count}.jpg"cv2.imwrite(face_save_path, face_img)# 保存整个图像到文件夹save_path = f"{save_images}/frame_{frame_count}.jpg"cv2.imwrite(save_path, image)frame_count += 1 # 帧计数器增加# 显示带有人脸标记的图像cv2.imshow('rljc', image)# 等待10毫秒,同时检查是否按下了键盘上的Esc键(ASCII码为27)key = cv2.waitKey(10)# 如果按下了Esc键,则退出循环if key == 27:break# 释放摄像头资源cap.release()# 关闭所有打开的图像窗口cv2.destroyAllWindows()def xzwj():folder_path = filedialog.askopenfilename(title="选择文件")if os.path.exists(folder_path): # 检查文件夹路径是否存在os.startfiledef close():subprocess.Popen(["python", "动态处理.py"])win.destroy()#按钮设计
image = Image.open("F10.gif") # 加载一张图片
photo2 = ImageTk.PhotoImage(image)
bt1 = tk.Button(win, image=photo2, width=198, height=32, command=xzsp)
bt1.place(x=210, y=130)image = Image.open("F9.gif") # 加载一张图片
photo3 = ImageTk.PhotoImage(image)
bt2 = tk.Button(win, image=photo3, width=198, height=32, command=xzwj)
bt2.place(x=310, y=230)image = Image.open("B.gif") # 加载一张图片
photo4 = ImageTk.PhotoImage(image)
bt3 = tk.Button(win, image=photo4, width=198, height=32, command=close)
bt3.place(x=440, y=330)win.mainloop()
相关文章:
OpenCv之简单的人脸识别项目(动态处理页面)
人脸识别 准备九、动态处理页面1.导入所需的包2.设置窗口2.1定义窗口外观和大小2.2设置窗口背景2.2.1设置背景图片2.2.2创建label控件 3.定义视频处理脚本4.定义相机抓取脚本5.定义关闭窗口的函数6.按钮设计6.1视频处理按钮6.2相机抓取按钮6.3返回按钮 7.定义关键函数8.动态处理…...
【Linux】进程间通信
目录 一、进程间通信概念 二、进程间通信的发展 三、进程间通信的分类 四、管道 4.1 什么是管道 4.2 匿名管道 4.2 基于匿名管道设计进程池 4.3 命名管道 4.4 用命名管道实现server&client通信 五、system V共享内存 5.1 system V共享内存的引入 5.2 共享内存的…...
UI与前端:揭秘两者的微妙差异
UI与前端:揭秘两者的微妙差异 在数字化时代的浪潮中,UI设计和前端开发已成为塑造用户体验的两大核心力量。然而,这两者之间究竟有何区别?本文将深入剖析UI设计与前端开发的四个方面、五个方面、六个方面和七个方面的差异…...
idea如何根据路径快速在项目中快速打卡该页面
在idea项目中使用快捷键shift根据路径快速找到该文件并打卡 双击shift(连续按两下shift) -粘贴文件路径-鼠标左键点击选中跳转的路径 自动进入该路径页面 例如:我的实例路径为src/views/user/govType.vue 输入src/views/user/govType或加vue后缀src/views/user/go…...
探索成功者的特质——俞敏洪的观点启示
在人生的舞台上,我们常常对成功者充满好奇与敬仰,试图探寻他们成功的奥秘。俞敏洪指出,成功者都具备七个特质,而这些特质与家庭背景和大学的好坏并无直接关系。让我们深入剖析这七个特质,或许能从中获得对我们自身成长…...
MCU的环形FIFO
fifo.h #ifndef __FIFO_H #define __FIFO_H#include "main.h"#define RINGBUFF_LEN (500) //定义最大接收字节数 500typedef struct {uint16_t Head; // 头指针 指向可读起始地址 每读一个,数字1uint16_t Tail; // 尾指针 指…...
使用proteus仿真51单片机的流水灯实现
proteus介绍: proteus是一个十分便捷的用于电路仿真的软件,可以用于实现电路的设计、仿真、调试等。并且可以在对应的代码编辑区域,使用代码实现电路功能的仿真。 汇编语言介绍: 百度百科介绍如下: 汇编语言是培养…...
【漏洞复现】Apache OFBiz 路径遍历导致RCE漏洞(CVE-2024-36104)
0x01 产品简介 Apache OFBiz是一个电子商务平台,用于构建大中型企业级、跨平台、跨数据库、跨应用服务器的多层、分布式电子商务类应用系统。是美国阿帕奇(Apache)基金会的一套企业资源计划(ERP)系统。该系统提供了一整套基于Java的Web应用程序组件和工具。 0x02 …...
数据库表中创建字段查询出来却为NULL?
起因: 今天新创建了一张表,其中一个字段命名为"word_num"带下划线,我在前端页面怎么也查询不出来word_num的值,后来在后端接口处打印了一下数据库查询出来的数据,发现这个字段一直为NULL,然后我就想到是不是…...
缓存方法返回值
1. 业务需求 前端用户查询数据时,数据查询缓慢耗费时间; 基于缓存中间件实现缓存方法返回值:实现流程用户第一次查询时在数据库查询,并将查询的返回值存储在缓存中间件中,在缓存有效期内前端用户再次查询时,从缓存中间件缓存获取 2. 基于Redis实现 参考1 2.1 简单实现 引入…...
【十大排序算法】快速排序
在乱序的世界中,快速排序如同一位智慧的园丁, 以轻盈的手法,将无序的花朵们重新安排, 在每一次比较中,沐浴着理性的阳光, 终使它们在有序的花园里,开出绚烂的芬芳。 文章目录 一、快速排序二、…...
linux系统ubuntu中在命令行中打开图形界面的文件夹
在命令行中打开当前路径,以文件管理器的形式打开: 命令 # 打开文件管理器 当前的路径 nautilus .nautilus 是一个与 GNOME 桌面环境集成的文件管理器的命令行启动程序。在 Linux 系统中,特别是使用 GNOME 作为桌面环境时,用户经…...
【C++11数据结构与算法】C++ 栈
C 栈(stack) 文章目录 C 栈(stack)栈的基本介绍栈的算法运用单调栈实战题LC例题:[321. 拼接最大数](https://leetcode.cn/problems/create-maximum-number/)LC例题:[316. 去除重复字母](https://leetcode.cn/problems/remove-duplicate-letters/) 栈的基…...
pdf文件如何防篡改内容
PDF文件防篡改内容的方法有多种,以下是一些常见且有效的方法,它们可以帮助确保PDF文件的完整性和真实性: 加密PDF文档: 原理:通过设置密码来保护PDF文档,防止未经授权的访问和修改。注意事项:密…...
QT 音乐播放器【二】 歌词同步+滚动+特效
文章目录 效果图概述代码解析歌词歌词同步歌词特效 总结 效果图 概述 先整体说明一下这个效果的实现,你所看到的歌词都是QGraphicsObject,在QGraphicsView上绘制(paint)出来的。也就是说每一句歌词都是一个图元(item)。 为什么用QGraphicsView框架&…...
关于怎么用Cubemx生成的USBHID设备实现读取一体的鼠标键盘设备(改进版)
主要最近做了一个要用STM32实现读取鼠标键盘一体的那种USB设备,STM32的界面上要和电脑一样的能通过这个USB接口实现鼠标移动,键盘的按键。然后我就很自然的去参考了正点原子的例程,可是找了一圈,发现正点原子好像用的库函数&#…...
Soildworks学习笔记(二)
放样凸台基体: 自动生成连接两个物体两个面的基体: 2.旋转切除: 3.剪切实体: 4.转换实体引用: 将实体的轮廓线转换至当前草图使其成为当前草图的图元,主要用于在同一平面或另一个坐标中制作草图实体或其尺寸的副本。 …...
Linux配置uwsgi环境
Linux配置uwsgi环境 1.进入虚拟环境 source /envs/django_-shop-system/bin/activate2.安装uwsgi pip install uwsgi3.基于uwsgi运行项目 – 基于配置文件 在项目目录下创建配置文件 #socket 0.0.0.0:8005 http 0.0.0.0:8005 # http120.55.47.111:8005 chdir/opt/www/djang…...
Nagios的安装和使用
*实验* *nagios安装和使用* Nagios 是一个监视系统运行状态和网络信息的监视系统。Nagios 能监视所指定的本地或远程主机以及服务,同时提供异常通知功能等. Nagios 可运行在 Linux/Unix 平台之上,同时提供一个可选的基于浏览器的 WEB 界面以方便系统管…...
Numba 的 CUDA 示例(4/4):原子和互斥
本教程为 Numba CUDA 示例 第 4 部分。 本系列第 4 部分总结了使用 Python 从头开始学习 CUDA 编程的旅程 介绍 在本系列的前三部分(第 1 部分,第 2 部分,第 3 部分)中,我们介绍了 CUDA 开发的大部分基础知识…...
【机器学习】机器学习引领AI:重塑人类社会的新纪元
📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀机器学习引领AI 📒1. 引言📕2. 人工智能(AI)🌈人工智能的发展🌞应用领…...
【制作面包game】
编写一个制作面包的游戏代码涉及到游戏设计、编程和用户界面设计等多个方面。这里我可以提供一个简化版本的Python代码示例,用于创建一个基本的面包制作游戏。这个游戏将会有一个简单的用户界面,玩家可以通过输入命令来制作面包。 游戏的基本流程如下&a…...
Django更改超级用户密码
Django更改超级用户密码 1、打开shell 在工程文件目录下敲入: python manage.py shell再在python交互界面输入: from django.contrib.auth.models import User user User.objects.get(username root) user.set_password(123456) user.save()其中ro…...
ROS基础学习-ROS通信机制进阶
ROS通信机制进阶 目录 0.简介1.常用API1.1 节点初始化函数1.1.1 C++1.1.2 Python1.2 话题与服务相关函数1.2.1 对象获取相关1.2.1.1 C++1.2.1.2 Python1.2.2 订阅对象相关1.2.2.1 C++1.2.2.2 Python1.2.3 服务对象相关函数1.2.3.1 C++1.2.3.2 Python1.2.4 客户端对象相关1.2.4.…...
【Vue3】shallowReactive() and shallowReadonly()
历史小剧场 所谓历史,就是过去的事,它的残酷之处在于:无论你哀嚎,悲伤,痛苦,落寞,追悔,它都无法改变。 一具有名的尸体躺在无数无名的尸体上,这就是所谓的霸业。---- 《明…...
【javaEE初阶】
🌈🌈🌈关于java ⚡⚡⚡java的由来 我们这篇文章主要是来介绍javaEE,一般称为java企业版,实际上java的历史可以追溯到上个世纪90年代,当时主要的语言主流的还是C语言和C,但是在那个时期嵌入式初…...
深度学习 - 梯度下降优化方法
梯度下降的基本概念 梯度下降(Gradient Descent)是一种用于优化机器学习模型参数的算法,其目的是最小化损失函数,从而提高模型的预测精度。梯度下降的核心思想是通过迭代地调整参数,沿着损失函数下降的方向前进&#…...
Steam下载游戏很慢?一个设置解决!
博主今天重装系统后,用steam下载发现巨慢 500MB,都要下载半小时。 平时下载软件,一般1分钟就搞定了,于是大致就知道,设置应该出问题了 于是修改了,如下设置之后,速度翻了10倍。 如下&#x…...
51单片机采用定时器T1的方式1的中断计数方式,外接开关K4按4次后,8只LED闪烁不停
1、功能描述 采用定时器T1的方式1的中断计数方式,外接开关K4按4次后,8只LED闪烁不停 2、实验原理 定时器原理:8051的定时器可以用于计数外部事件或执行内部定时操作。在本程序中,定时器1被设置为模式2,即8位自动重装载定时器模式…...
windows系统 flutter 开发环境配置
1、管理员运行powershell,安装:Chocolatey 工具,粘贴复制运行下列脚本: Chocolatey 官方安装文档 Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol [System.Net.ServicePointManage…...
商城网站备案能通过吗/网页关键词优化软件
lpad函数从左边对字符串使用指定的字符进行填充基本语法:lpad( string, padded_length, [ pad_string ] )string:准备被填充的字符串padded_length:填充之后的字符串长度,也就是该函数返回的字符串长度,如果这个数量比…...
wordpress插件分享显示/中国新闻
首先声明本文旨在介绍centos环境下安装Docker-CE(社区版),社区版是免费提供给个人开发者和小团队,Docker-EE (企业版)有额外费用,想了解其他系统下搭建,请传送《docker官网》 准备工作 1、docker要求Linux内…...
老网站做seo能不能重新注册/模板网站建设开发
传送门 看到指定的总节点数小于等于 300000 就知道要搞虚树了 考虑如何在虚树确定每个议事处控制的节点数量 可以两遍dfs 第一遍求儿子对父亲的影响,第二遍求父亲对儿子影响 注意搜索顺序,这样就可以把影响扩展到其他子树了 如图: 初始时只有…...
百度怎么做自己的网站/优化大师电脑版官方
靶场搭建小白建议直接用集成环境.推荐laragon (由于这套靶场较早,需要使用php7.0以下环境,安装完php laragon需要在安装php低版本,默认laragon只集成了一个7.0的php),如果不懂怎么安装php低版本到laragon,推荐使用php study. 这款集成工具最大的亮点就是集成了php的各个版本,相…...
重庆做网站的/企业网络营销业务
php实现的简单日历代码。例子:复制代码 代码示例:/*** php简单日历* edit: www.jbxue.com*/if(empty($year))$yeardate("Y"); //初始化年份if(empty($month))$monthdate("n"); //初始化月份$wd_ararray("日","一","二…...
网站底部分享怎么做/建站公司网站源码
1. 父页面获取子页面对象 $("#id_iframe").contents().find("#id_button_test"); 2. 子页面获取父页面对象 var $iframe $(".parentId", parent.document);//对应的javascript版本为:var iframe window.parent.document.getElementById("…...