当前位置: 首页 > article >正文

OpenCVHaar级联器实现人脸捕捉和微笑检测

概念

  • Haar 级联分类器是由多个简单分类器组成的复杂分类器,每个简单分类器都由 Haar 特征训练得到。
  • Haar 级联器因其简单和快速而被应用于某些场景。
  • OpenCV 提供多种预训练的 Haar 特征级联分类器,其已经在大量图像上进行了训练,并且针对特定类型的对象检测进行了优化。用户可以直接下载使用这些预训练模型,无需自己从头开始训练。

级联器实现人脸捕捉步骤:

  1. 安装opencv库:pip install opencv-contrib-python。国内镜像:pip install opencv-contrib-python -i https://pypi.tuna.tsinghua.edu.cn/simple。
  2. 下载haarcascades包。
  3. 开始写代码。
流程图例

1.

2.

步骤3代码:
import cv2


def detect_faces(frame, face_cascade):
    # 将帧转换为灰度图像,以减少计算量并提高检测速度
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 检测灰度图像中的人脸
    faces = face_cascade.detectMultiScale(
        gray,
        scaleFactor=1.1,  # 图像缩放比例
        minNeighbors=5,  # 检测到的对象至少要有5个邻居
        minSize=(30, 30),  # 对象的最小尺寸
        flags=cv2.CASCADE_SCALE_IMAGE
    )

    # 在每个检测到的人脸周围画矩形框
    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)

    return frame


# 加载预训练的 Haar 特征级联分类器模型
face_cascade = cv2.CascadeClassifier('./haarcascades/haarcascade_frontalface_alt2.xml')

# 打开摄像头
cap = cv2.VideoCapture(0)

while True:
    # 从摄像头读取一帧
    ret, frame = cap.read()

    # 如果读取帧失败,则退出循环
    if not ret:
        print("无法获取摄像头数据,退出程序。")
        break

    # 使用 Haar 级联分类器检测人脸
    frame_with_faces = detect_faces(frame, face_cascade)

    # 显示结果帧
    cv2.imshow('Face Detection', frame_with_faces)

    # 按 'q' 键退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放摄像头资源并关闭窗口
cap.release()
cv2.destroyAllWindows()

级联器实现微笑检测:

环境安装同上,注意路径引用就可,导包没啥好讲的。

代码: 
#导入opencv库,安装可用 pip install opencv-python
import cv2
#加载人脸检测模型
face = cv2.CascadeClassifier('./haarcascades/haarcascade_frontalface_default.xml')
#加载微笑检测模型
smile = cv2.CascadeClassifier('./haarcascades/haarcascade_smile.xml')

cap = cv2.VideoCapture(0)  # 初始化摄像头
while True:  # 处理每一帧
    ret, frame = cap.read()  # 读取一帧
    frame = cv2.flip(frame, 1)  # 图片翻转, 水平翻转
    # 没有读到,直接退出
    if ret is None:
        break

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 灰度化(彩色BGR-->灰度Gray)

    face_detect = face.detectMultiScale(gray,  # 人脸检测
                                        scaleFactor=1.1,
                                        minNeighbors=5,
                                        minSize=(5, 5))

    # ==================处理每个人脸=======================
    for (x, y, w, h) in face_detect:  # 得到人脸所在位置
        # 绘制方框
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
        # 提取人脸所在区域
        smile_rect = gray[y:y + h, x:x + w]
        # 微笑检测,仅在人脸区域内检测
        smile_detect = smile.detectMultiScale(smile_rect,
                                              scaleFactor=1.5,
                                              minNeighbors=5,
                                              minSize=(50, 50))

        for (sx, sy, sw, sh) in smile_detect:
            # 显示文字“smile”表示微笑了
            cv2.putText(frame, 'smile', (x, y), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0, 255, 0), 2)
    # 显示结果
    cv2.imshow('frame', frame)
    key = cv2.waitKey(1)
    if key == 27:  # 27为键盘Esc键
        break

cv2.destroyAllWindows()  # 关闭打开的图像窗口
cap.release()  # 释放视频捕获对象


http://www.kler.cn/a/313089.html

相关文章:

  • 红日靶机(七)笔记
  • 量化交易系统开发-实时行情自动化交易-3.4.2.Okex行情交易数据
  • 使用 Vue 配合豆包MarsCode 实现“小恐龙酷跑“小游戏
  • 15 个改变世界的开源项目:塑造现代技术的先锋力量
  • git初始化和更新项目中的子模块
  • 深入了解Git、GitHub、GitLab及其应用技巧
  • 煤矿智慧矿井数据集 (1.煤矿采掘工作面智能分析数据集2.煤矿井下钻场智能分析数据集 )
  • en造数据结构与算法C# 群组行为优化 和 头鸟控制
  • Flink 中 Checkpoint 的底层原理和机制
  • Java客户端SpringDataRedis(RedisTemplate使用)
  • Neko一个在Docker环境下的虚拟浏览器
  • 大数据-142 - ClickHouse 集群 副本和分片 Distributed 附带案例演示
  • Day69补 前后端分离思想
  • JAVA毕业设计176—基于Java+Springboot+vue3的交通旅游订票管理系统(源代码+数据库)
  • 【HTML5】html5开篇基础(1)
  • 【学习笔记】数据结构(六 ①)
  • 通过markdown表格批量生成格式化的word教学单元设计表格
  • 基于深度学习的花卉智能分类识别系统
  • 【win工具】win安装flameshot并设置截图快捷键
  • 【Python报错已解决】xlrd.biffh.XLRDError: Excel xlsx file; not supported
  • C++自动寻径算法
  • 《黑神话悟空》开发框架与战斗系统解析
  • 4.C++中程序中的命名空间
  • git 本地分支误删,怎么恢复?误删本地已提交未推送的分支!
  • 基于Python实现一个浪漫烟花秀
  • 如何设置 Django 错误邮件通知 ?