dlib+opencv实现人脸追踪与聚合

import os
import shutil
import cv2
import dlib
import numpy as np
import matplotlib.pyplot as plt


def show_image(image):
    img_RGB = image[:, :, ::-1]  # BGR转RGB
    plt.imshow(img_RGB)
    plt.axis('off')


# 绘制人脸矩形
def plot_rectangle(image, faces):
    img_range_list = []
    for face in faces:
        cv2.rectangle(image, (face.left() - 10, face.top() - 20), (face.right() + 10, face.bottom() + 10),
                      (0, 255, 0), 2)
        img_range_list.append([(face.top() - 20), (face.bottom() + 10), (face.left() - 10), (face.right() + 10)])
    return image, img_range_list


# 识别
def trace(img_path):
    # 读取一张照片
    img = cv2.imread(img_path)
    # 灰度转换
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 调用dlib库中的检测器
    detector = dlib.get_frontal_face_detector()
    detector_result = detector(gray, 2)  # 放大一倍
    # 绘制矩形
    img_res, range_list = plot_rectangle(img.copy(), detector_result)

    img_save_path = 'test/'
    shutil.rmtree(img_save_path, ignore_errors=True)
    os.makedirs(img_save_path)
    i = 0
    for img_range in range_list:
        image_range = img_res[img_range[0]:img_range[1], img_range[2]:img_range[3]]
        cv2.imwrite('test/{}.jpg'.format(i), image_range)
        i = i + 1
    show_image(img_res)
    plt.savefig("array")
    return len(range_list)


# 关键点编码为128维
def encoder_face(image, detector, predictor, encoder, upsample=1, jet=1):
    # 检测人脸
    faces = detector(image, upsample)
    # 对每张人脸进行关键点检测
    faces_keypoints = [predictor(image, face) for face in faces]
    return [np.array(encoder.compute_face_descriptor(image, faces_keypoint, jet)) for faces_keypoint in faces_keypoints]


# 人脸比较(欧式距离)
def compare_faces(face_encoding, test_encoding, name_list):
    distance = list(np.linalg.norm(np.array(face_encoding) - np.array(test_encoding), axis=1))
    return zip(*sorted(zip(distance, name_list)))


def recognition(img_path, test_path):
    # 加载人脸检测器
    detector = dlib.get_frontal_face_detector()
    # 加载关键点的检测器
    predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
    # 加载人脸特征编码模型
    encoder = dlib.face_recognition_model_v1('dlib_face_recognition_resnet_model_v1.dat')
    len_img = trace(img_path)
    name_list = []
    img_list = []
    test = cv2.imread(test_path)
    test = test[:, :, ::-1]
    test_128D = encoder_face(test, detector, predictor, encoder)[0]
    for i in range(len_img):
        img = cv2.imread('test/{}.jpg'.format(i))
        img = img[:, :, ::-1]
        img_128D = encoder_face(img, detector, predictor, encoder)[0]
        img_list.append(img_128D)
        name_list.append(i)
        i += 1

    distance, name = compare_faces(img_list, test_128D, name_list)
    res = name[0]
    print('test/{}.jpg'.format(res))
    # img1 = cv2.imread('z1.jpg')
    # img2 = cv2.imread('y1.jpg')
    # test = cv2.imread('y2.jpg')
    # 改变通道顺序
    # img1 = img1[:, :, ::-1]
    # img2 = img2[:, :, ::-1]
    # test = test[:, :, ::-1]

    # 调用方法:128D特征向量输出
    # img1_128D = encoder_face(img1, detector, predictor, encoder)[0]
    # img2_128D = encoder_face(img2, detector, predictor, encoder)[0]
    # test_128D = encoder_face(test, detector, predictor, encoder)[0]
    # 人脸比较
    # img_list = [img1_128D, img2_128D]
    # a = compare_faces(img_list, test_128D)


recognition('hu.jpg', 'hu1.jpg')
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值