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()
相关推荐
一晌小贪欢1 小时前
Python 爬虫进阶:如何利用反射机制破解常见反爬策略
开发语言·爬虫·python·python爬虫·数据爬虫·爬虫python
躺平大鹅1 小时前
5个实用Python小脚本,新手也能轻松实现(附完整代码)
python
yukai080081 小时前
【最后203篇系列】039 JWT使用
python
独好紫罗兰2 小时前
对python的再认识-基于数据结构进行-a006-元组-拓展
开发语言·数据结构·python
Dfreedom.2 小时前
图像直方图完全解析:从原理到实战应用
图像处理·python·opencv·直方图·直方图均衡化
铉铉这波能秀2 小时前
LeetCode Hot100数据结构背景知识之集合(Set)Python2026新版
数据结构·python·算法·leetcode·哈希算法
怒放吧德德3 小时前
Python3基础:基础实战巩固,从“会用”到“活用”
后端·python
aiguangyuan3 小时前
基于BERT的中文命名实体识别实战解析
人工智能·python·nlp
喵手3 小时前
Python爬虫实战:知识挖掘机 - 知乎问答与专栏文章的深度分页采集系统(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集知乎问答与专栏文章·采集知乎数据·采集知乎数据存储sqlite
铉铉这波能秀3 小时前
LeetCode Hot100数据结构背景知识之元组(Tuple)Python2026新版
数据结构·python·算法·leetcode·元组·tuple