opencv实现级联分类器检测人脸

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本文使用opencv和级联分类器简单实现人脸检测


一、去github下载级联分类器文件(.xml)

github链接: 级联分类器

如下面是github对应界面,里面其实有很多检测文件,包括检测猫脸,人眼,人身体等等,大家可自行尝试。点击你需要下载的文档,进入后右上角有下载按钮,当然,你也可以新建一个txt文档,复制内容,再修改后缀为.xml。

二、使用步骤

代码如下(示例):

import cv2
import numpy as np

def load_image(image_path):
    """
    读取图像文件。

    参数:
    - image_path: 图像文件的路径。

    返回:
    - img: 读取的图像,失败时返回None。
    """
    try:
        img = cv2.imread(image_path)
        if img is None:
            print("Error: 图像文件读取失败,请检查路径是否正确。")
            return None
        return img
    except Exception as e:
        print(f"图像文件读取时发生异常: {str(e)}")
        return None

def draw_heart_shape(image, center, size, color, thickness):
    """
    在图像上绘制爱心形状。

    参数:
    - image: 输入图像。
    - center: 爱心中心点坐标 (x, y)- size: 爱心的大小 (宽度, 高度)- color: 爱心的颜色 (B, G, R)- thickness: 填充厚度,-1 表示填充整个形状。
    """
    # 定义爱心的轮廓点
    points = np.array([
        [center[0] - size[0], center[1] - size[1]],
        [center[0] - size[0] * 0.7, center[1] - size[1] * 0.5],
        [center[0] - size[0] * 0.3, center[1] - size[1] * 0.5],
        [center[0], center[1]],
        [center[0] + size[0] * 0.3, center[1] - size[1] * 0.5],
        [center[0] + size[0] * 0.7, center[1] - size[1] * 0.5],
        [center[0] + size[0], center[1] - size[1]],
        [center[0] + size[0] * 0.7, center[1] - size[1] * 0.3],
        [center[0] + size[0] * 0.3, center[1] - size[1] * 0.3],
        [center[0], center[1]],
        [center[0] - size[0] * 0.3, center[1] - size[1] * 0.3],
        [center[0] - size[0] * 0.7, center[1] - size[1] * 0.3]
    ], dtype=np.int32)

    # 使用cv2.fillPoly填充爱心形状
    cv2.fillPoly(image, [points], color=color, lineType=cv2.LINE_AA)

def detect_and_draw_faces(image_path, cascade_path):
    """
    检测并绘制人脸爱心框。

    参数:
    - image_path: 图像文件的路径。
    - cascade_path: 级联分类器文件的路径。
    """
    # 加载图像
    img = load_image(image_path)
    if img is None:
        return

    # 转换为灰度图像
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # 加载预训练的分类器
    face_cascade = cv2.CascadeClassifier(cascade_path)
    if face_cascade.empty():
        print("Error: 无法加载级联分类器。")
        return

    # 检测人脸
    # 调整参数以提高检测精度
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3, minSize=(30, 30))

    # 如果未检测到人脸,则输出提示信息
    if len(faces) == 0:
        print("Info: 未检测到人脸。")
    else:
        # 绘制人脸爱心框
        for (x, y, w, h) in faces:
            # 计算爱心中心点
            center_x = x + w // 2
            center_y = y + h // 2
            # 计算爱心大小
            heart_size = (w // 2, h // 2)
            # 绘制爱心
            draw_heart_shape(img, (center_x, center_y), heart_size, (255, 192, 203), -1)

    # 显示结果
    # 调整结果大小再显示
    cv2.imshow("Face Detection", cv2.resize(img, (800, 600)))

    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 定义变量存储路径和参数
image_path = r"C:\Users\86188\Pictures\Screenshots\man.png"
cascade_path = r"C:\Users\86188\Downloads\haarcascade_frontalface_alt2.xml"

# 调用函数进行人脸检测和绘制
detect_and_draw_faces(image_path, cascade_path)


总结

代码注意修改为自己保存的.xml,文件路径和图片路径,这里我使用的绝对路径。我的运行效果如下,本来是画爱心,但成了抽象的眉毛。
在这里插入图片描述

  • 18
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值