Necesito hacer un seguimiento facial con una ID de secuencia. Ejemplo: Juan será la primera cara con ID=1
, Mark será la segunda cara a aparecer con ID=2
, si John desaparece y aparece de nuevo en el video será ID=3
. Creo que eso es simple, pero no puedo hacer que algo como esto funcione.
Tengo este código para reconocimiento de cara:
import cv2
import sys
cascPath = sys.argv[1]
faceCascade = cv2.CascadeClassifier(cascPath)
video_capture = cv2.VideoCapture(0)
while True:
ret, frame = video_capture.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=5,
minSize=(30, 30),
flags=cv2.cv.CV_HAAR_SCALE_IMAGE
)
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.imshow("Video", frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
video_capture.release()
cv2.destroyAllWindows()
Pero no sé cómo generar estas IDs.
Respuestas
0 para la respuesta № 1Para asignar ID a las caras, debe realizar un seguimiento de ellas en cada fotograma consecutivo del video. Un pseudocódigo sería como el siguiente.
- Identifique todas las caras en el cuadro de video (ya lo está haciendo).
- Asigna cada elemento en
faces
una identificación, y guárdelo comoprev_faces
. - En el siguiente cuadro, si
prev_faces[i]
se superpone confaces[j]
, entonces Jon sigue en el cuadro! - Si
prev_faces[i]
no se superponen con ningún elemento enfaces
, entonces Jon está fuera. - Si
faces[i]
no se superponen con ningún elemento enprev_faces
, entonces tenemos un nuevo visitante. Incrementa los números de ID y asigna eso a la nueva cara.
Múltiples elementos en faces
podría superponerse con múltiples elementos en prev_faces
. En ese caso, puede extraer y almacenar algunas características de caras y hacer la comparación en función de eso.
Espero que suene claro!