文章目录
介绍
睁眼闭眼检测,
对给定文件夹中的所有图片进行睁眼闭眼检测,并将带有检测结果的可视化图片保存到另一个文件夹中。如果在图片中未检测到脸部,代码会在图片上添加"No face"标签(红色字体),并保存结果。这是通过OpenCV库中的Haar级联分类器实现的。
三种检测结果:
1,没有检测到脸,no face 红色
2,没有检测到睁眼,Eyes closed 红色,脸部边框 蓝色
3,检测到睁眼,Eyes open 绿色,脸部边框 蓝色
代码的解释
1. 导入库
import cv2
import os
这里我们导入了两个库:
cv2
:OpenCV库,用于图像处理和计算机视觉任务。os
:操作系统接口模块,用于处理文件和目录。
2. 定义主要函数
def detect_eyes_in_folder(input_folder, output_folder):
这个函数接受两个参数:
input_folder
:包含待处理图片的输入文件夹路径。output_folder
:保存处理结果图片的输出文件夹路径。
3. 加载Haar级联分类器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
这里我们加载了预训练的Haar级联分类器:
haarcascade_frontalface_default.xml
:用于脸部检测。haarcascade_eye.xml
:用于眼睛检测。
4. 确保输出文件夹存在
if not os.path.exists(output_folder):
os.makedirs(output_folder)
这段代码检查输出文件夹是否存在,如果不存在则创建该文件夹。
5. 遍历输入文件夹中的所有图片
for filename in os.listdir(input_folder):
if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
image_path = os.path.join(input_folder, filename)
output_path = os.path.join(output_folder, filename)
这里我们遍历输入文件夹中的所有文件,检查每个文件是否是图片(扩展名为.png
、.jpg
或.jpeg
)。对于每张图片,生成对应的输入路径和输出路径。
6. 读取和处理每张图片
img = cv2.imread(image_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
我们使用OpenCV读取图片并将其转换为灰度图像,以便进行脸部和眼睛检测。
7. 检测脸部
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
使用Haar级联分类器检测脸部。如果没有检测到脸部,则在图片上添加"No face"标签并保存结果。
8. 处理没有检测到脸部的情况
if len(faces) == 0:
cv2.putText(img, "No face", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
cv2.imwrite(output_path, img)
print(f"No face detected in {filename}")
continue
如果没有检测到脸部,我们在图片上添加"No face"标签,并保存处理后的图片,然后继续处理下一张图片。
9. 对每个检测到的脸部进行处理
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
我们在检测到的脸部周围绘制一个蓝色的矩形框,并提取脸部区域进行进一步的眼睛检测。
10. 检测眼睛并添加标签
eyes = eye_cascade.detectMultiScale(roi_gray)
if len(eyes) == 0:
cv2.putText(img, "Eyes closed", (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 2)
else:
for (ex, ey, ew, eh) in eyes:
cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2)
cv2.putText(img, "Eyes open", (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
我们使用Haar级联分类器检测脸部区域内的眼睛。如果未检测到眼睛,我们在图片上添加"Eyes closed"标签;否则,在眼睛周围绘制绿色矩形框,并添加"Eyes open"标签。
11. 保存处理结果
cv2.imwrite(output_path, img)
print(f"Processed {filename}")
将处理后的图片保存到输出文件夹,并打印处理信息。
12. 测试代码
input_folder = 'path_to_input_folder'
output_folder = 'path_to_output_folder'
detect_eyes_in_folder(input_folder, output_folder)
将input_folder
变量替换为包含待处理图片的文件夹路径,将output_folder
变量替换为保存处理结果的文件夹路径,然后运行代码。
总结
这段代码通过批量处理文件夹中的图片,实现了对每张图片的脸部和眼睛检测,并将结果以可视化方式保存到指定的输出文件夹中。如果在图片中未检测到脸部,代码会在图片上添加"No face"标签并保存结果。这个代码可用于简单的脸部和眼睛检测任务,
帮助快速批量处理图片。
样例展示
完整脚本
import cv2
import os
def detect_eyes_in_folder(input_folder, output_folder):
# 加载Haar级联文件
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
# 确保输出文件夹存在
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# 遍历输入文件夹中的所有图片
for filename in os.listdir(input_folder):
if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
image_path = os.path.join(input_folder, filename)
output_path = os.path.join(output_folder, filename)
# 读取图像
img = cv2.imread(image_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 检测面部
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
if len(faces) == 0:
print(f"No face detected in {filename}")
continue
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
# 检测眼睛
eyes = eye_cascade.detectMultiScale(roi_gray)
if len(eyes) == 0:
cv2.putText(img, "Eyes closed", (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 2)
else:
for (ex, ey, ew, eh) in eyes:
cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2)
cv2.putText(img, "Eyes open", (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
# 保存结果
cv2.imwrite(output_path, img)
print(f"Processed {filename}")
# 测试代码
input_folder = 'img2'
output_folder = 'img2_out'
detect_eyes_in_folder(input_folder, output_folder)