几十行代码实现基于opencv的人脸识别(python)

发布时间:2024年01月18日

一、简介

? ? ? ? 本项目是一个简单的人脸识别系统,通过提前将人脸图片以人名命名的形式存入文件夹ImagesAttendance中,程序会通过摄像头读取人脸数据如果找到匹配人脸就会将对应图片的名称提取出来放入attendance.csv文件中,同时在摄像头界面中会框出人脸并显示名字,效果图如下:

??

二、代码说明

????????首先当然是对库的安装,?其实这个项目唯一不好办的地方也在这里,就是关于face_recognition库的安装,要按照face_recognition库首先得安装cmake、dlib。当在安装dlib时会出现报错,本站大多数资源回答提供了两种解决方案,一种是安装visual stdio和c++库,但是那玩意太大了,而且如果你不用C++的话似乎也起不到什么作用,而且成功率并不高。另一种方法是安装anaconda,通过创建python3.6的虚拟环境来安装对应的dlib whl文件,因为目前集成好的whl文件最多只能支持到python3.6,这种方法也适用于tensorflow的安装,但是这种方法对新手并不友好。所有我在这里建议你安装python3.10版本,我提供了一个python3.10版本对应的dlib whl文件将放在文章末尾。有需要的自取。下载完这个文件之后就可以安装你的库了这里提供命令行安装的方法,win+R输入cmd打开命令行依次输入

pip install cmake
pip install boost
pip install numpy
pip install 对应路径下的whl文件
pip install dlib

接着就可以安装face_recognition库和opencv库了

pip install face-recognition
pip install opencv-python

这里因为我并没有使用pycharm而是sublimetext,所以我又装了一个按键检测的库用于退出程序,按空格键退出。(sublimetext并没有调试功能,而摄像头窗口又是循环检测的所以关闭窗口并没有用,算是一个bug吧,不过按空格结束程序还是可以正常退出的)

import cv2 as cv
import numpy as np
import face_recognition
import os
from datetime import datetime
import keyboard

后续的代码内容就比较简单了

选择存储图片的文件夹路径,读取所有图片的名称存放在列表当中并打印出来

path = 'ImagesAttendance'
images = []
classNames = []
myList = os.listdir(path)
print(myList)
for cl in myList:
	curImg = cv.imread(f'{path}/{cl}')
	images.append(curImg)
	classNames.append(os.path.splitext(cl)[0])
print(classNames)

读取存入文件夹图片的人脸数据

def findEncodings(images):
	encodeList = []
	for img in images:
		img = cv.cvtColor(img,cv.COLOR_BGR2RGB)
		encode = face_recognition.face_encodings(img)[0]
		encodeList.append(encode)
	return encodeList

?将匹配成功的结果写入到Attendance.csv文件中

def markAttendance(name):
	with open('Attendance.csv','r+') as f:
		myDataList = f.readlines()
		nameList = []
		for line in myDataList:
			entry = line.split(',')
			nameList.append(entry[0])
		if name not in nameList:
			now = datetime.now()
			dtString = now.strftime('%H:%M:%S')
			f.writelines(f'\n{name},{dtString}')

?主程序,实时检测摄像头人脸数据并与已知的人脸数据作匹配,匹配成功则调用markAttendance函数将姓名写入到Attendance.csv文件中。

cap = cv.VideoCapture(0)

while True:
	success,img = cap.read()
	imgS = cv.resize(img,(0,0),None,0.25,0.25)
	imgS = cv.cvtColor(imgS,cv.COLOR_BGR2RGB)

	facesCurFrame = face_recognition.face_locations(imgS)
	encodesCurFrame = face_recognition.face_encodings(imgS,facesCurFrame)

	for encodeFace,faceLoc in zip(encodesCurFrame,facesCurFrame):
		matches = face_recognition.compare_faces(encodeListKown,encodeFace)
		faceDis = face_recognition.face_distance(encodeListKown,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
			cv.rectangle(img,(x1,y1),(x2,y2),(0,255,0),2)
			cv.rectangle(img,(x1,y2-35),(x2,y2),(0,255,0),cv.FILLED)
			cv.putText(img,name,(x1+6,y2-6),cv.FONT_HERSHEY_COMPLEX,1,(255,255,255),2)
			markAttendance(name)

最后,按空格退出循环结束程序

	cv.imshow('Webcam',img)
	cv.waitKey(1)
	if keyboard.is_pressed(' '):
		break

?三、完整代码

import cv2 as cv
import numpy as np
import face_recognition
import os
from datetime import datetime
import keyboard

path = 'ImagesAttendance'
images = []
classNames = []
myList = os.listdir(path)
print(myList)
for cl in myList:
	curImg = cv.imread(f'{path}/{cl}')
	images.append(curImg)
	classNames.append(os.path.splitext(cl)[0])
print(classNames)

def findEncodings(images):
	encodeList = []
	for img in images:
		img = cv.cvtColor(img,cv.COLOR_BGR2RGB)
		encode = face_recognition.face_encodings(img)[0]
		encodeList.append(encode)
	return encodeList

def markAttendance(name):
	with open('Attendance.csv','r+') as f:
		myDataList = f.readlines()
		nameList = []
		for line in myDataList:
			entry = line.split(',')
			nameList.append(entry[0])
		if name not in nameList:
			now = datetime.now()
			dtString = now.strftime('%H:%M:%S')
			f.writelines(f'\n{name},{dtString}')


encodeListKown = findEncodings(images)
print('Encoding Complete')

cap = cv.VideoCapture(0)

while True:
	success,img = cap.read()
	imgS = cv.resize(img,(0,0),None,0.25,0.25)
	imgS = cv.cvtColor(imgS,cv.COLOR_BGR2RGB)

	facesCurFrame = face_recognition.face_locations(imgS)
	encodesCurFrame = face_recognition.face_encodings(imgS,facesCurFrame)

	for encodeFace,faceLoc in zip(encodesCurFrame,facesCurFrame):
		matches = face_recognition.compare_faces(encodeListKown,encodeFace)
		faceDis = face_recognition.face_distance(encodeListKown,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
			cv.rectangle(img,(x1,y1),(x2,y2),(0,255,0),2)
			cv.rectangle(img,(x1,y2-35),(x2,y2),(0,255,0),cv.FILLED)
			cv.putText(img,name,(x1+6,y2-6),cv.FONT_HERSHEY_COMPLEX,1,(255,255,255),2)
			markAttendance(name)

	cv.imshow('Webcam',img)
	cv.waitKey(1)
	if keyboard.is_pressed(' '):
		break

?

?

文章来源:https://blog.csdn.net/qq_64161215/article/details/135595456
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。