python 人脸检测与人脸识别
2024-01-08 06:39:40
'''
安装库文件: 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()
文章来源:https://blog.csdn.net/ternence_hsu/article/details/135447324
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!