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.datetime
ytime
: 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 mss
También necesitas dos archivos de modelo descargados:
deploy.prototxt
res10_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
monitor
segú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_TIMEOUT
si 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.
Deja un comentario