🎥 Detección de Personas en Video y Grabación Automática Usando Python y OpenCV
En este artículo explicaremos cómo crear un sistema de detección de personas que grabe automáticamente la pantalla solo cuando se detecta presencia humana. Este proyecto es útil si usas cámaras IP o software como V380 y deseas una forma eficiente de grabar únicamente cuando hay movimiento humano en una región específica del escritorio.
¿Qué hace este script?
- Captura un área definida de la pantalla (donde aparece el video de la cámara).
- Usa un modelo de inteligencia artificial para detectar personas.
- Comienza a grabar cuando detecta presencia humana.
- Detiene la grabación si no se ve nadie por un período definido.
- Guarda los videos automáticamente con marcas de tiempo.
Tecnologías y librerías usadas
OpenCV: procesamiento de imágenes y video.mss: captura rápida de pantalla.NumPy: procesamiento eficiente de matrices.datetimeytime: control de tiempo.- Modelo Caffe SSD preentrenado: para detección de rostros/personas.
Requisitos
Asegúrate de tener Python 3.8+ (funciona en 3.12) y las siguientes librerías instaladas:
pip install opencv-python numpy mssTambién necesitas dos archivos de modelo descargados:
deploy.prototxtres10_300x300_ssd_iter_140000.caffemodel
Se pueden obtener desde los repositorios oficiales de OpenCV o desde:
wget https://raw.githubusercontent.com/opencv/opencv/master/samples/dnn/face_detector/deploy.prototxt .
wget https://github.com/opencv/opencv_3rdparty/raw/dnn_samples_face_detector_20170830/res10_300x300_ssd_iter_140000_fp16.caffemodel -O res10_300x300.caffemodel
El código completo
import cv2
import numpy as np
import time
from mss import mss
from datetime import datetime
# === Configuraciones ===
monitor = {"top": 100, "left": 100, "width": 640, "height": 480}
prototxt = "deploy.prototxt"
model = "res10_300x300_ssd_iter_140000.caffemodel"
NO_PERSON_TIMEOUT = 5
net = cv2.dnn.readNetFromCaffe(prototxt, model)
sct = mss()
recording = False
video_writer = None
last_person_time = 0
def detect_person(frame):
blob = cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)), 1.0,
(300, 300), (104.0, 177.0, 123.0))
net.setInput(blob)
detections = net.forward()
for i in range(detections.shape[2]):
confidence = detections[0, 0, i, 2]
if confidence > 0.6:
return True
return False
def start_recording(filename, frame_size, fps=20):
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
return cv2.VideoWriter(filename, fourcc, fps, frame_size)
print(" Monitoreando... Presiona ESC para salir.")
while True:
frame = np.array(sct.grab(monitor))
frame = cv2.cvtColor(frame, cv2.COLOR_BGRA2BGR)
person_detected = detect_person(frame)
current_time = time.time()
if person_detected:
last_person_time = current_time
if not recording:
filename = datetime.now().strftime("grabacion_%Y%m%d_%H%M%S.mp4")
video_writer = start_recording(filename, (monitor["width"], monitor["height"]))
print(f" Persona detectada – grabando en: {filename}")
recording = True
else:
if recording and (current_time - last_person_time > NO_PERSON_TIMEOUT):
print(" No hay persona – deteniendo grabación.")
recording = False
video_writer.release()
video_writer = None
if recording and video_writer is not None:
video_writer.write(frame)
cv2.imshow("Vista", frame)
if cv2.waitKey(1) == 27: # ESC
break
# Limpieza
if video_writer:
video_writer.release()
cv2.destroyAllWindows()
Cómo ajustar a tu uso
- Cambia las coordenadas de
monitorsegún dónde esté la imagen de la cámara en tu pantalla. - Puedes modificar el umbral de confianza (
confidence > 0.6) si detecta demasiado o poco. - Cambia el tiempo
NO_PERSON_TIMEOUTsi quieres que espere más o menos antes de cortar la grabación.
Salidas
- Videos guardados en la misma carpeta, con nombre
grabacion_YYYYMMDD_HHMMSS.mp4. - No graba sonido (ideal para privacidad o rendimiento).
Requisitos mínimos de hardware
- CPU moderna (Intel i5 o Ryzen 5 en adelante recomendado).
- RAM: 4 GB mínimo (8+ recomendado).
- Sistema operativo: Linux o Windows.
- Sin GPU necesaria, ya que el modelo es liviano.

En caso de que falle el segundo archivo lo puedn descargar de aqui Verificación del Nonce falló.
ResponderEliminarhttps://github.com/sr6033/face-detection-with-OpenCV-and-DNN/blob/master/res10_300x300_ssd_iter_140000.caffemodel
Eliminar