02-ago: [proyecto] vigilancia - script test_alerta.py (presencia real -> Telegram IDD + anuncio Alexa) probado con INES
This commit is contained in:
80
vigilancia/test_alerta.py
Normal file
80
vigilancia/test_alerta.py
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
import cv2
|
||||||
|
|
||||||
|
sys.path.insert(0, r'C:\Users\juanm\Documents\GitHub\biblioteca_conocimiento_laboratorio\vigilancia')
|
||||||
|
import config
|
||||||
|
import reconocedor as rec
|
||||||
|
from camara import CamaraRTSP
|
||||||
|
from notificador import disparar_webhook_alexa, enviar_telegram
|
||||||
|
|
||||||
|
ALEXA_TEXTO = "Inés, ¿qué haces? No entres ahí."
|
||||||
|
NOMBRE_BUSCADO = "INES"
|
||||||
|
DURACION = 90
|
||||||
|
COOLDOWN = 30
|
||||||
|
|
||||||
|
r = rec.cargar_reconocedor()
|
||||||
|
print("Conocidos:", list(r.conocidos.keys()))
|
||||||
|
if NOMBRE_BUSCADO not in r.conocidos:
|
||||||
|
print(f"{NOMBRE_BUSCADO} no esta registrado")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
camaras = [CamaraRTSP(c["rtsp"], c["nombre"]) for c in config.CAMARAS]
|
||||||
|
os.makedirs(config.SNAPSHOT_DIR, exist_ok=True)
|
||||||
|
|
||||||
|
t0 = time.time()
|
||||||
|
ultima_alerta = 0.0
|
||||||
|
disparada = False
|
||||||
|
|
||||||
|
print(f"Esperando a que {NOMBRE_BUSCADO} pase delante de la camara "
|
||||||
|
f"({DURACION}s)...")
|
||||||
|
while time.time() - t0 < DURACION:
|
||||||
|
for cam in camaras:
|
||||||
|
frame = cam.leer_frame()
|
||||||
|
if frame is None:
|
||||||
|
continue
|
||||||
|
|
||||||
|
personas = r._detectar_personas(frame)
|
||||||
|
if not personas:
|
||||||
|
continue
|
||||||
|
|
||||||
|
for p in personas:
|
||||||
|
x, y, w, h = p
|
||||||
|
caras = r.detectar_caras(frame)
|
||||||
|
for c in caras:
|
||||||
|
cx, cy, cw, ch = (int(v) for v in c[:4])
|
||||||
|
if cx < x + w and cx + cw > x and cy < y + h and cy + ch > y:
|
||||||
|
emb = r.embedding_cara(frame, c)
|
||||||
|
nombre, score = r.identificar_cara(emb)
|
||||||
|
if nombre == NOMBRE_BUSCADO and score >= rec.UMBRAL_CARA:
|
||||||
|
ahora = time.time()
|
||||||
|
if ahora - ultima_alerta < COOLDOWN:
|
||||||
|
continue
|
||||||
|
ultima_alerta = ahora
|
||||||
|
disparada = True
|
||||||
|
|
||||||
|
ts = datetime.now().strftime("%Y%m%d_%H%M%S")
|
||||||
|
ruta = os.path.join(
|
||||||
|
config.SNAPSHOT_DIR,
|
||||||
|
f"alerta_{cam.nombre}_{ts}.jpg",
|
||||||
|
)
|
||||||
|
cv2.imwrite(ruta, frame)
|
||||||
|
|
||||||
|
texto = f"👧 Es {NOMBRE_BUSCADO} ({score:.2f}) - {cam.nombre} - {ts}"
|
||||||
|
print(f"[{cam.nombre}] IDENTIFICADA {NOMBRE_BUSCADO} "
|
||||||
|
f"score {score:.2f}")
|
||||||
|
print(f" -> Telegram: {texto}")
|
||||||
|
enviar_telegram(ruta, texto)
|
||||||
|
print(f" -> Alexa: {ALEXA_TEXTO}")
|
||||||
|
disparar_webhook_alexa(ALEXA_TEXTO)
|
||||||
|
print(" ALERTA ENVIADA")
|
||||||
|
break
|
||||||
|
time.sleep(0.15)
|
||||||
|
|
||||||
|
if not disparada:
|
||||||
|
print(f"NO se identifico a {NOMBRE_BUSCADO} en {DURACION}s")
|
||||||
|
else:
|
||||||
|
print(f"\nAlerta enviada: Telegram + Alexa.")
|
||||||
Reference in New Issue
Block a user