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.
49 lines
1.4 KiB
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()
|