版权声明:本文为博主原创文章,未经博主允许不得转载。若有任何问题,请联系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()