Python基于pyopencv人脸识别并绘制GUI界面
程序员文章站
2022-03-10 13:12:48
目录项目介绍采集人脸:识别功能:项目思路项目模块1.人脸采集2.数据训练3.人脸识别4.gui界面项目代码人脸采集数据训练人脸识别合并gui项目总结项目介绍我们先来看看成果:首先写了一个能够操作的gu...
项目介绍
我们先来看看成果:
首先写了一个能够操作的gui界面。
其中两个按钮对应相应的功能:
采集人脸:
识别功能:
我可是牺牲了色相五五五五。。。(电脑像素不是很好大家将就一下嘿嘿嘿)
项目思路
本项目是借助于python的一个cv2图像识别库,通过调取电脑的摄像头进行识别人脸并保存人脸图片的功能,然后在通过cv2中的这两个训练工具对保存的人脸图片进行训练(这些都是已经写好的人脸识别算法)我们直接调用就可以。
项目模块
本项目大致细分能分四个模块。
1.人脸采集
通过
cv2.cascadeclassifier('haarcascade_frontalface_default.xml')
对摄像头的图片进行人脸信息的对比,找到人脸的核心区域然后用长方形方框给圈出来,等待指令,并且进行下一步的保存人脸图片:
这些都是我保存好的(我可是牺牲了色相呜呜呜)这些用来进行数据训练。
2.数据训练
将某一目录下的图片转化为数组,获取每张图片中人脸部分的数据保存到事先创建好的列表中,同时获取每张图片的id,同样保存在事先创建好的列表中,最后将训练后的数据保存。
3.人脸识别
cv2会把训练好的数据放在一个文件中,我们在识别的时候直接调用这个数据和摄像头上面的人脸进行对比。
上图为训练好的一个文件。
识别效果在上面大家也看到了!!!
4.gui界面
这个我是通过pyqt来设计了一个简单的gui界面,配置pyqt环境我在我之前的一篇博客介绍过了——
使用了两个简单的button来进行一个可视化。
项目代码
人脸采集
import numpy as np import cv2 def b(): print('正在调用摄像头!') facecascade = cv2.cascadeclassifier('haarcascade_frontalface_default.xml') cap = cv2.videocapture(0) cap.set(3,640) # set width cap.set(4,480) # set height while true: ret, img = cap.read() #将彩色图转为灰度图 gray = cv2.cvtcolor(img, cv2.color_bgr2gray) faces = facecascade.detectmultiscale( gray, scalefactor=1.2, minneighbors=5 , minsize=(20, 20) ) for (x,y,w,h) in faces: cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) roi_gray = gray[y:y+h, x:x+w] roi_color = img[y:y+h, x:x+w] cv2.imshow('video',img) k = cv2.waitkey(30) & 0xff if k == ord('s'): n = input('请输入编号:') cv2.imwrite('./data/jm/'+n+'.jpg',roi_gray) if k == 27: # press 'esc' to quit break cap.release() cv2.destroyallwindows() b()
数据训练
import os import cv2 import sys from pil import image import numpy as np def getimageandlabels(path): facessamples=[] ids=[] imagepaths=[os.path.join(path,f) for f in os.listdir(path)] #检测人脸 face_detector = cv2.cascadeclassifier('haarcascade_frontalface_alt2.xml') #打印数组imagepaths print('数据排列:',imagepaths) #遍历列表中的图片 for imagepath in imagepaths: #打开图片,黑白化 pil_img=image.open(imagepath).convert('l') #将图像转换为数组,以黑白深浅 # pil_img = cv2.resize(pil_img, dsize=(400, 400)) img_numpy=np.array(pil_img,'uint8') #获取图片人脸特征 faces = face_detector.detectmultiscale(img_numpy) #获取每张图片的id和姓名 id = int(os.path.split(imagepath)[1].split('.')[0]) #预防无面容照片 for x,y,w,h in faces: ids.append(id) facessamples.append(img_numpy[y:y+h,x:x+w]) #打印脸部特征和id #print('fs:', facessamples) print('id:', id) #print('fs:', facessamples[id]) print('fs:', facessamples) #print('脸部例子:',facessamples[0]) #print('身份信息:',ids[0]) return facessamples,ids if __name__ == '__main__': #图片路径 path='./data/jm/' #获取图像数组和id标签数组和姓名 faces,ids=getimageandlabels(path) #获取训练对象 recognizer=cv2.face.lbphfacerecognizer_create() #recognizer.train(faces,names)#np.array(ids) recognizer.train(faces,np.array(ids)) #保存文件 recognizer.write('trainer/trainer3.yml')
人脸识别
import cv2 import os def a(): #加载识别器 recognizer = cv2.face.lbphfacerecognizer_create() recognizer.read('trainer/trainer3.yml') #加载分类器 cascade_path = "haarcascade_frontalface_alt2.xml" face_cascade = cv2.cascadeclassifier(cascade_path) cam = cv2.videocapture(0) minw = 0.1*cam.get(3) minh = 0.1*cam.get(4) font = cv2.font_hershey_simplex names = [] agelist=[21,21,21,21,21,21,22] path='./data/jm/' imagepaths=[os.path.join(path,f) for f in os.listdir(path)] for imagepath in imagepaths: id = int(os.path.split(imagepath)[1].split('.')[0]) names.append(id) while true: ret, img = cam.read() gray = cv2.cvtcolor(img, cv2.color_bgr2gray) faces = face_cascade.detectmultiscale( gray, scalefactor=1.3, minneighbors=5, minsize=(int(minw), int(minh)) ) for (x, y, w, h) in faces: cv2.rectangle(img, (x , y ), (x + w , y + h ), (225, 0, 0), 2) img_id, confidence = recognizer.predict(gray[y:y + h, x:x + w]) print(img_id,confidence) if confidence < 50: confidence = "{0}%".format(round(100 - confidence)) else: img_id = "unknown" confidence = "{0}%".format(round(100 - confidence)) if img_id != "unknown": print('识别成功!!') else: print('识别失败!!') cv2.puttext(img, str(img_id), (x, y + h), font, 0.55, (0, 255, 0), 1) cv2.puttext(img, "18", (x , y + 500), font, 1, (0, 255, 0), 1) cv2.puttext(img, "18", (x , y +h + 150), font, 1, (0, 255, 0), 1) cv2.puttext(img, str(confidence), (x + 5, y - 5), font, 1, (0, 255, 0), 1) cv2.imshow('face', img) if cv2.waitkey(5) & 0xff == 27: break cam.release() cv2.destroyallwindows()
合并gui
from pyqt5 import qtcore, qtgui, qtwidgets import cv2 class ui_mainwindow(qtwidgets.qmainwindow): def __init__(self): super(ui_mainwindow,self).__init__() def setupui(self, mainwindow): mainwindow.setobjectname("mainwindow") mainwindow.resize(565, 331) self.centralwidget = qtwidgets.qwidget(mainwindow) self.centralwidget.setobjectname("centralwidget") self.pushbutton = qtwidgets.qpushbutton(self.centralwidget) self.pushbutton.setgeometry(qtcore.qrect(70, 190, 111, 61)) self.pushbutton.setobjectname("pushbutton") self.pushbutton_2 = qtwidgets.qpushbutton(self.centralwidget) self.pushbutton_2.setgeometry(qtcore.qrect(310, 190, 121, 61)) self.pushbutton_2.setobjectname("pushbutton_2") self.label = qtwidgets.qlabel(self.centralwidget) self.label.setgeometry(qtcore.qrect(180, 60, 161, 81)) self.label.setobjectname("label") mainwindow.setcentralwidget(self.centralwidget) self.menubar = qtwidgets.qmenubar(mainwindow) self.menubar.setgeometry(qtcore.qrect(0, 0, 565, 26)) self.menubar.setobjectname("menubar") mainwindow.setmenubar(self.menubar) self.statusbar = qtwidgets.qstatusbar(mainwindow) self.statusbar.setobjectname("statusbar") mainwindow.setstatusbar(self.statusbar) self.retranslateui(mainwindow) qtcore.qmetaobject.connectslotsbyname(mainwindow) def retranslateui(self, mainwindow): _translate = qtcore.qcoreapplication.translate mainwindow.setwindowtitle(_translate("mainwindow", "mainwindow")) self.pushbutton.settext(_translate("mainwindow", "采集人脸信息")) self.pushbutton_2.settext(_translate("mainwindow", "开始识别")) # self.label.settext(_translate("mainwindow", "结果:")) self.pushbutton.clicked.connect(self.b) self.pushbutton_2.clicked.connect(self.final) def b(self): print('正在调用摄像头!') print("输入'esc'为退出!!!") facecascade = cv2.cascadeclassifier('haarcascade_frontalface_default.xml') cap = cv2.videocapture(0) cap.set(3, 640) # set width cap.set(4, 480) # set height print("请输入字母's'保存信息!!") while true: ret, img = cap.read() # 将彩色图转为灰度图 gray = cv2.cvtcolor(img, cv2.color_bgr2gray) faces = facecascade.detectmultiscale( gray, scalefactor=1.2, minneighbors=5 , minsize=(20, 20) ) for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2) roi_gray = gray[y:y + h, x:x + w] roi_color = img[y:y + h, x:x + w] cv2.imshow('video', img) k = cv2.waitkey(30) & 0xff if k == ord('s'): n = input('请输入编号:') cv2.imwrite('./data/jm/' + n + '.jpg', roi_gray) if k == 27: break cap.release() cv2.destroyallwindows() print("正在训练!!!") self.train() def final(self): import face_zhineng.final_face face_zhineng.final_face.a() def train(self): import cv2 import numpy as np import face_zhineng.training # 图片路径 path = './data/jm/' faces, ids = face_zhineng.training.getimageandlabels(path) # 获取训练对象 recognizer = cv2.face.lbphfacerecognizer_create() recognizer.train(faces, np.array(ids)) # 保存文件 recognizer.write('trainer/trainer3.yml') print("训练完毕!!!") if __name__ == '__main__': import sys app = qtwidgets.qapplication(sys.argv) mainwindow = qtwidgets.qmainwindow() ui = ui_mainwindow() ui.setupui(mainwindow) mainwindow.show() sys.exit(app.exec_())
项目总结
到此这篇关于python基于pyopencv人脸识别并绘制gui界面的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。
下一篇: C++ decltype 说明符