Python 2.7 如何在opencv2中标记“未识别的面”;未知;?

Python 2.7 如何在opencv2中标记“未识别的面”;未知;?,python-2.7,opencv,numpy,webcam,image-recognition,Python 2.7,Opencv,Numpy,Webcam,Image Recognition,我正在尝试使用opencv2运行一些python 2.7代码。当前,如果主体进入框架,代码会将其标记为其照片数据库中最像的对象。与此相反,我希望它将未经培训的人脸标记为“未知”,这是我迄今为止的代码: import cv2 import numpy as np faceDetect=cv2.CascadeClassifier('haarcascade_frontalface_default.xml'); cam=cv2.VideoCapture(0); rec=cv2.createLBPHFa

我正在尝试使用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()

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

        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方法与您展示的方法不同。

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

        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方法与您展示的方法不同。

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

如果打印conf的值,您可以看到,如果面在您创建的数据集中,则conf的值将小于70,否则conf的值将大于70。值70由我设置,如果您希望系统更准确,请检查conf的值,并根据您的意愿给出任何其他值

导入cv2
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()
将numpy作为np导入 从时间上导入睡眠 faceDetect=cv2.CascadeClassifier('haarcascade\u frontalface\u default.xml')) cam=cv2.视频捕获(0) rec=cv2.createLBPHFaceRecognizer() 记录加载(“识别器/训练数据.yml”) id=0 font=cv2.cv.InitFont(cv2.cv.cv\u font\u HERSHEY\u COMPLEX\u SMALL,1,1,0,1) 尽管如此: ret,img=cam.read(); 灰色=cv2.CVT颜色(img,cv2.COLOR\U BGR2GRAY) 面=面检测。检测多尺度(灰色,1.3,5) 对于面中的(x,y,w,h): cv2.矩形(img,(x,y),(x+w,y+h),(255,0,0),2) id,conf=rec.predict(灰色[y:y+h,x:x+w]) 如果(conf
导入cv2
将numpy作为np导入
从时间上导入睡眠
faceDetect=cv2.CascadeClassifier('haarcascade\u frontalface\u default.xml'))
cam=cv2.视频捕获(0)
rec=cv2.createLBPHFaceRecognizer()
记录加载(“识别器/训练数据.yml”)
id=0
font=cv2.cv.InitFont(cv2.cv.cv\u font\u HERSHEY\u COMPLEX\u SMALL,1,1,0,1)
尽管如此:
ret,img=cam.read();
灰色=cv2.CVT颜色(img,cv2.COLOR\U BGR2GRAY)
面=面检测。检测多尺度(灰色,1.3,5)
对于面中的(x,y,w,h):
cv2.矩形(img,(x,y),(x+w,y+h),(255,0,0),2)
id,conf=rec.predict(灰色[y:y+h,x:x+w])

if(conf
if-conf
if-confThank@Saransh-Kejriwai,不过我已经尝试过了,但没有成功。这可能是您实现PutText()的方式的问题。我已经更新了我的答案。我非常抱歉Saransh给您带来不便,但更新后的答案也不起作用。您还有其他想法吗?您得到的输出是什么?Sonja或Admin。谢谢@Saransh Kejriwai,但我尝试过,但运气不佳。这可能是您实现PutText()的方式的问题。我已经更新了我的答案。我真的很抱歉Saransh给您带来不便,但更新后的答案也不起作用。您还有其他想法吗?您得到的输出是什么?Sonja或Admin。我建议添加一个简单的代码片段来备份您的答案。谢谢Anuraj,我仍然收到这个问题,事实上,它现在可能会错误地将我识别为“Sonja”我在培训师上方添加了,可能我在看一些东西,请看一下。我建议添加一个简单的代码片段来备份您的答案。谢谢Anuraj S,我仍然收到这个问题,事实上,它现在可能会错误地将我识别为“Sonja”“我在培训师上面加了一句话,也许我看得太多了,你能看一下吗。谢谢你,阿努拉吉,我仍然有这个问题,事实上,现在它可能会误认为我是“Sonja”我在培训师上面加了一句话,也许我看得太多了,你能看一下吗谢谢你,阿努拉吉,我仍然有这个问题,事实上,现在它可能会误认为我是“Sonja”,我在培训师上面加了一句话,也许我看得太多了,你能看一下吗