整个实现过程比较简单,先通过OpenCV调用摄像头,从视频中分
离每一帧画面;
再调用OpenCV预训练的模型face_cascade对画面进行人脸检测,检
测到人脸后,在对应帧画面上绘制绿色方框;
这里在人脸检测基础上还做了眼部检测,由于人脸已经检测到了,
只需要将检测到的人脸单独提取出来,再调用eye_cascade进行眼部
检测,同样在检测到的眼部周围绘制绿色框。
完成检测和标记后,调用OpenCV进行显示。
以下是实验代码
import cv2
# 人脸检测函数
def face_rec(img):
# 转为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
'''
Haar特征分类器就是一个XML文件,该文件中会描述人体各个部位的Haar特征值。包括人脸、眼睛、嘴唇等等。
'''
# 创建人脸识别分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 创建人眼识别分类器
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
'''
opencv2中人脸检测使用的是 detectMultiScale函数;
它可以检测出图片中所有的人脸,并将人脸用vector保存各个人脸的坐标、大小(用矩形表示);
函数由分类器对象调用
'''
# 人脸检测
'''
void detectMultiScale(const Mat& image,
CV_OUT vector<Rect>& objects,
double scaleFactor = 1.1,
int minNeighbors = 3,
int flags = 0,
Size minSize = Size(),
Size maxSize = Size());
1.image表示的是要检测的输入图像
2.objects表示检测到的人脸目标序列
3.scaleFactor表示每次图像尺寸减小的比例
4. minNeighbors表示每一个目标至少要被检测到3次才算是真的目标
(因为周围的像素和不同的窗口大小都可以检测到人脸)
5.minSize为目标的最小尺寸
6.minSize为目标的最大尺寸
适当调整4,5,6两个参数可以用来排除检测结果中的干扰项
'''
faces = face_cascade.detectMultiScale(gray,
scaleFactor = 1.15,
minNeighbors = 3,
flags = cv2.IMREAD_GRAYSCALE,
minSize = (40,40))
# 在人脸周围绘制方框
for (x,y,w,h) in faces:
img = cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)
# 进行眼部检测
eyes = eye_cascade.detectMultiScale(gray,
scaleFactor = 1.1,
minNeighbors = 3,
flags = cv2.IMREAD_GRAYSCALE,
minSize = (3,3))
for (ex,ey,ew,eh) in eyes:
# 绘制眼部方框
img = cv2.rectangle(frame,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
cv2.imshow('result',img)
# -----------------------------------------------------------------------------
# 调整参数实现读取视频或调用摄像头
cap = cv2.VideoCapture(0)
while True:
# 读取摄像头中的帧
ret, frame = cap.read()
# 调用人脸识别函数
face_rec(frame)
c = cv2.waitKey(10)
# 当键盘按下‘ESC’退出程序
if c == 27:
break
cap.release()
cv2.destroyAllWindows()