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_video
    file_path = filedialog.askopenfilename(title="选择视频",
                                           filetypes=(("视频文件", "*.mp4;*.avi;*.mkv;*.mov"),
                                                      ("所有文件", "*.*")))
    if file_path:
        save_video = file_path
        sb_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 = 0

    while True:
        # 抓取一帧视频
        ret, frame = video_capture.read()
        if not ret:
            break

        # 转换颜色从BGR到RGB
        rgb_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, ImageTk

win = 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_video
    file_path = filedialog.askopenfilename(title="选择视频",
                                           filetypes=(("视频文件", "*.mp4;*.avi;*.mkv;*.mov"),
                                                      ("所有文件", "*.*")))
    if file_path:
        save_video = file_path
        sb_video()

# 识别视频并在Canvas上显示
def sb_video():
    global save_video, canvas, face_dir
    if 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)

        # 初始化Canvas
        canvas = tk.Canvas(win, width=640, height=480)
        canvas.place(x=80,y=180)

        try:
            # 初始化变量
            face_count = 0

            while True:
                # 抓取一帧视频
                ret, frame = video_capture.read()
                if not ret:
                    break

                # 转换颜色从BGR到RGB
                rgb_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
        finally:
            # 释放视频
            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:
    # 在图像上绘制矩形框来标记检测到的人脸,颜色为绿色,线宽为2
    cv2.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:
            # 在图像上绘制矩形框来标记检测到的人脸,颜色为绿色,线宽为2
            cv2.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.startfile

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Web前端

Web前端: 1.建立web开发的息维模式写代码不仅仅是为了实现某个功能,更是学习解决问题的思维方式 2.先使用,再理解,会导致刚开始比较懵,不知其所以然.切忌不可深陷其中, 3.涉及简单的软件工程的设计思想&…

您的游戏端被攻击了怎么办,德迅云安全的应用加速来帮您

游戏行业DDoS攻击的主要原因是因为游戏产品生命周期偏短,而DDoS供给成本又不高,只要发起攻击,企业为确保游戏稳定运营而不得不快速做出让步,致使敲诈勒索的成功率相对更高。在遭受DDoS攻击后,游戏公司的日损失甚至多达…

AI 绘画零基础想入门学习AIGC,该如何学习呢?

近年来,随着人工智能的兴起,人工智能逐渐进入制造业、医疗、服务业等越来越多的行业。这些行业大多是劳动密集型行业,大多数人认为人工智能只能在劳动密集型行业执行任务,而创意领域是人工智能的禁区。但实际情况是,人…

倍福:驱动电机两种控制方式对比

驱动电机两种控制方式对比 验证用修改Override值控制电机转速的实际效果 规定反复启动Mc_MoveVelocity功能块为方法一&#xff0c;修改Override值为方法二 control_drive.cpp #include <ros/ros.h> #include <geometry_msgs/Twist.h> #include "myAds.hpp&…

【基础】LwM2M 通讯协议

【基础】LwM2M 通讯协议 LwM2M 协议基础LwM2M 简介LwM2M 基本架构LwM2M 资源定义 LwM2M 协议实现开源协议实现Java LwM2M Client LwM2M 协议基础 LwM2M 简介 LwM2M 的全称为 Lightweight Machine-To-Machine&#xff0c;是一种适用于物联网设备的轻量级的通讯协议&#xff0c…

再也不怕消息遗漏了,团队协作最强辅助:可道云teamOS协作通知功能,及时通知项目进展,让协作更高效

大家是否曾遇到过这样的困扰&#xff1a;在网盘中进行协作时&#xff0c;由于无法及时了解文件的最新变化&#xff0c;导致信息滞后&#xff0c;影响工作效率&#xff1f;甚至因为未能及时跟进文件更新&#xff0c;阻碍团队协作和项目推进&#xff0c;从而给团队造成严重后果。…

技巧:合并ZIP分卷压缩包

如果ZIP压缩文件文件体积过大&#xff0c;大家可能会选择“分卷压缩”来压缩ZIP文件&#xff0c;那么&#xff0c;如何合并zip分卷压缩包呢&#xff1f;今天我们分享两个ZIP分卷压缩包合并的方法给大家。 方法一&#xff1a; 我们可以将分卷压缩包&#xff0c;通过解压的方式…

C#——break、continue、goto关键字的使用

break break是搭配循环语句使用的&#xff0c;用于跳出循环。 举例 : 当for循环执行到第5次时&#xff0c;使用break方法 跳出循环。 continue continue 语句的工作原理与 break 语句类似&#xff0c;但是 continue 语句并不会跳出整个循环&#xff0c;而是跳过本次循环继续执…

idea修改国际化语言教程

教程背景 第一种&#xff0c;如果以前的项目已经有国际化语言了&#xff0c;现在的项目是导入的。 第二种&#xff0c;你中途把idea删除卸载了&#xff0c;在安装了别的版本&#xff0c;把这个项目导入进来后的。 第三种&#xff0c;你下载或复制的别人的项目。 以上这三种…

# log.info(“消息发送成功“); 红色报错 解决方案

log.info(“消息发送成功”); 红色报错 解决方案 一、错误描述&#xff1a; 在使用 idea 创建 maven 项目导入 lombok 依赖时&#xff0c;出现 log.info 报红错误&#xff0c;检查导入依赖正确&#xff0c;网络正常&#xff0c;错误依旧。 二、解决方案&#xff1a; 1、在 i…

Vue3+.NET6前后端分离式管理后台实战(二十六)

1&#xff0c;Vue3.NET6前后端分离式管理后台实战(二十六)已经在微信公众号更新&#xff0c;有兴趣的扫码关注一起交流学习。

智能家居——Kompas.ai如何改变我们的生活

引言 在现代生活中&#xff0c;智能家居逐渐成为提升生活质量的重要手段。随着科技的进步&#xff0c;智能家居的应用越来越广泛。本文将探讨智能家居的发展趋势&#xff0c;并介绍Kompas.ai如何通过AI技术改变我们的家庭生活。 智能家居的发展及其重要性 智能家居的概念起源…

现在有一个生产计划,甲乙丙3个品类共16个产品,生产时间6天,每天甲品类可以生产1张单,乙3张,丙1张,请用MySQL写出H列的效果

现在有一个生产计划&#xff0c;甲乙丙3个品类共16个产品&#xff0c;生产时间6天&#xff0c;每天甲品类可以生产1张单&#xff0c;乙3张&#xff0c;丙1张&#xff0c;请用MySQL写出H列的效果吗&#xff1f; 最终展示结果要求为&#xff1a; 品类产品生产时间开始生产时间…

IIS 服务器,下载APK 文件,用于发布更新最新的APK包

IIS 默认情况下无法下载 .apk 文件&#xff0c;需要对 IIS 服务进行设置 1、打开 IIS 对应的应用 选中MIME 类型 右键 打开功能 2、右键添加 文件扩展名&#xff1a;.apk MIME 类型输入&#xff1a;application/vnd.android.package-archive 3、重启应用 4、浏览器访问 服务地…

开发构建一个体育数据资料库:不同数据的具体意义

构建一个体育数据资料库&#xff0c;应包括“赛程赛果”、“比赛阵容”、“比赛指数”、“比赛详情”、“统计数据”以及“榜单数据”等关键信息。而借助东莞梦幻网络科技的源码&#xff0c;您可以打造一个属于自己的体育直播平台。通过该平台的资料库展示模块&#xff0c;您能…

下载centos7镜像及在VMware上安装Linux (Centos7)操作系统详细教程

文章目录 下载centos7镜像文件及在VMware上安装centos7详细教程一、下载Centos7镜像二、 利用VM安装Centos7进入VM软件安装配置虚拟机 安装Centos7进入图形化界面配置 三、访问外网 配置IP地址结语Linux配置IP网卡Linux配置本地yum源 下载centos7镜像文件及在VMware上安装cento…

Cesium开发环境搭建

由于win7搭建很费事&#xff0c;重新安装了OS&#xff0c;win10的。 记录一下&#xff0c;搭建步骤&#xff1a; 1.下载node.js。百度搜索即可下载对应的版本。下载cesium。 2.安装node.js。安装后&#xff0c;输入node -v&#xff0c;显示版本信息&#xff0c;表示安装成功…

windows下使用命令清空U盘

1、CMD命令打开后输入diskpart命令打开磁盘分区管理工具 diskpart打开如下窗口 Microsoft DiskPart 版本 10.0.19041.3636 Copyright (C) Microsoft Corporation. 在计算机上: DESKTOP-TR9HQRP 2、输入查看所有磁盘命令 list disk打印如下windows 磁盘 ###  状态    …

并查集,CF1619G - Unusual Minesweeper

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1619G - Codeforces 二、解题报告 1、思路分析 考虑距离在k内的两点可以合并 那么不断合并可以得到若干连通块 每个连通块自然爆炸的时间取决于连通块内的最早爆炸时间 我们还可以在每个时间点…

海外转仓系统应用案例解读:如何高效快速解决海外仓补货需求

海外仓转仓在跨境电商中是一个非常重要的业务类型&#xff0c;所谓的海外仓转仓&#xff0c;也就是指客户讲货物发送到某个海外仓后&#xff0c;根据业务需求&#xff0c;将货物中专到另一个海外仓的过程。 主要是应用在补货、销售渠道调整或者临时仓储需求上。对海外仓来说&a…