大蟒蛇python教程共享Python基于pyopencv人脸识别并绘制GUI界面

目录
  • 项目介绍
    • 采集人脸:
    • 识别功能:
  • 项目思路
    • 项目模块
      • 1.人脸采集
      • 2.数据训练
      • 3.人脸识别
      • 4.gui界面
    • 项目代码
      • 人脸采集
      • 数据训练
      • 人脸识别
      • 合并gui
    • 项目总结

      项目介绍

      我们先来看看成果:

      Python基于pyopencv人脸识别并绘制GUI界面

      首先写了一个能够操作的gui界面。

      其中两个按钮对应相应的功能:

      采集人脸:

      Python基于pyopencv人脸识别并绘制GUI界面

      识别功能:

      我可是牺牲了色相五五五五。。。(电脑像素不是很好大家将就一下嘿嘿嘿)

      Python基于pyopencv人脸识别并绘制GUI界面

      Python基于pyopencv人脸识别并绘制GUI界面

      项目思路

      本项目是借助于python的一个cv2图像识别库,通过调取电脑的摄像头进行识别人脸并保存人脸图片的功能,然后在通过cv2中的这两个训练工具对保存的人脸图片进行训练(这些都是已经写好的人脸识别算法)我们直接调用就可以。

      Python基于pyopencv人脸识别并绘制GUI界面

      项目模块

      本项目大致细分能分四个模块。

      1.人脸采集

      通过

      cv2.cascadeclassifier(‘haarcascade_frontalface_default.xml’)

      对摄像头的图片进行人脸信息的对比,找到人脸的核心区域然后用长方形方框给圈出来,等待指令,并且进行下一步的保存人脸图片:

      Python基于pyopencv人脸识别并绘制GUI界面

      这些都是我保存好的(我可是牺牲了色相呜呜呜)这些用来进行数据训练。

      2.数据训练

      将某一目录下的图片转化为数组,获取每张图片中人脸部分的数据保存到事先创建好的列表中,同时获取每张图片的id,同样保存在事先创建好的列表中,最后将训练后的数据保存。

      3.人脸识别

      cv2会把训练好的数据放在一个文件中,我们在识别的时候直接调用这个数据和摄像头上面的人脸进行对比。

      Python基于pyopencv人脸识别并绘制GUI界面

       上图为训练好的一个文件。

      识别效果在上面大家也看到了!!!

      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界面的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持<计算机技术网(www.ctvol.com)!!>。

      需要了解更多python教程分享Python基于pyopencv人脸识别并绘制GUI界面,都可以关注python教程分享栏目—计算机技术网(www.ctvol.com)!

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/pythontutorial/967741.html

      (0)
      上一篇 2021年12月10日
      下一篇 2021年12月10日

      精彩推荐