基于CV2人脸识别

#引入模块
import face_recognition as fr
import cv2
import numpy as np
import os
import time 
begin_time=time.time()
path = "./train1/"
#创建 2 个列表来存储图像(人员)的名称及其各自的脸编码。
known_names = []
known_name_encodings = []
#os.listdir()获取指定文件夹中的所有文件和子文件夹名称组成的列表
images = os.listdir(path)
#人脸编码是一种值的矢量,它代表着脸部特征之间的重要度量,如眼睛之间的距离、额头
的宽度等。
#循环遍历目录中的每个图像,提取图像中的人的姓名,计算其脸编码向量,并将信息存储
在相应的列表中。
#遍历路径下的所有照片
for _ in images:
 image = fr.load_image_file(path + _)
 image_path = path + _
 encoding = fr.face_encodings(image)[0]
 known_name_encodings.append(encoding)
 known_names.append(os.path.splitext(os.path.basename(image_path))[0].capitalize())
#capitalize()方法返回一个首字母大写的字符串。
print(known_names)
#在测试训练集中测试 face1.jpg 模型
test_image = "./test1/face1.jpg"
image = cv2.imread(test_image)
#image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)#灰度照片
#人脸识别库提供了一种名为 Face_Locations()的方法
#它定位图像中检测到的每个人脸的坐标(左、下、右、上),使用这些位置值找到脸编码
face_locations = fr.face_locations(image)
face_encodings = fr.face_encodings(image, face_locations)
#zip()函数用于将可迭代的对象中对应元素打包成一个个元组,返回元组组成的列表
for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
 matches = fr.compare_faces(known_name_encodings, face_encoding)
 name = ""
#numpy.argmin 表示最小值在数组中所在的位置。
#当 face_distances 最小时,该人脸编码在数组位置数,也就可以得到最匹配人的对应姓名。
 face_distances = fr.face_distance(known_name_encodings, face_encoding)
 #最小差距(误差最小值)保留两位小数
 fd_min=round(min(face_distances),2)
 best_match = np.argmin(face_distances)
 #判断
 if matches[best_match]:
 name = known_names[best_match]
 #绘制矩阵 cv2.rectangle()
 cv2.rectangle(image, (left, top), (right, bottom), (0, 0, 255), 2)
cv2.rectangle(image, (left, bottom - 15), (right, bottom), (0, 0, 255), cv2.FILLED)
#字体效果
 font = cv2.FONT_HERSHEY_DUPLEX
 #文字输出(图片,添加文字,位置,字体类型,字体大小,字体颜色,字体粗细)
 cv2.putText(image, name+str(fd_min), (left + 4, bottom - 4), font, 0.3, (255, 255, 255), 1)
end_time=time.time()
run_time=end_time-begin_time
print("识别用时:",run_time)
#展示结果图片
cv2.imshow("Result", image)
#保存结果
cv2.imwrite("./output.jpg", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 测试图片:

测试结果:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值