软硬件环境
- ubuntu 18.04 64bit
- anaconda3 with python 3.6.4
- opencv 3.4.2
视频看这里
Haar cascade分级器
haar
,哈尔特征,是用于物体识别的一种数字图像特征,是最早用于即时人脸检测的算法。哈尔特征使用检测窗口中指定位置的相邻矩形,计算每一个矩形的像素和并取其差值,然后用这些差值来对图像的子区域进行分类。
使用基于haar
特征的分级器来进行物体检测是一种非常有效的方法,它是由Paul Viola
和Michael Jones
在2001的论文Rapid Object Detection using a Boosted Cascade of Simple Features
中提出。
在人脸的检测中,我们需要一个基于haar cascade
的分级器,它是由正样本(带脸的图片)和负样本(没脸的图片)训练而成。OpenCV
发行版中自带了已经训练好的分级器haarcascade_frontalface_default.xml
,我们可以直接拿来使用。除了人脸,其它物体的检测opencv
也提供了默认的分级器,可以到安装目录中查看,~/anaconda3/pkgs/opencv3-3.1.0-py36_0/share/OpenCV/haarcascades
。
代码实例
以检测摄像头中人脸为例,图片、视频文件都一样
import cv2
import sys
cascPath = sys.argv[1]
# 读取分级器文件
faceCascade = cv2.CascadeClassifier(cascPath)
# 打开摄像头
video_capture = cv2.VideoCapture(0)
while True:
# 读取数据帧
ret, frame = video_capture.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=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), (0, 255, 0), 2)
# 显示
cv2.imshow('Video', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
video_capture.release()
cv2.destroyAllWindows()
运行上面的脚本
python test.py haarcascade_frontalface_default.xml
训练自己的分级器
查看官方的文档,https://docs.opencv.org/3.4/dc/d88/tutorial_traincascade.html,非常详尽。