OpenCVHaar级联器实现人脸捕捉和微笑检测
概念
- Haar 级联分类器是由多个简单分类器组成的复杂分类器,每个简单分类器都由 Haar 特征训练得到。
- Haar 级联器因其简单和快速而被应用于某些场景。
- OpenCV 提供多种预训练的 Haar 特征级联分类器,其已经在大量图像上进行了训练,并且针对特定类型的对象检测进行了优化。用户可以直接下载使用这些预训练模型,无需自己从头开始训练。
级联器实现人脸捕捉步骤:
- 安装opencv库:pip install opencv-contrib-python。国内镜像:pip install opencv-contrib-python -i https://pypi.tuna.tsinghua.edu.cn/simple。
- 下载haarcascades包。
- 开始写代码。
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() # 释放视频捕获对象