【问题标题】:How to make unrecognized faces in opencv2 be labeled "unknown"?如何使opencv2中无法识别的面孔被标记为“未知”?
【发布时间】:2017-05-06 11:33:21
【问题描述】:

我正在尝试使用 opencv2 运行一些 python 2.7 代码。目前,如果一个对象进入框架,代码会将其标记为它在照片数据库中看起来最像的那个。而不是这个,我希望它将未经训练的面孔标记为“未知”,这是我到目前为止的代码:

import cv2
import numpy as np

faceDetect=cv2.CascadeClassifier('haarcascade_frontalface_default.xml');
cam=cv2.VideoCapture(0);
rec=cv2.createLBPHFaceRecognizer();
rec.load("recognizer\\trainingData.yml")
id=0
font=cv2.cv.InitFont(cv2.cv.CV_FONT_HERSHEY_SIMPLEX,1,1,0,0)
#font=cv2.cv.InitFont(cv2.cv.CV_FONT_HERSHEY_COMPLEX_SMALL,3,1,0,1)
while (True):
   ret, img=cam.read();
   gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
   faces=faceDetect.detectMultiScale(gray,1.3,5);
   for (x,y,w,h) in faces:
        #cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,255),2)
        id,conf=rec.predict(gray[y:y+h, x:x+w])
        if(id==1):
            id="Admin"
            cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,255),2)
        elif(id==2):
            id="Sonja"
            cv2.rectangle(img,(x,y),(x+w,y+h),(255,255,255),2)
            cv2.rectangle(img,(x,y),(x+w,y+h),(255,255,255),2)
        cv2.cv.PutText(cv2.cv.fromarray(img),str(id),(x,y+h),font,(255,255,255));
    cv2.imshow("Image",img);
    if(cv2.waitKey(1)==ord('q')):
        break;
cam.release()
cv2.destroyAllWindows()

并且训练器是通过这段代码运行的:

import os
import cv2
import numpy as np
from PIL import Image

recognizer=cv2.createLBPHFaceRecognizer();
path='dataSet'

def getImagesWithID(path):
   imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
   faces=[]
   IDs=[]
   for imagePath in imagePaths:
        faceImg=Image.open(imagePath).convert('L');
        faceNp=np.array(faceImg,'uint8')
        ID=int(os.path.split(imagePath)[-1].split('.')[1])
        faces.append(faceNp)
        print ID
        IDs.append(ID)
        cv2.imshow("training",faceNp)
        cv2.waitKey(10)
    return np.array(IDs), faces

Ids, faces= getImagesWithID(path)
recognizer.train(faces, Ids)
recognizer.save('recognizer/trainingData.yml')
cv2.destroyAllWindows()

【问题讨论】:

    标签: python-2.7 opencv numpy webcam image-recognition


    【解决方案1】:
    if conf<70:
            if id !=0 & id !=1:
                cv2.putText(img,"unknown",(x,y),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2,cv2.LINE_AA)
    

    【讨论】:

      【解决方案2】:
      import cv2
      import numpy as np
      from time import sleep
      
      
      faceDetect=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
      cam=cv2.VideoCapture(0)
      rec=cv2.createLBPHFaceRecognizer()
      rec.load("recognizer/trainingData.yml")
      id=0
      font=cv2.cv.InitFont(cv2.cv.CV_FONT_HERSHEY_COMPLEX_SMALL,1,1,0,1)
      while True:
          ret,img=cam.read();
          gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
          faces=faceDetect.detectMultiScale(gray, 1.3, 5)
          for(x,y,w,h) in faces:
              cv2.rectangle(img, (x,y), (x+w,y+h), (255, 0, 0), 2)
              id,conf=rec.predict(gray[y:y+h, x:x+w])
              if(conf<70):
                  if(id==1):
                      id="Admin"
                  if(id==2):
                      id="Sonja"
              else:
                  id="unknown"
      
              cv2.cv.PutText(cv2.cv.fromarray(img), str(id), (x,y+h), font,255)
              print ('ok')
          cv2.imshow("Face",img)
          if (cv2.waitKey(1) & 0xFF==ord('q')):
              break
      cam.release()
      cv2.destroyAllWindows()
      

      【讨论】:

      • 谢谢 Anuraj S,我仍然遇到这个问题,实际上它现在可能会将我误认为是“Sonja”看看
      【解决方案3】:

      如果你打印 conf 的值,你可以看到如果面部在你创建的数据集中,该值将小于 70,否则 的值>conf 将超过 70。如果您希望系统更准确地检查 conf 的值并根据您的意愿提供任何其他值,则值 70 由我设置。

      【讨论】:

      • 我建议添加一个简单的代码 sn-p 来备份您的答案。
      • 谢谢 Anuraj S,我仍然遇到这个问题,实际上它现在可能会将我误认为是“Sonja”看看。
      【解决方案4】:

      我假设您的 rec.predict 方法返回已识别面孔的 id。在这种情况下,您可以在 for (x,y,w,h) in faces: 循环中为没有 id 的面添加“else”条件,如下所示:

              if(id==1):
                  id="Admin"
                  cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,255),2)
                  cv2.putText(img,"Admin",x+h/2,y+w+40),cv2.FONT_HERSHEY_SIMPLEX,0.6,(0,255,255),2)
              elif(id==2):
                  id="Sonja"
                  #cv2.rectangle(img,(x,y),(x+w,y+h),(255,255,255),2)
                  cv2.rectangle(img,(x,y),(x+w,y+h),(255,255,255),2)
                  cv2.putText(img,"Sonja",x+h/2,y+w+40),cv2.FONT_HERSHEY_SIMPLEX,0.6,(255,255,255),2)
              else:
                  cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),2)#Red
                  cv2.putText(img,"Unknown",(x+h/2,y+w+40),cv2.FONT_HERSHEY_SIMPLEX,0.6,(0,0,255),2)
      

      另外,我实现 putText 方法的方式与您展示的不同。

      【讨论】:

      • 感谢@Saransh Kejriwai,但是我试过了,但没有运气。
      • 这可能是您实现 PutText() 的方式的问题。我已经更新了答案
      • 很抱歉,Saransh 给您带来不便,但更新后的答案也不起作用。您还有其他想法吗?
      • 你得到的输出是什么?
      • Sonja 或管理员。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-19
      • 1970-01-01
      • 2017-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多