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

      项目介绍

      我们先来看看成果:

      首先写了一个能够操作的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界面的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持www.887551.com。