睁眼闭眼检测 python opencv

介绍

睁眼闭眼检测,
对给定文件夹中的所有图片进行睁眼闭眼检测,并将带有检测结果的可视化图片保存到另一个文件夹中。如果在图片中未检测到脸部,代码会在图片上添加"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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CSPhD-winston-杨帆

给我饭钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值