import dlib
import face_recognition
import numpy as np
import cv2
##加载图片
imgElon = face_recognition.load_image_file('ImagesBasic/elon-musk-4.jpg')
##将图片转换成RGB格式
imgElon = cv2.cvtColor(imgElon,cv2.COLOR_BGR2RGB)
##加载图片
imgTest = face_recognition.load_image_file('ImagesBasic/elon test.jpg')
##将图片转换成RGB格式
imgTest = cv2.cvtColor(imgTest,cv2.COLOR_BGR2RGB)
##检测到脸部,它返回一个由四元组组成的列表,每个四元组表示一个人脸的位置,分别对应于人脸框的左上角和右下角的坐标。
# 具体来说,四元组的四个元素分别是:(top, right, bottom, left)
faceLoc = face_recognition.face_locations(imgElon)[0]
#对面部信息进行编码,用于将人脸图像编码为一个128维的向量。这个向量可以用于比较两张人脸图像的相似度,从而实现人脸识别等功能。
encodeElon = face_recognition.face_encodings(imgElon)[0]
#print(faceLoc)
#第一个值为面对的位置,第二个点为两点的面部位置
cv2.rectangle(imgElon,(faceLoc[3],faceLoc[0]),(faceLoc[1],faceLoc[2]),(255,0,255),2)
faceLocTest = face_recognition.face_locations(imgTest)[0]
#对面部信息进行编码
encodeTest = face_recognition.face_encodings(imgTest)[0]
#print(faceLoc)
#第一个值为面对的位置,第二个点为两点的面部位置
#cv2.rectangle(image, start_point, end_point, color, thickness)
# 其中,image是要绘制矩形的图像,start_point是矩形的左上角坐标,end_point是矩形的右下角坐标,color是矩形的颜色,thickness是矩形边框的粗细。
cv2.rectangle(imgTest,(faceLocTest[3],faceLocTest[0]),(faceLocTest[1],faceLocTest[2]),(255,0,255),2)
#编码训练集和测试集
results = face_recognition.compare_faces([encodeElon],encodeTest)
#人脸距离,距离越短,匹配越好
faceDis = face_recognition.face_distance([encodeElon],encodeTest)
print(results,faceDis)
#在图片上打印结果
cv2.putText(imgTest,f'{results} {round(faceDis[0],2)}',(50,50),cv2.FONT_HERSHEY_COMPLEX,1,(0,0,255),2)
##命名
cv2.imshow('Elon Musk',imgElon)
cv2.imshow('Elon Test',imgTest)
##设置延迟
cv2.waitKey(0)
这段代码来自于B站的openCV项目实战视频合集,跟着视频敲了一遍代码,并对语句进行了注释,仅用于学习笔记的记录。
描述:利用openCV框架,比对图片库里的图片。调用摄像头,比对图片库里的图片,并在Excel中记录出现的时间,实现刷脸打卡的功能。
import dlib
import face_recognition
import numpy as np
import cv2
import os
from datetime import datetime
##创建一个列表,自动读取数据,并编号
path = 'ImagesBasic'
path_file = 'Attendence.csv'
os.chmod(path_file,0o755)
images = []
classNames = []
myList = os.listdir(path)
print(myList)
##导入图片并使用这些图片的名称
for cl in myList:
##cv2.imread()接口读图像,读进来直接是BGR 格式数据格式在 0~255
curImg = cv2.imread(f'{path}/{cl}')
##append函数可以向列表末尾添加元素
images.append(curImg)
classNames.append(os.path.splitext(cl)[0])
print(classNames)
##对每一张图片进行编码
def findEncodings(images):
encedeList= []
for img in images:
#2、cv2.cvtColor(p1,p2) 是颜色空间转换函数,p1是需要转换的图片,p2是转换成何种格式。
# cv2.COLOR_BGR2RGB 将BGR格式转换成RGB格式
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
'''face_recognition.face_encodings是Python中的一个人脸识别库,它可以用于将人脸图像编码为128维向量。
这个库使用深度学习模型来识别人脸,并且可以在不同的图像中识别同一个人的面部特征。
face_recognition.face_encodings函数接受一个图像作为输入,并返回一个包含一个或多个人脸编码的列表。
每个编码都是一个长度为128的向量,可以用于比较两个人脸是否相似。
'''
encede = face_recognition.face_encodings(img)[0]
encedeList.append(encede)
return encedeList
def marakAttendance(name):
# with open 是 Python 中用于打开文件的一种语法结构,它可以自动管理文件的打开和关闭,避免了手动打开和关闭文件时可能出现的错误。
#r是以只读模式打开文件
#r+是以读写的方式打开文件
with open('Attendence.csv','r+') as f:
myDataList = f.readlines()
# print(myDataList)
#一张一张列出图片
nameList=[]
for line in myDataList:
entry = line.split(',')
'''
line.split() 是 Python 中字符串对象的一个方法,
它可以将一个字符串按照指定的分隔符进行分割,并返回一个由分割后的子字符串组成的列表。
默认情况下,分隔符是空格符,但是也可以通过传递参数来指定其他的分隔符。
'''
nameList.append(entry[0])
if name not in nameList:
now = datetime.now()
'''
now.strftime() 是 Python 中 datetime 模块中的一个方法,
用于将日期时间对象格式化为字符串。它接受一个格式化字符串作为参数,该字符串包含特定的格式代码,
用于指定日期时间对象的输出格式。例如,“%Y-%m-%d %H:%M:%S” 表示年-月-日 时:分:秒的格式。
'''
dtString = now.strftime('%H:%M:%S')
f.writelines(f'\n{name}.{dtString}')
#查找和编码图像
encodeListKnown = findEncodings(images)
print(len(encodeListKnown))
print('Encoding complete')
##从初始化摄像头中捕获一张图片
cap = cv2.VideoCapture(0)
#编写循环,逐贞筛选图片
while True:
sucess, img =cap.read()
imgS= cv2.resize(img,(0,0),None,0.25,0.25)
facesCurFrame = face_recognition.face_locations(imgS)
##发送人脸的位置
encodeCurFrame = face_recognition.face_encodings(imgS,facesCurFrame)
#将摄像头里的图像与学习的图片进行比较
#使用zip是将所有的图片在同一个循环中进行
for encodeFace, faceLoc in zip(encodeCurFrame,facesCurFrame):
matches = face_recognition.compare_faces(encodeListKnown,encodeFace)
faceDis = face_recognition.face_distance(encodeListKnown,encodeFace)
print(faceDis)
##距离值越小,相似性越高。
matchIndex = np.argmin(faceDis)
if matches[matchIndex]:
name = classNames[matchIndex].upper()
print(name)
y1, x2, y2, x1=faceLoc
y1,x2,y2,x1 = y1*4,x2*4,y2*4,x1*4
# 其中,image是要绘制矩形的图像,
# start_point是矩形的左上角坐标,end_point是矩形的右下角坐标,color是矩形的颜色,thickness是矩形边框的粗细。
cv2.rectangle(img,(x1,y1),(x2,y2),(0,255.2),2)
cv2.rectangle(img,(x1,y2-35),(x2,y2),(0,255,0),cv2.FILLED)
cv2.putText(img,name,(x1+6,y2-6),cv2.FONT_HERSHEY_COMPLEX,1,(255,255,255),2)
marakAttendance(name)
cv2.imshow('webcam',img)
cv2.waitKey(1)
# ##加载图片
# imgElon = face_recognition.load_image_file('ImagesBasic/elon-musk-4.jpg')
# ##将图片转换成RGB格式
# imgElon = cv2.cvtColor(imgElon,cv2.COLOR_BGR2RGB)
# ##加载图片
# imgTest = face_recognition.load_image_file('ImagesBasic/elon test.jpg')
# ##将图片转换成RGB格式
# imgTest = cv2.cvtColor(imgTest,cv2.COLOR_BGR2RGB)