人脸识别系统---相机抓取人脸(详细解析!!!)

一、相机抓取人脸并保存文件夹内

1.导入模块

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

2.分别创建两个文件夹,将提取人脸后的图像和识别到人脸的图像放在一个文件夹里

save_images = 'tq_faces'
save_faces = 'tq_faces'

3.判断文件夹是否存在,不存在则创建

if not os.path.exists(save_images):
    os.makedirs(save_images)
if not os.path.exists(save_faces):
    os.makedirs(save_faces)

4.使用OpenCV库来加载一个预训练的Haar级联分类器,用于人脸检测

faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

CascadeClassifier是OpenCV中用于对象检测的一个类;
XML文件包含了训练好的Haar级联分类器的参数;
加载了faceCascade,你就可以使用它来检测图像中的人脸;涉及到将图像转换为灰度,然后使用detectMultiScale方法来找到图像中所有的人脸位置

5.打开摄像头(0表示默认摄像头,如果有多个摄像头,可以使用不同的编号)

cap = cv2.VideoCapture(0)

5.1定义函数,初始化一个变量frame_count,用于捕获帧数

def xzsp():
frame_count = 0  # 初始化帧计数器

5.2开始无限循环,遇到break语句才会结束

while True:

5.3使用cap.read()方法从视频捕获对象cap中读取一帧图像

  # 从摄像头中读取一帧图像
    ret, image = cap.read()

5.4调用cv2.flip()方法使图像水平翻转

 # 水平翻转图像,因为通常摄像头捕捉到的图像是镜像的
    image = cv2.flip(image, 1)

5.5如果无法读取图像(可能是摄像头故障或摄像头未连接),则退出循环

 if not ret:
        break

5.6将图像转换为灰度图像,以便进行人脸检测,通常在灰度图像上进行

   gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

5.7列表faces包含了检测到的人脸的矩形坐标

   # 使用Haar级联分类器检测灰度图像中的人脸
    faces = faceCascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

    # 遍历检测到的人脸
    for (x, y, w, h) in faces:

5.8在图像上绘制矩形框来标记检测到的人脸,颜色为绿色,线宽为2

  cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)

5.9提取人脸图像并保存到文件夹

  face_img = image[y:y+h, x:x+w]

5.10检查人脸图像是否为空,不为空,就保存到指定文件夹中

 if face_img.any():  
            face_save_path = f"{save_faces}/face_{frame_count}.jpg"
            cv2.imwrite(face_save_path, face_img)

5.11保存整个图像到文件夹

 save_path = f"{save_images}/frame_{frame_count}.jpg"
    cv2.imwrite(save_path, image)
    frame_count += 1  # 帧计数器增加

5.12使用imshow的方法显示带有人脸标记的图像

  cv2.imshow('rljc', image)

    # 等待10毫秒,同时检查是否按下了键盘上的Esc键(ASCII码为27)
    key = cv2.waitKey(10)

5.13如果按下了Esc键,则退出循环

if key == 27:
        break

5.14释放摄像头资源,结束摄像头捕获

   cap.release()

5.15关闭所有打开的图像窗口

 cv2.destroyAllWindows()

6.选择文件

def xzwj():
    folder_path = filedialog.askopenfilename(title="选择文件")

    if os.path.exists(folder_path):  # 检查文件夹路径是否存在
        os.startfile(folder_path)  # 打开选择的文件

7.返回指定界面

def close():
    subprocess.Popen(["python", "动态处理.py"])
    win.destroy()

8.全部代码:

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('600x450')

# 背景设计
image = Image.open("img/相机抓取背景.gif")
image = image.resize((600, 450))  # 调整背景图片大小
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("img/F10.gif")  # 加载一张图片
photo2 = ImageTk.PhotoImage(image)
bt1 = tk.Button(win, image=photo2, width=198, height=32, command=xzsp)
bt1.place(x=190, y=130)

image = Image.open("img/F9.gif")  # 加载一张图片
photo3 = ImageTk.PhotoImage(image)
bt2 = tk.Button(win, image=photo3, width=198, height=32, command=xzwj)
bt2.place(x=190, y=230)

image = Image.open("img/T.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()

运行结果:
在这里插入图片描述
在这里插入图片描述
大家可以自己拿着代码去尝试一下!!背景图片可以给注释掉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值