一、相机抓取人脸并保存文件夹内
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()
运行结果:
大家可以自己拿着代码去尝试一下!!背景图片可以给注释掉