思想就是找出68个特征点,根据特征点的标注位置,把最外层的一圈给圈起来,面具可以自己改颜色。
在代码里特征点序号要减一。从0开始。
也就是0到26。
import cv2
import dlib
import numpy as np
import os
import imutils
color_black = (0, 0, 0)#面具颜色,这里是全黑
img= cv2.imread('test_pic/00009.jpg')
img = imutils.resize(img, width = 500)#改变大小
img1= img.copy()#为了后面显示图像用的
gray=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#转为灰度图
detector = dlib.get_frontal_face_detector()
"""
在灰度图像中检测人脸并创建一个对象-存储边界矩形的坐标列表
第二个参数中的“1”表示应该向上采样图像1次。
这会使图像变得更大,并允许我们检测更多的面孔
"""
faces = detector(gray, 1)
# 打印边界矩形的坐标
print(faces)
print("Number of faces detected: ", len(faces))
# 文件路径
p = "shape_predictor_68_face_landmarks.dat"
# 初始化dlib的预测器
predictor = dlib.shape_predictor(p)
for face in faces:
landmarks = predictor(gray, face)
points = []
for i in range(0, 17):
point = [landmarks.part(i).x, landmarks.part(i).y]
points.append(point)
# print(points)
mask_c = []
for i in range(26,17,-1):
point = [landmarks.part(i).x, landmarks.part(i).y]
mask_c.append(point)
fmask_c = points + mask_c#根据68个特征点的分布来的
fmask_c = np.array(fmask_c, dtype=np.int32)#类型转换
img2 = cv2.polylines(img, [fmask_c], True, color_black, thickness=2, lineType=cv2.LINE_8)
# 使用Python OpenCV - cv2.fillPoly()方法填充口罩
# 更改参数[mask_type]和color_type用于各种组合
img3 = cv2.fillPoly(img2, [fmask_c], color_black, lineType=cv2.LINE_AA)
# cv2.imshow("image with mask outline", img2)
cv2.imshow("image with mask", img3)
cv2.imshow('img',img1)
# 为测试保存输出文件
outputNameofImage = "fianl5.jpg"
print("Saving output image to", outputNameofImage)
cv2.imwrite(outputNameofImage, img3)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果图:
原图、灰度图、加面具的图。