在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()
运行结果: