python 人脸检测与人脸识别

python 复制代码
'''
安装库文件: pip install dlib face_recognition
'''

import dlib
import face_recognition
import cv2
from PIL import Image, ImageDraw

# 判断运行环境 cpu or gpu
def check_env():
    print(dlib.DLIB_USE_CUDA)
    print(dlib.cuda.get_num_devices())

# 判断人脸在图片当中的位置
def get_face_location(image_flle):
    image_fr = face_recognition.load_image_file(image_flle)
    face_locations = face_recognition.face_locations(image_fr)
    print(face_locations)

    # 标记人脸的位置
    image_cv = cv2.imread(image_flle)
    for location in face_locations:
        y0, x1, y1, x0 = location
        cv2.rectangle(image_cv,(x0,y0),(x1,y1),(0,0,255),4)
    cv2.imwrite(image_flle + '.new_image.jpg', image_cv)

    return face_locations


# 提取人脸画面保存到本地
def extract_face(image_file):
    image_cv = cv2.imread(image_file)
    face_recognitions = get_face_location(image_file)
    for i, location in enumerate(face_recognitions):
        y0,x1,y1,x0 = location
        face_image = image_cv[y0:y1,x0:x1]
        cv2.imwrite(f"{image_file}.face_{i}.jpg",face_image)


# 把人脸信息编码为一个128维的向量
def encode_face(image_file):
    image_fr = face_recognition.load_image_file(image_file)
    face_recognitions = face_recognition.face_locations(image_fr)
    face_encodings = face_recognition.face_encodings(image_fr,face_recognitions)
    return face_encodings[0]
    
# 判断2个人脸是否为同一个人
def compare_face(image_file1, image_file2):
    face_encoding1 = encode_face(image_file1)
    face_encoding2 = encode_face(image_file2)
    ret = face_recognition.compare_faces([face_encoding1],face_encoding2)
    return ret

# 标记人脸局部和标识
def mark_face(image_file):
    image_fr = face_recognition.load_image_file(image_file)
    face_marks = face_recognition.face_landmarks(image_fr)
    
    image_pil = Image.fromarray(image_fr)
    image_draw = ImageDraw.Draw(image_pil)
    for face_mark in face_marks:
        for facial_feature in face_mark.keys():
            image_draw.line(face_mark[facial_feature],width=5)
    image_pil.save(f"{image_file}_face_mark.jpg")


# 人脸补扮
def beautify_face(image_file):
    image_fr = face_recognition.load_image_file(image_file)
    face_marks = face_recognition.face_landmarks(image_fr)
    image_pil = Image.fromarray(image_fr)
    for i, face_mark in enumerate(face_marks):
        image_draw = ImageDraw.Draw(image_pil)
        # 眉毛
        image_draw.polygon(face_mark['left_eyebrow'],fill=(68,54,39,128))
        image_draw.polygon(face_mark['right_eyebrow'],fill=(68,54,39,128))
        image_draw.line(face_mark['left_eyebrow'],fill=(68,54,39,150),width=2)
        image_draw.line(face_mark['right_eyebrow'],fill=(68,54,39,150),width=2)
        # 嘴唇
        image_draw.polygon(face_mark['top_lip'],fill=(150,0,0,60))
        image_draw.polygon(face_mark['bottom_lip'],fill=(150,0,0,60))
        image_draw.line(face_mark['top_lip'],fill=(150,0,0,20),width=2)
        image_draw.line(face_mark['bottom_lip'],fill=(150,0,0,20),width=2)
        # 眼睛
        image_draw.polygon(face_mark['left_eye'],fill=(255,255,255,20))
        image_draw.polygon(face_mark['right_eye'],fill=(255,255,255,20))
        image_draw.line(face_mark['left_eye'] + [face_mark['left_eye'][0]],fill=(0,0,0,50),width=2)
        image_draw.line(face_mark['right_eye'] + [face_mark['right_eye'][0]],fill=(0,0,0,50),width=2)

    image_pil.save(f"{image_file}.beautify_face.png")


def main():
    check_env()

    face_locations = get_face_location('1.webp')
    print(face_locations)

    extract_face('3.jpg')

    face_encodings = encode_face('1.webp.face_0.jpg')
    print(face_encodings)

    ret = compare_face('1.webp.face_1.jpg','3.jpg.face_1.jpg')
    print(ret)

    mark_face('1.webp')

    beautify_face('1.webp')


if __name__=="__main__":
    main()
相关推荐
木子杳衫2 小时前
【软件开发】管理类系统
python·web开发
程序员小远5 小时前
银行测试:第三方支付平台业务流,功能/性能/安全测试方法
自动化测试·软件测试·python·功能测试·测试工具·性能测试·安全性测试
星期天要睡觉6 小时前
计算机视觉(opencv)——基于 OpenCV DNN 的实时人脸检测 + 年龄与性别识别
opencv·计算机视觉·dnn
猫头虎7 小时前
如何查看局域网内IP冲突问题?如何查看局域网IP环绕问题?arp -a命令如何使用?
网络·python·网络协议·tcp/ip·开源·pandas·pip
沿着路走到底7 小时前
python 基础
开发语言·python
烛阴9 小时前
武装你的Python“工具箱”:盘点10个你必须熟练掌握的核心方法
前端·python
杨枝甘露小码10 小时前
Python学习之基础篇
开发语言·python
我是华为OD~HR~栗栗呀10 小时前
23届考研-Java面经(华为OD)
java·c++·python·华为od·华为·面试
小蕾Java11 小时前
PyCharm 软件使用各种问题 ,解决教程
ide·python·pycharm
Lucky_Turtle11 小时前
【PyCharm】设置注释风格,快速注释
python