简体   繁体   中英

Face recognition problem on OpenCV python

I would really appreciate help, I made a face recognition on openCV. The problem is that I need to display the name of the recognized person in cmd, for example, if a person with the name Alex was recognized, then the name of the person should be displayed in cmd via print(id), I tried after if (certainty> 20): id = names [id] insert print(id), but it gets into the while loop and prints an infinite amount, I need it to print the person's name once, and not in the loop, but so that recognition continues. Here is the code

import cv2
import numpy as np
import os 


recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer/trainer.yml')
cascadePath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascadePath);
font = cv2.FONT_HERSHEY_SIMPLEX#iniciate id counter

id = 0# names related to ids: example ==> Marcelo: id=1,  etc

names = ['None', 'Alex', 'Trump', 'Obama', 'Z', 'W'] # Initialize and start realtime video capture

cam = cv2.VideoCapture(1)
cam.set(3, 1280) # set video widht
cam.set(4, 720) # set video height# Define min window size to be recognized as a face

minW = 0.1*cam.get(3)
minH = 0.1*cam.get(4)

while True:
    ret, img =cam.read()# Flip vertically
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

    faces = faceCascade.detectMultiScale( 
        gray,
        scaleFactor = 1.2,
        minNeighbors = 5,
        minSize = (int(minW), int(minH)),
       )
    for(x,y,w,h) in faces:
        cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)
        id, confidence = recognizer.predict(gray[y:y+h,x:x+w])
                # If confidence is less them 100 ==> "0" : perfect match 
        if (confidence > 20):
            id = names[id]
            confidence = "  {0}%".format(round(100 - confidence))

        else:
            id = "Unknown person"
            confidence = "  {0}%".format(round(100 - confidence))

        cv2.putText(
                    img, 
                    str(id), 
                    (x+5,y-5), 
                    font, 
                    1, 
                    (255,255,255), 
                    2
                   )
        cv2.putText(
                    img, 
                    str(confidence), 
                    (x+5,y+h-5), 
                    font, 
                    1, 
                    (255,255,0), 
                    1
                   )  

    cv2.imshow('camera',img) 
    k = cv2.waitKey(10) & 0xff # Press 'ESC' for exiting video
    if k == 27:
        break# Do a bit of cleanup
print("\n [INFO] Exiting Program and cleanup stuff")
cam.release()
cv2.destroyAllWindows()

at start create

previous_id = None

and in loop use

if id != previous_id:
   print(id)
   previous_id = id

if you want to print id only once even if it is again after other id then use list

at start create

all_previous_id = []

and in loop use

if id not in all_previous_id:
   print(id)
   all_previous_id.append(id)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM