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.