OpenCV-Python系列·第二十三集:戴眼镜

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

Tip:1、先检测面部;2、在检测眼镜,并确定眼镜的坐标;3、制作掩膜。

注:掩膜的size一定要跟src的一致。

# -*- coding: utf-8 -*-
"""
Created on Thu Sep 13 16:50:40 2018

@author: Administrator
"""

import cv2
import numpy as np

#加载面部配置文件
face_cascade = cv2.CascadeClassifier("./data/haarcascades/haarcascade_frontalface_alt.xml")
eye_cascade = cv2.CascadeClassifier("./data/haarcascades/haarcascade_eye.xml")
if face_cascade.empty():
    raise IOError("Cannot load the face's xml file.")
if face_cascade.empty():
    raise IOError("Cannot load the eye's xml file.")

##加载眼镜
sunglasses_img = cv2.imread("mask.jpg")
cv2.imshow('Glasses',sunglasses_img)

#加载面部图像
img = cv2.imread("james.jpg")
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow('James',img)
print(img.shape)
cv2.imshow('gray',gray)
print(gray.shape)

#保存中心位置
centers = []
faces = face_cascade.detectMultiScale(gray)

##获取目标位置
for (x,y,w,h) in faces:
    roi_gray = gray[y:h+y,x:w+x]
    roi_color = gray[y:y+h,x:x+w]
    cv2.imshow('roi_color',roi_color)
    #检测眼睛位置
    eyes = eye_cascade.detectMultiScale(roi_gray)
    for (eye_x,eye_y,eye_w,eye_h) in eyes:
#        eye = roi_gray[eye_y:eye_y+int(eye_y+0.5*eye_h),
#                       eye_x:eye_x+int(eye_x+0.5*eye_w)]
#        cv2.imshow('eye',eye)
        centers.append((x+int(eye_x+0.5*eye_w),
                        y+int(eye_y+0.5*eye_h)))

#判断是否得到了眼睛的中心位置
if len(centers) > 0:
    sunglasses_width = 2.12*abs(centers[1][0]-centers[0][0])
    overlay_img = np.ones(img.shape,np.uint8)*255
    
    cv2.imshow('overlay',overlay_img)
    
    h,w = sunglasses_img.shape[:2]
    scaling_factor = sunglasses_width/w
    overlay_sunglasses = cv2.resize(sunglasses_img,None,
                                    fx = scaling_factor,
                                    fy = scaling_factor,
                                    interpolation = cv2.INTER_AREA)
    cv2.imshow('overlay_glasses',overlay_sunglasses)
    
    
    x = centers[0][0] if centers[1][0]<centers[0][0] else centers[1][0]
    
    x = int(x-0.26*overlay_sunglasses.shape[1])
    y = int(y+0.85*overlay_sunglasses.shape[0])
    
    h,w = overlay_sunglasses.shape[:2]
    overlay_img[y:y+h,x:x+w] = overlay_sunglasses
    cv2.imshow('overlay_img',overlay_img)
    
    #创造一个掩膜
    gray_sunglasses = cv2.cvtColor(overlay_img,cv2.COLOR_BGR2GRAY)
    cv2.imshow('gray_glasses',gray_sunglasses)
    ret,mask = cv2.threshold(gray_sunglasses,110,255,cv2.THRESH_BINARY)
    cv2.imshow("mask",mask)
    print(mask.shape)
    mask_inv = cv2.bitwise_not(mask)
    cv2.imshow("mask_inv",mask_inv)
    temp = cv2.bitwise_and(img,img,mask = mask)
    cv2.imshow("temp",temp)
    temp2 = cv2.bitwise_and(overlay_img,overlay_img,mask = mask_inv)
    cv2.imshow("temp2",temp2)
    final_img = cv2.addWeighted(temp,0.7,temp2,0.3,0)
    cv2.imshow("result",final_img)


if cv2.waitKey(0) == 27:
    cv2.destroyAllWindows()

 

猜你喜欢

转载自blog.csdn.net/Miracle0_0/article/details/82693861
今日推荐