opencv python考勤_基于python+opencv的简易人脸识别打卡系统

importcv2importosimportnumpy as npfrom PIL importImageimportdatetimeimportcsvfrom time importsleep#调用笔记本内置摄像头,所以参数为0,如果有其他的摄像头可以调整参数为1,2

Path = r"C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml"face_detector=cv2.CascadeClassifier(Path)

names=[]

zh_name=[]

with open("maxmember.csv","r",encoding='UTF-8') as csv_file:

reader=csv.reader(csv_file)for item inreader:#print(item)

names.append(item[2])

zh_name.append(item[1])#print (zh_name)

defdata_collection():

cap= cv2.VideoCapture(0,cv2.CAP_DSHOW)#cv2.CAP_DSHOW是作为open调用的一部分传递标志,还有许多其它的参数,而这个CAP_DSHOW是微软特有的。

face_id = input('\n 请输入你的ID:')print('\n 数据初始化中,请直视摄像机录入数据....')

count=0whileTrue:#从摄像头读取图片

sucess, img =cap.read()#转为灰度图片

gray =cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#检测人脸

faces = face_detector.detectMultiScale(gray, 1.3, 5)#1.image表示的是要检测的输入图像# 2.objects表示检测到的人脸目标序列# 3.scaleFactor表示每次图像尺寸减小的比例

for (x, y, w, h) infaces:#画矩形

cv2.rectangle(img, (x, y), (x + w, y + w), (255, 0, 0))

count+= 1

#保存图像

cv2.imwrite("facedata/Member." + str(face_id) + '.' + str(count) + '.jpg', gray[y: y + h, x: x +w])

cv2.imshow('data collection', img)#保持画面的持续。

k = cv2.waitKey(1)if k == 27: #通过esc键退出摄像

break

elif count >= 200: #得到n个样本后退出摄像

breakcap.release()

cv2.destroyAllWindows()defface_training():#人脸数据路径

path = './facedata'recognizer=cv2.face.LBPHFaceRecognizer_create()#LBP是一种特征提取方式,能提取出图像的局部的纹理特征

defget_images_and_labels(path):

imagePaths= [os.path.join(path, f) for f in os.listdir(path)] #join函数将多个路径组合后返回

faceSamples =[]

ids=[]#遍历图片路径,导入图片和id,添加到list

for imagePath inimagePaths:

PIL_img= Image.open(imagePath).convert('L') #通过图片路径并将其转换为灰度图片。

img_numpy= np.array(PIL_img, 'uint8')

id= int(os.path.split(imagePath)[-1].split(".")[1])

faces=face_detector.detectMultiScale(img_numpy)for (x, y, w, h) infaces:

faceSamples.append(img_numpy[y:y+ h, x: x +w])

ids.append(id)returnfaceSamples, idsprint('数据训练中')

faces, ids=get_images_and_labels(path)

recognizer.train(faces, np.array(ids))

recognizer.write(r'.\trainer.yml')defface_ientification():

cap=cv2.VideoCapture(0)

recognizer=cv2.face.LBPHFaceRecognizer_create()

recognizer.read('./trainer.yml')

faceCascade=cv2.CascadeClassifier(Path)

font=cv2.FONT_HERSHEY_SIMPLEX

idnum=0globalnamess

cam=cv2.VideoCapture(0)#设置大小

minW = 0.1 * cam.get(3)

minH= 0.1 * cam.get(4)whileTrue:

ret, img=cam.read()#图像灰度处理

gray =cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#将人脸用vector保存各个人脸的坐标、大小(用矩形表示)

faces =faceCascade.detectMultiScale(

gray,

scaleFactor=1.2,#表示在前后两次相继的扫描中,搜索窗口的比例系数

minNeighbors=5,#表示构成检测目标的相邻矩形的最小个数(默认为3个)

minSize=(int(minW), int(minH))#minSize和maxSize用来限制得到的目标区域的范围

)for (x, y, w, h) infaces:

cv2.rectangle(img, (x, y), (x+ w, y + h), (0, 255, 0), 2)#返回侦测到的人脸的id和近似度conf(数字越大和训练数据越不像)

idnum, confidence = recognizer.predict(gray[y:y + h, x:x +w])if confidence < 100:

namess=names[idnum]

confidence= "{0}%".format(round(100 -confidence))else:

namess= "unknown"confidence= "{0}%".format(round(100 -confidence))

cv2.putText(img, str(namess), (x+ 5, y - 5), font, 1, (0, 0, 255), 1)

cv2.putText(img, str(confidence), (x+ 5, y + h - 5), font, 1, (0, 0, 0), 1)#输出置信度

cv2.imshow(u'Identification punch', img)

k= cv2.waitKey(5)if k == 13:

theTime=datetime.datetime.now()#print(zh_name[idnum])

strings =[str(zh_name[idnum]),str(theTime)]print(strings)

with open("log.csv", "a",newline="") as csvFile:

writer=csv.writer(csvFile)

writer.writerow([str(zh_name[idnum]),str(theTime)])elif k==27:

cap.release()

cv2.destroyAllWindows()break

whileTrue:

a= int(input("输入1,录入脸部,输入2进行识别打卡:"))if a==1:

data_collection()elif a==2:

face_ientification()elif a==3:

face_training()

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
人脸识别门禁系统是一种基于人脸识别技术的智能门禁系统,其可通过对人脸进行采集、识别和比对,实现对门禁的控制和管理。本文将详细阐述基于python+openCV+dlib+mysql的人脸识别门禁系统的设计与实现。 一、技术选型 本系统主要采用以下技术: 1. Python:作为主要编程语言,用于实现整个系统的逻辑控制和算法设计。 2. OpenCV:作为图像处理库,用于实现人脸检测、特征提取和人脸识别等核心功能。 3. Dlib:作为人脸识别库,用于实现人脸特征点检测和人脸识别等功能。 4. MySQL:作为数据库系统,用于存储人脸特征和相关信息。 二、系统设计 本系统主要包括以下功能模块: 1. 人脸采集模块:用于采集用户的人脸图像,并将其存储到本地或远程数据库中。 2. 人脸检测模块:用于检测人脸区域,提取人脸特征,并将其存储到数据库中。 3. 人脸识别模块:用于识别用户的人脸特征,并与数据库中的人脸特征进行比对,以确定用户身份。 4. 门禁控制模块:根据用户身份结果,控制门禁的开关。 5. 数据库管理模块:用于管理数据库中的人脸特征和相关信息。 三、系统实现 1. 人脸采集模块 人脸采集模块主要是通过摄像头对用户的人脸进行拍摄和保存。代码如下: ```python import cv2 cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() cv2.imshow("capture", frame) if cv2.waitKey(1) & 0xFF == ord('q'): #按q键退出 cv2.imwrite("face.jpg", frame) #保存人脸图像 break cap.release() cv2.destroyAllWindows() ``` 2. 人脸检测模块 人脸检测模块主要是通过OpenCV中的CascadeClassifier类进行人脸检测,再通过Dlib中的shape_predictor类进行人脸特征点检测和特征提取。代码如下: ```python import cv2 import dlib detector = dlib.get_frontal_face_detector() #人脸检测器 predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") #特征点检测器 img = cv2.imread("face.jpg") #读取人脸图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #转换为灰度图像 faces = detector(gray, 0) #检测人脸 for face in faces: landmarks = predictor(gray, face) #检测特征点 for n in range(68): x = landmarks.part(n).x y = landmarks.part(n).y cv2.circle(img, (x, y), 2, (0, 255, 0), -1) #绘制特征点 cv2.imshow("face", img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 3. 人脸识别模块 人脸识别模块主要是通过Dlib中的face_recognition类进行人脸特征提取和比对。代码如下: ```python import face_recognition known_image = face_recognition.load_image_file("known_face.jpg") #读取已知的人脸图像 unknown_image = face_recognition.load_image_file("unknown_face.jpg") #读取待识别的人脸图像 known_encoding = face_recognition.face_encodings(known_image)[0] #提取已知人脸的特征 unknown_encoding = face_recognition.face_encodings(unknown_image)[0] #提取待识别人脸的特征 results = face_recognition.compare_faces([known_encoding], unknown_encoding) #比对人脸特征 if results[0]: print("Match") else: print("No match") ``` 4. 门禁控制模块 门禁控制模块主要是通过GPIO控制门禁的开关。代码如下: ```python import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BOARD) GPIO.setup(11, GPIO.OUT) GPIO.output(11, GPIO.HIGH) #开门 time.sleep(5) #等待5秒 GPIO.output(11, GPIO.LOW) #关门 GPIO.cleanup() #清理GPIO资源 ``` 5. 数据库管理模块 数据库管理模块主要是通过MySQLdb模块实现对MySQL数据库的连接和操作,包括新建数据库、新建表、插入数据、查询数据等。代码如下: ```python import MySQLdb #连接数据库 conn = MySQLdb.connect(host="localhost", user="root", passwd="123456", db="test", charset="utf8") #新建表 cursor = conn.cursor() sql = "CREATE TABLE `face` (`id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `encoding` text NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;" cursor.execute(sql) #插入数据 name = "张三" encoding = "0.1,0.2,0.3,0.4" sql = "INSERT INTO `face` (`name`, `encoding`) VALUES (%s, %s)" cursor.execute(sql, (name, encoding)) conn.commit() #查询数据 sql = "SELECT * FROM `face` WHERE `name`=%s" cursor.execute(sql, (name,)) result = cursor.fetchone() print(result) cursor.close() conn.close() ``` 四、总结 本文主要介绍了基于python+openCV+dlib+mysql的人脸识别门禁系统的设计与实现。该系统主要采用了Python作为主要编程语言,OpenCV、Dlib作为图像处理和人脸识别库,MySQL作为数据库系统。通过对这些技术的应用,实现了人脸采集、检测、识别和门禁控制等核心功能。该系统可以应用于各类场景的门禁控制和身份验证,具有较高的实用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值