OpenCV-Python系列·第二十二集:戴面具

版权声明:本文为博主原创文章,未经博主允许不得转载。若有任何问题,请联系QQ:575925154(加好友时,请备注:CSDN) https://blog.csdn.net/Miracle0_0/article/details/82658409

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)

 

猜你喜欢

转载自blog.csdn.net/Miracle0_0/article/details/82658409