【Dlib人脸识别】2. 绘制人脸识别结果

在OpenCV中提供了 cv2.putText() 函数用于给图片添加文字:

cv2.putText(图片对象, 文字内容,坐标,字体, 字体倍数, 字体颜色,字体厚度)
font = cv2.FONT_HERSHEY_DUPLEX
cv2.putText(img, "laowang", (d.left() + 6, d.bottom() - 6), font, 0.5, (255, 255, 255), 1)
#	文字内容是laowang
#	文字的坐标设置为:(d.left() + 6, d.bottom() - 6)
#	字体为cv2.FONT_HERSHEY_PLAIN
#	字体倍数为0.5倍
#	字体颜色为红色(0,0,255)
#	字体厚度为1
# 0. 导入模块
import os
import dlib
import glob
import numpy as np
import cv2

# 1. 加载模型、图片

## 正向人脸检测器
detector = dlib.get_frontal_face_detector()
## 加载特征点提取模型
predictor_path = 'shape_predictor_68_face_landmarks.dat'
predictor = dlib.shape_predictor(predictor_path)
## 加载面部识别模型
face_rec_model_path = 'dlib_face_recognition_resnet_model_v1.dat'
facerec = dlib.face_recognition_model_v1(face_rec_model_path)
## 已知图片
known_image_path = 'know'
## 测试图片
test_image_path = "unknow"

# 2. 声明存放数据的变量

## 声明descriptors,用于存放已知图片对应的人脸特征向量
descriptors = []
## 声明names,用于存放于人脸特征向量对应的名字。
## PS:注意测试图片集中有多少个图片,names中就要有相同数量的名称元素。否则会报错
names = ["reba","laowang"]

# 3. 开始检测

## 遍历known_image_path文件夹下所有以.jpg结尾的文件。
for f in glob.glob(os.path.join(known_image_path, "*.jpg")):
    img = dlib.load_rgb_image(f)
    ## 使用 detector 检测器来检测图像中的人脸
    dets = detector(img, 1)
    for k, d in enumerate(dets):
        ## 获取人脸特征点
        shape = predictor(img, d)
        ## 计算特征向量
        face_descriptor = facerec.compute_face_descriptor(img, shape)
        ## 特征向量转换为numpy array
        v = np.array(face_descriptor)
        ## 把此次数据存到人脸特征向量列表里面
        descriptors.append(v)

# 4. 进行判断

## 遍历test_image_path文件夹下所有以.jpg结尾的文件。
for f in glob.glob(os.path.join(test_image_path, "*.jpg")):
    img = dlib.load_rgb_image(f)
    ## 使用 detector 检测器来检测图像中的人脸
    dets = detector(img, 1)
    for k, d in enumerate(dets):
        ## 获取人脸特征点
        shape = predictor(img, d)
        ## 计算特征向量
        face_descriptor = facerec.compute_face_descriptor(img, shape)
        ## 将当前待判断的图片特征向量转化为 current
        current = np.array(face_descriptor)

        ## 计算欧式距离,识别人脸
        ### 设置阈值
        tolerance = 0.4
        ### 设置该图片名字初值为:Unknow
        current_name = "Unknow name"
        ### 对这个存放着已知图片特征向量的列表descriptors[]遍历
        for i in range(len(descriptors)):
            ### 计算欧氏距离
            distance = np.linalg.norm(descriptors[i] - current)
            ### 对欧氏距离判断
            if distance < tolerance:
                current_name = names[i]
                break
        ## 输出对当前图片的识别结果
        print("当前图片识别结果为:" + current_name)
        cv2.rectangle(img,(d.left(), d.top()),(d.right(), d.bottom()),(0,0,255),2)
        # 在图片上添加文字
        font = cv2.FONT_HERSHEY_DUPLEX
        cv2.putText(img, "myrecon", (d.left() + 6, d.bottom() - 6), font, 0.5, (255, 255, 255), 1)
        cv2.imshow("Face Recogition Image",cv2.cvtColor(img,cv2.COLOR_RGB2BGR))
        cv2.waitKey(0)
        cv2.destroyAllWindows()

运行结果:
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MR_Promethus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值