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

server/2024/9/24 12:32:52/

概念

  • 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 cv2def 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:breakgray = 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键breakcv2.destroyAllWindows()  # 关闭打开的图像窗口
cap.release()  # 释放视频捕获对象


http://www.ppmy.cn/server/121349.html

相关文章

【灭鼠先锋 / B】

题目 代码 #include <bits/stdc.h> using namespace std; unordered_map<string, bool> m; bool check(string s) {return count(s.begin(), s.end(), O) 1; } bool SG(string s) {if (m.count(s))return m[s];if (check(s))return m[s] false;for (int i 0; i…

Vue 3有哪些新特性

Composition API&#xff1a; 这是 Vue 3 中最引人注目的新特性之一。Composition API 提供了一种全新的方式来组织和重用逻辑。它允许你将组件的逻辑按功能组织成可复用的代码块&#xff08;称为“组合式函数”&#xff09;&#xff0c;而不是像 Vue 2 那样按选项&#xff08;…

【万用表】

一、二级档蜂鸣器档 测试二极管&#xff0c;还有一些线路是导通的还是断的&#xff0c;还可以测一些比较厉害的短路 1、测试二极管 二极管白色的这边是负极 如果反方向测量&#xff0c;则没有反应 说明二极管没有问题 2、测试线路 红灯亮并且有响声 说明线路没有问题 二、…

【图像压缩与重构】基于BP神经网络

课题名称&#xff1a;基于BP神经网络的图像压缩与重构&#xff08;带GUI) 相关资料&#xff1a; 1. 代码注释 2.BP神经网络原理文档资料 3.图像压缩原理文档资料 程序实例截图&#xff1a;

【解密 Kotlin 扩展函数】扩展函数的导入和使用(十七)

导读大纲 1.1.1 将 joinToString 函数作为 String 类型的扩展函数1.1.2 导入和使用扩展函数 1.1.1 将 joinToString 函数作为 String 类型的扩展函数 在之前的教程中, 我们已经基本实现 joinToString 函数 自定义joinToString 函数–传送门<1> 将原本第一个参数collecti…

ELK企业级日志分析系统

目录 一、ELK日志分析系统简介 二、Elasticsearch介绍 三、Logstash介绍 四、Kibana介绍 五、部署ELK日志分析系统 一、ELK日志分析系统简介 ELK 是一套由 Elasticsearch、Logstash 和 Kibana 组成的开源日志分析系统&#xff0c;通常用于大规模的数据收集、处理和可视化分…

融智于算,聚力跃升:走进华为第二届智算集成智享会

9月18日&#xff0c;在华为全联接大会&#xff08;HUAWEI CONNECT 2024&#xff09;上&#xff0c;以“融智于算&#xff0c;聚力跃升”为主题的第二届智算集成智享会在上海圆满落幕。本次会议汇聚了不同领域的专家学者、企业领袖以及前沿技术的探索者&#xff0c;围绕智算服务…

【ARM】A64指令介绍及内存屏障和寄存器

A64指令集介绍 ISA : Instruction System Architecture 指令集总结 跳转指令 使用跳转指令直接跳转&#xff0c;跳转指令有跳转指令B&#xff0c;带链接的跳转指令BL &#xff0c;带状态切换的跳转指令BX。 B 跳转指令&#xff0c;跳转到指定的地址执行程序。 BL 带链接的跳…