2017-11-29 4 views
0

コードが実行されますが、代わりにdetect.pyの間に自分の名前を投稿するのは不明です。誰にでも解決策がありますか?OpenCVでPython

import cv2 
import numpy as np 


recognizer = cv2.face.LBPHFaceRecognizer_create() 
recognizer.read('trainer/trainer.yml') 
cascadePath = "haarcascade_frontalface_default.xml" 
faceCascade = cv2.CascadeClassifier(cascadePath); 
font = cv2.FONT_HERSHEY_SIMPLEX 
cam = cv2.VideoCapture(0) 


while True: 
    ret, im =cam.read() 
    gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) 
    faces = faceCascade.detectMultiScale(gray, 1.2,5) 


for(x,y,w,h) in faces: 
    cv2.rectangle(im, (x-20,y-20), (x+w+20,y+h+20), (0,255,0), 4) 
    Id = recognizer.predict(gray[y:y+h,x:x+w]) 
    if(Id == 1): 
     Id = "Alec" 
    elif(Id == 2): 
     Id = "Chase" 
    else: 
     Id = "Unknown" 
    cv2.rectangle(im, (x-22,y-90), (x+w+22, y-22), (0,255,0), -1) 
    cv2.putText(im, str(Id), (x,y-40), font, 2, (255,255,255), 3) 
if cv2.waitKey(10) & 0xFF == ord('q'): 
    break 


cam.release() 
cv2.destroyAllWindows() 

エラーの種類は表示されません。 If(id == X)コードをコメントアウトして、画面に何が表示されるかを確認しました。プログラムが印刷された(1,30-40)。だから私は1が私のIDだと推測しています。私はそれを提供する必要がある場合、私はDataSetとトレーナープログラムを持っています。

答えて

1

recognizer.predictは、Idと信頼スコアの両方を返します。

Id, conf = recognizer.predict(gray[y:y+h,x:x+w]) 
    if(conf<50): 
     if(Id==1): 
      Id="asciime" 
     elif(Id==2): 
      Id="Something" 
    else: 
     Id="Unknown" 

OpenCVのPython APIドキュメントは非常に貧弱です。私はしばしばC++リファレンスを使用します。この場合、予測方法は

void cv::face::FaceRecognizer::predict(InputArray src, int& label, double& confidence) const 

https://docs.opencv.org/3.2.0/dd/d65/classcv_1_1face_1_1FaceRecognizer.html#ab0d593e53ebd9a0f350c989fcac7f251を参照してください。

+0

を働くだろう取得あなたはいくつかのドキュメントにリンクすることができます) 'メソッド? –

+0

私は答えにリンクといくつかの説明を追加します –

+0

素晴らしい!いい答え。 –

0

信頼度は標準で50に設定されています。 しかし、IDには2つの値があります。 int(ID)とdouble(Conf)です。 https://docs.opencv.org/3.0.0/dd/d65/classcv_1_1face_1_1FaceRecognizer.html#aede3fa2ec7a4ee35e67bc998df23883b OPは `(予測の出力を理解するためのリソースを持っているので、IDを持つ最初の値が[1]

for(x,y,w,h) in faces: 
    cv2.rectangle(im, (x-20,y-20), (x+w+20,y+h+20), (0,255,0), 4) 
    Id = recognizer.predict(gray[y:y+h,x:x+w]) 
    if(Id[1] == 1): 
     Id = "Alec" 
    elif(Id[1] == 2): 
     Id = "Chase" 
    else: 
     Id = "Unknown" 
    cv2.rectangle(im, (x-22,y-90), (x+w+22, y-22), (0,255,0), -1) 
    cv2.putText(im, str(Id), (x,y-40), font, 2, (255,255,255), 3) 
if cv2.waitKey(10) & 0xFF == ord('q'): 
    break 

または

for(x,y,w,h) in faces: 
    cv2.rectangle(im, (x-20,y-20), (x+w+20,y+h+20), (0,255,0), 4) 
    Id,conf = recognizer.predict(gray[y:y+h,x:x+w]) 
    if(Id == 1): 
     Id = "Alec" 
    elif(Id == 2): 
     Id = "Chase" 
    else: 
     Id = "Unknown" 
    cv2.rectangle(im, (x-22,y-90), (x+w+22, y-22), (0,255,0), -1) 
    cv2.putText(im, str(Id), (x,y-40), font, 2, (255,255,255), 3) 
if cv2.waitKey(10) & 0xFF == ord('q'): 
    break