You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
hunjianghu/greenhat/PyPy.py

49 lines
1.4 KiB

#coding = utf-8
import cv2
import dlib
Base = 32
img = 'ym.jpg'
hat = 'ghat.png'
Model = 'shape_predictor_5_face_landmarks.dat'
image = cv2.imread(img)
greenhat= cv2.imread(hat,-1)
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(Model)
dets = detector(image,1)
for face in dets:
left,right,top,bot=face.left(),face.right(),face.top(),face.bottom()
shape = predictor(image,face)
point1 = shape.part(0)
point2 = shape.part(2)
# Midx Midy 眼睛的中间点
Midx = (point1.x+point2.x)//2
Midy = (point1.y+point2.y)//2
# cv2.circle(image,(Midx,Midy),3,(0,255,0))
width = int((right-left)*2.25)
height = int(width*greenhat.shape[0]/greenhat.shape[1])
# 将要加上去的绿帽的形状
greenhat = cv2.resize(greenhat,(width,height),cv2.INTER_CUBIC)
# cv2.imshow("greenhat",greenhat)
# cv2.waitKey(0)
Addx = width//2
# 有一个值得注意的就是不能数组越界
r,g,b,alpha = cv2.split(greenhat)
for y in range(Midy-height,Midy):
if y+Base < 0 or y+Base >= image.shape[0]: continue
for x in range(Midx-Addx,Midx-Addx+width):
if x < 0 or x >= image.shape[1] : continue
tmpx,tmpy = x-Midx+Addx,y-Midy+height
if alpha[tmpy][tmpx] >= 100:
image[y+Base][x] = (r[tmpy][tmpx],g[tmpy][tmpx],b[tmpy][tmpx])
cv2.imshow("output",image)
cv2.imwrite("output.jpg",image)
cv2.waitKey(0)
cv2.destroyAllWindows()