使用 OpenCV 和 Haar Cascade 检测人脸

技术讲解

1. 环境准备

Python 和 OpenCV

确保你的开发环境中安装了 Python 3.x 和 OpenCV。OpenCV 是一个开源的计算机视觉和机器学习软件库,提供了大量的图像处理和计算机视觉算法。它支持多种编程语言,包括 Python。

安装 OpenCV:

bash 复制代码
pip install opencv-python
2. Haar Cascade 模型

Haar Cascade 分类器

OpenCV 提供了预训练的 Haar Cascade 分类器来检测图像中的人脸。cv2.CascadeClassifier 是用来加载这些分类器的一个类。在这个例子中,我们使用的是 haarcascade_frontalface_default.xml,这是 OpenCV 提供的一个默认的人脸检测模型。

加载 Haar Cascade 模型:

python 复制代码
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
3. CUDA 设备设置

CUDA 设备可见性

如果你的应用程序需要使用 GPU,可以使用环境变量 CUDA_VISIBLE_DEVICES 来设置哪些 GPU 设备是可见的。这在有多个 GPU 的情况下特别有用,可以指定应用程序使用特定的 GPU。

设置 CUDA 可见设备:

python 复制代码
import cv2
import os
from pathlib import Path
import shutil

# 加载预训练的 Haar cascade 模型
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

# 设置 CUDA 可见设备
os.environ["CUDA_VISIBLE_DEVICES"] = "0"  # 设置为你的 GPU 设备号

# 定义参考文件夹
REFERENCE_DIR = "no_faces"
os.makedirs(REFERENCE_DIR, exist_ok=True)
4. 图像处理

加载和调整大小

为了提高检测效率,通常会对图像进行缩放。缩放可以减少处理时间,同时保持足够的分辨率来进行人脸检测。

加载并调整图像大小:

python 复制代码
def load_and_resize_image(file_path, max_size=1024):
    image = cv2.imread(file_path)
    if image is None:
        raise FileNotFoundError(f"Could not load image from {file_path}")
    
    height, width = image.shape[:2]
    scale = min(max_size / height, max_size / width)
    image = cv2.resize(image, (int(width * scale), int(height * scale)))
    return image

人脸检测

使用 Haar Cascade 分类器检测图像中的人脸。detectMultiScale 方法接受多个参数,其中 scaleFactor 控制每次图像尺寸变化的比例因子,minNeighbors 表示检测到的目标周围至少有多少个邻居才能认定为真实目标,minSize 表示检测到的目标的最小尺寸。

检测图像中的人脸:

python 复制代码
def detect_faces(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    face_rects = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
    return face_rects
5. 文件操作

移动图片

当检测到图片中没有人脸时,将图片移动到一个特定的文件夹中。使用 shutil.move 函数可以轻松实现这一点。

移动图片到无脸文件夹:

python 复制代码
def move_image_to_no_faces_folder(file_path):
    destination = Path(REFERENCE_DIR) / file_path.name
    shutil.move(str(file_path), str(destination))
6. 主函数

最后,编写一个主函数来处理指定文件夹中的所有 .png 图片,并调用上述函数完成人脸检测和图片分类。

处理图片:

python 复制代码
def process_image(png_file):
    try:
        print(f"Processing {png_file.name}...")
        image = load_and_resize_image(png_file)
        face_rects = detect_faces(image)
        
        if len(face_rects) == 0:
            print(f"No faces detected in {png_file.name}. Moving to no_faces folder.")
            move_image_to_no_faces_folder(png_file)
        else:
            print(f"Faces detected in {png_file.name}.")
    except Exception as e:
        print(f"Error processing {png_file.name}: {str(e)}")

def process_images(directory):
    directory_path = Path(directory)
    png_files = list(directory_path.glob('*.png'))
    
    for png_file in png_files:
        process_image(png_file)

if __name__ == "__main__":
    input_directory = 'images'  # 请确保这个路径是正确的
    process_images(input_directory)

总结

通过上述代码,我们可以自动检测图片中是否存在人脸,并将无人脸的图片分类到特定文件夹中。这种方法在处理大量图片时非常有用,特别是在需要对图片进行初步筛选的情况下。使用 OpenCV 的 Haar Cascade 模型和 Python 的标准库函数,我们可以轻松实现这一功能。

相关推荐
Allen_LVyingbo32 分钟前
数智读书笔记系列035《未来医疗:医疗4.0引领第四次医疗产业变革》
人工智能·经验分享·笔记·健康医疗
zzc92137 分钟前
时频图数据集更正程序,去除坐标轴白边及调整对应的标签值
人工智能·深度学习·数据集·标签·时频图·更正·白边
isNotNullX38 分钟前
什么是数据分析?常见方法全解析
大数据·数据库·数据仓库·人工智能·数据分析
riveting1 小时前
明远智睿H618:开启多场景智慧生活新时代
人工智能·嵌入式硬件·智能硬件·lga封装·3506
夜阑卧听风吹雨,铁马冰河入梦来1 小时前
Spring AI 阿里巴巴学习
人工智能·学习·spring
c7691 小时前
【文献笔记】Automatic Chain of Thought Prompting in Large Language Models
人工智能·笔记·语言模型·论文笔记
Blossom.1182 小时前
机器学习在智能供应链中的应用:需求预测与物流优化
人工智能·深度学习·神经网络·机器学习·计算机视觉·机器人·语音识别
Gyoku Mint2 小时前
深度学习×第4卷:Pytorch实战——她第一次用张量去拟合你的轨迹
人工智能·pytorch·python·深度学习·神经网络·算法·聚类
zzywxc7872 小时前
AI大模型的技术演进、流程重构、行业影响三个维度的系统性分析
人工智能·重构
点控云2 小时前
智能私域运营中枢:从客户视角看 SCRM 的体验革新与价值重构
大数据·人工智能·科技·重构·外呼系统·呼叫中心