131 lines
4.2 KiB
Python
131 lines
4.2 KiB
Python
import os
|
|
import sys
|
|
|
|
import cv2
|
|
import numpy as np
|
|
|
|
import reconocedor as rec
|
|
|
|
CONOCIDOS = rec.CONOCIDOS
|
|
WEB_CAM = 0
|
|
|
|
|
|
def escribir(texto, frame):
|
|
cv2.putText(frame, texto, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 255), 2)
|
|
|
|
|
|
def capturar_cara(r, frame):
|
|
caras = r.detectar_caras(frame)
|
|
if not caras:
|
|
return None, None
|
|
mejor = max(caras, key=lambda c: c[-1])
|
|
emb = r.embedding_cara(frame, mejor)
|
|
return emb, mejor
|
|
|
|
|
|
def capturar_cuerpo(r, frame):
|
|
personas = r._detectar_personas(frame)
|
|
if not personas:
|
|
return None, None
|
|
mayor = max(personas, key=lambda p: p[2] * p[3])
|
|
x, y, w, h = mayor
|
|
recorte = frame[y:y + h, x:x + w]
|
|
emb = r.embedding_cuerpo(recorte)
|
|
return emb, mayor
|
|
|
|
|
|
def main():
|
|
nombres = sys.argv[1:]
|
|
if not nombres:
|
|
nombres = ["Hija1", "Hija2"]
|
|
print(f"Registrando: {nombres}")
|
|
|
|
r = rec.cargar_reconocedor()
|
|
os.makedirs(CONOCIDOS, exist_ok=True)
|
|
|
|
cap = cv2.VideoCapture(WEB_CAM)
|
|
if not cap.isOpened():
|
|
print("ERROR: no se pudo abrir la webcam")
|
|
sys.exit(1)
|
|
|
|
cv2.namedWindow("Registro", cv2.WINDOW_NORMAL)
|
|
|
|
for nombre in nombres:
|
|
carpeta = os.path.join(CONOCIDOS, nombre)
|
|
os.makedirs(carpeta, exist_ok=True)
|
|
|
|
tiene_cara = os.path.exists(os.path.join(carpeta, "face.npy"))
|
|
tiene_cuerpo = os.path.exists(os.path.join(carpeta, "body.npy"))
|
|
if tiene_cara and tiene_cuerpo:
|
|
print(f" {nombre} ya registrado completo, omitido.")
|
|
continue
|
|
|
|
fase = "cuerpo" if tiene_cara else "cara"
|
|
print(f"\n>>> Hija: {nombre} (falta {fase})")
|
|
while True:
|
|
ok, frame = cap.read()
|
|
if not ok:
|
|
continue
|
|
|
|
caras = r.detectar_caras(frame)
|
|
personas = r._detectar_personas(frame)
|
|
|
|
for c in caras:
|
|
x, y, w, h = (int(v) for v in c[:4])
|
|
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
|
|
for p in personas:
|
|
x, y, w, h = p
|
|
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
|
|
|
|
if fase == "cara":
|
|
escribir("CARA: pon la cara mirando a la camara y pulsa ESPACIO", frame)
|
|
else:
|
|
escribir("CUERPO: alejate (cuerpo entero) y pulsa B", frame)
|
|
escribir(f"Persona: {nombre}", frame)
|
|
|
|
cv2.imshow("Registro", frame)
|
|
tecla = cv2.waitKey(1) & 0xFF
|
|
|
|
if tecla == ord("q"):
|
|
cap.release()
|
|
cv2.destroyAllWindows()
|
|
print("Abortado por el usuario")
|
|
sys.exit(0)
|
|
|
|
if fase == "cara" and tecla == ord(" "):
|
|
emb, caja = capturar_cara(r, frame)
|
|
if emb is None:
|
|
print(" No se vio ninguna cara clara. Reintenta.")
|
|
continue
|
|
np.save(os.path.join(carpeta, "face.npy"), emb)
|
|
x, y, w, h = (int(v) for v in caja[:4])
|
|
cv2.imwrite(os.path.join(carpeta, "cara_ref.jpg"),
|
|
frame[max(0, y - 20):y + h + 20, max(0, x - 20):x + w + 20])
|
|
print(f" Cara de {nombre} registrada (score {caja[-1]:.2f})")
|
|
if os.path.exists(os.path.join(carpeta, "body.npy")):
|
|
print(f" {nombre} ya tenia cuerpo; registro completado.")
|
|
break
|
|
fase = "cuerpo"
|
|
|
|
elif fase == "cuerpo" and tecla == ord("b"):
|
|
emb, caja = capturar_cuerpo(r, frame)
|
|
if emb is None:
|
|
print(" No se detecto ninguna persona. Reintenta.")
|
|
continue
|
|
np.save(os.path.join(carpeta, "body.npy"), emb)
|
|
x, y, w, h = caja
|
|
cv2.imwrite(os.path.join(carpeta, "cuerpo_ref.jpg"),
|
|
frame[max(0, y):y + h, max(0, x):x + w])
|
|
print(f" Cuerpo de {nombre} registrado")
|
|
break
|
|
|
|
cap.release()
|
|
cv2.destroyAllWindows()
|
|
print("\nRegistro completado. Conocidos guardados:")
|
|
for n in nombres:
|
|
print(f" - {n} (face.npy + body.npy)")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|