Python3.7.2+openCV简单实现本地视频文件中人脸检测
【说明】本文使用python版本为3.7.2;openCV使用opencv_python-4.0.1-cp37-cp37m-win_amd64.whl;训练文件使用haarcascade_frontalface_alt2.xml,在使用haarcascade_frontalface_default.xml时出现问题(原因未知,初步判断xml文件异常)haarcascade资源包下载
注:视频来源于网络,只做学习和代码测试使用
# -*- coding: utf-8 -*-
# __author__ = 'feikai'
# __date__ = '2019/1/26'
# __Desc__ = 视频人脸检测小例子
import cv2
# 视频来源,可以来自一段已存好的视频,也可以直接来自USB摄像头,
# 这里使用已存储的视频文件,作者将其放在代码同文件夹下
#获取待检测视频Grammarly.mp4,根据个人视频名称修改
cap = cv2.VideoCapture(
r'./Grammarly.mp4'
)
# 告诉OpenCV使用人脸识别分类器在哪里,
# 建议使用haarcascade_frontalface_alt2.xml,作者将其放在代码同文件夹下
classfier = cv2.CascadeClassifier(
r'./haarcascade_frontalface_alt2.xml'
)
# 识别出人脸后要画的边框的颜色,BRG格式,openCV中与普通RGB值不同(历史遗留习惯)
color = (0, 255, 0)
while cap.isOpened():
ok, frame = cap.read() # 读取一帧数据
#如果读取失败,直接break
if not ok:
break
# 读取成功后,将当前帧转换成灰度图像
grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 人脸检测,使用detectMultiScale函数进行
faceRects = classfier.detectMultiScale(
grey,
scaleFactor=1.25,
minNeighbors=3,
minSize=(35, 35) #设置最小检测范围,即是目标小于该值就无视
# maxSize=(200,200)#设置最大检测范围
)
if len(faceRects) > 0: # 当检测到多张脸时
for faceRect in faceRects: # 单独框出每一张人脸
x, y, w, h = faceRect
cv2.rectangle(frame, (x , y), (x + w, y + h), color, 2)
# 显示图像
cv2.imshow("Face Detection", frame)
c = cv2.waitKey(5) #数值越小播放越流畅,不可为浮点数
if c & 0xFF == ord('q'):
break
# 释放摄像头并销毁所有窗口
cap.release()
cv2.destroyAllWindows()