Tip:实时监测人脸,并戴上面具。
注:代码中的data文件夹,请在此处下载。mask.jpg,请自选。
# -*- coding: utf-8 -*-
"""
Created on Tue Sep 4 08:50:53 2018
@author: Administrator
"""
import cv2
def maskman(face_mask):
#获取面具的宽高
h_mask,w_mask = face_mask.shape[:2]
#打开默认摄像头
cap = cv2.VideoCapture(0)
#判断是否已打开
if not cap.isOpened:
raise IOError("Cannot open the default webcam!")
#加载配置文件
face_cascade = cv2.CascadeClassifier("./data/haarcascades/haarcascade_frontalface_alt.xml")
if face_cascade.empty():
raise IOError("Cannot load the xml file.")
#缩小尺寸
scale_factor = 0.75
while True:
ret,frame = cap.read()
frame = cv2.resize(frame,None,
fx = scale_factor,
fy = scale_factor,
interpolation = cv2.INTER_AREA)
gray_frame = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
#面部位置
face_rects = face_cascade.detectMultiScale(gray_frame)
for (x,y,w,h) in face_rects:
if h>0 and w>0:
h,w = int(1.4*h),int(1.0*w)
y = int(y-0.1*h)
#提取图像感兴趣的部分
frame_roi = frame[y:y+h,x:x+w]
#调整面具大小
face_mask_small = cv2.resize(face_mask,(w,h),
interpolation = cv2.INTER_AREA)
#面具掩膜
gray_mask = cv2.cvtColor(face_mask_small,cv2.
COLOR_BGR2GRAY)
ret,mask = cv2.threshold(gray_mask,180,250,
cv2.THRESH_BINARY_INV)
#反转
mask_inv = cv2.bitwise_not(mask)
#使用mask提取感兴趣区域
masked_face = cv2.bitwise_and(face_mask_small,
face_mask_small,
mask = mask)
#使用反转mask保持感兴趣区域的信息
masked_frame = cv2.bitwise_and(frame_roi,
frame_roi,
mask = mask_inv)
#将两张masked图像加入最终图
frame[y:y+h,x:x+w] = cv2.add(masked_face,masked_frame)
cv2.imshow('FaceMask',frame)
if cv2.waitKey(10) == 27:
break
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
image = cv2.imread('mask.jpg')
maskman(image)