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

Python基于OpenCV实现的人脸识别和笑容检测

目录

一、环境配置

二、步骤概述

三、完整代码实现

四、代码解析

五、运行效果

六、优化与调整


一、环境配置

首先,确保你已经安装了所需的库:

pip install opencv-python opencv-python-headless

二、步骤概述

  1. 加载预训练模型:OpenCV 提供了人脸检测和笑容检测的预训练分类器模型。
  2. 检测人脸:使用人脸检测算法(如 Haar 特征级联分类器)。
  3. 笑容检测:在检测到的人脸区域内,进一步检测是否存在笑容。
  4. 显示结果:在原始图像上标出检测到的人脸和笑容。

三、完整代码实现

import cv2

# 1. 加载预训练的分类器
# 这里使用 OpenCV 提供的 Haar 特征级联分类器用于人脸和笑容检测
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
smile_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_smile.xml')

# 2. 读取图像(可以用摄像头替换图像路径)
image = cv2.imread('test_image.jpg')

# 3. 转为灰度图像(人脸检测和笑容检测一般使用灰度图像)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 4. 人脸检测
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30), flags=cv2.CASCADE_SCALE_IMAGE)

# 5. 遍历检测到的人脸
for (x, y, w, h) in faces:
    # 在原图上标出人脸区域
    cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 2)

    # 获取人脸区域的灰度图像
    roi_gray = gray[y:y + h, x:x + w]
    roi_color = image[y:y + h, x:x + w]

    # 6. 在每个人脸区域内进行笑容检测
    smiles = smile_cascade.detectMultiScale(roi_gray, scaleFactor=1.8, minNeighbors=20, minSize=(25, 25))

    # 7. 如果检测到笑容
    for (sx, sy, sw, sh) in smiles:
        # 在笑容区域绘制矩形
        cv2.rectangle(roi_color, (sx, sy), (sx + sw, sy + sh), (0, 255, 0), 2)
        cv2.putText(image, 'Smile detected', (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)

# 8. 显示结果图像
cv2.imshow('Face and Smile Detection', image)

# 等待按键后关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

四、代码解析

  1. 加载分类器

    • OpenCV 提供了预训练的 Haar 级联分类器文件,分别用于人脸检测(haarcascade_frontalface_default.xml)和笑容检测(haarcascade_smile.xml)。
    • 使用 cv2.CascadeClassifier 加载这些分类器。
  2. 人脸检测

    • 使用 face_cascade.detectMultiScale() 来检测图像中的人脸,返回的是一个包含每个检测到的人脸区域的矩形坐标列表 (x, y, w, h)
    • scaleFactor:图像尺寸缩放的比例因子。大于 1 会逐渐减小图像尺寸,提高检测精度。
    • minNeighbors:定义每个候选区域需要多少个邻近矩形区域才能确定是否为人脸。
    • minSize:最小检测区域大小。
  3. 笑容检测

    • 在检测到的人脸区域内使用 smile_cascade.detectMultiScale() 进行笑容检测。
    • 同样,返回的是笑容区域的矩形坐标 (sx, sy, sw, sh),可以在检测到的区域上绘制绿色矩形框。
  4. 绘制矩形框

    • 使用 cv2.rectangle() 在图像上绘制人脸框和笑容框,分别用蓝色和绿色标记。
  5. 显示图像

    • 使用 cv2.imshow() 来显示图像,并在图像上展示检测到的人脸和笑容。
  6. 退出窗口

    • 使用 cv2.waitKey(0) 等待按键事件,按任意键关闭窗口。

五、运行效果

运行代码后,你将看到一个窗口,显示了图像中检测到的人脸区域以及笑容区域。如果图像中的人脸区域包含笑容,将用绿色矩形框标出笑容。

六、优化与调整

  1. 调整检测参数

    • 可以根据图像和实际需求调整 scaleFactorminNeighbors 参数,以优化检测结果。
    • 对于不同的图像(如背景复杂、光线变化等),你可能需要进行更多的调优。
  2. 处理视频流

    • 可以使用摄像头实时检测笑容:
cap = cv2.VideoCapture(0)
while True:
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # 进行人脸和笑容检测,显示结果
    cv2.imshow('Face and Smile Detection', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):  # 按 Q 键退出
        break
cap.release()
cv2.destroyAllWindows()

精度问题

  • Haar 特征级联分类器有其局限性,可能在一些复杂环境下检测不准确。可以考虑使用更先进的深度学习方法(如基于 CNN 的人脸识别)来提高精度。

 

 


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

相关文章:

  • 【GIS操作】使用ArcGIS Pro进行海图的地理配准(附:墨卡托投影对比解析)
  • ASP.NET Core - 缓存之分布式缓存
  • Windows部署NVM并下载多版本Node.js的方法(含删除原有Node的方法)
  • 【Node.js的安装与配置】
  • kotlin的dagger hilt依赖注入
  • C#补充----反射,特性,迭代器,特殊语法,值类型运用类型。
  • 【Apache Paimon】-- 4 -- Flink 消费 kafka 数据,然后写入 paimon
  • Linux如何安装discuz
  • docker安装Emqx并使用自签名证书开启 SSL/TLS 连接
  • 数据库之连接池Druid
  • ZZCMS2023存在跨站脚本漏洞(CNVD-2024-44822、CVE-2024-44818)
  • sock_poll内核函数
  • No module named ‘_ssl‘ No module named ‘_ctypes‘
  • 如何防范顶级应用程序安全威胁
  • 【大语言模型】LangChain ModelsIO与Models I/O Promopts详解
  • 【CKS最新模拟真题】Dockerfile修改
  • CTF-RE/WEB: python-Hook(钩子)
  • 电子信息工程自动化 基于单片机的居室安全报警系统
  • 为什么 JavaScript 中的回调函数未按顺序执行?
  • Pydantic 动态字段:使用和不使用 `@computed_field` 的对比指南
  • 如何使用 JavaScript 获取页面滚动位置?
  • Java项目实战II基于微信小程序的跑腿系统(开发文档+数据库+源码)
  • Hasura 中间件API go操作示例
  • 专为高性能汽车设计的Armv9架构的Neoverse V3AE CPU基础知识与软件编码特性解析
  • 管理系统前端框架开发案例学习
  • redis-stack redisSearch环境安装搭建