使用dlib给人脸戴面具

思想就是找出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()

结果图:
原图、灰度图、加面具的图

原图、灰度图、加面具的图。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值