Ejecutar un comando al detectar rostros

Necesito configurar una PC con Windows 10 con una cámara web para reproducir automáticamente un video cuando detecta a una persona, idealmente detección de rostro o detección de movimiento.

¿Hay alguna aplicación de Windows disponible que haga esto o una aplicación que detecte movimiento y me permita enviar comandos a otro programa como VLC o XBMC?

Esto no es para grabar video o vigilancia, es solo para reproducir un video para cada persona que se acerca a la PC.

¿La detección de movimiento es lo suficientemente buena o necesita reconocimiento facial?
Porque honestamente no necesitas Win10 para esto, solo un RasPi
@Daniel Es una pantalla táctil todo en uno de 27" con Windows 10. ¿Qué software de Linux recomendaría para RasPi?
Simplemente escribiría un guión para disparar el video para cada cara.

Respuestas (1)

Puede usar OpenCV2 y python juntos para hacer este tipo de cosas en aproximadamente 100 líneas de código, como se puede ver en el ejemplo de detección de rostros o en el archivo de muestra.

  • Gratis, gratis y de código abierto
  • Multiplataforma: funciona en Windows, OS-X, Linux, Android, iOS e incluso Raspberry-Pi con un módulo de cámara.

El archivo de muestra que se conecta a la cámara y muestra una ventana con la vista de la cámara con la cara y los ojos marcados cuando se detectan podría modificarse fácilmente para reproducir o activar la reproducción de un archivo de video específico cuando se detecta una cara. , (incluso podría modificarlo para que solo se reproduzca cuando la detección de rostros supere un tamaño determinado) . El archivo de muestra:

#!/usr/bin/env python

import numpy as np
import cv2

# local modules
from video import create_capture
from common import clock, draw_str

help_message = '''
USAGE: facedetect.py [--cascade <cascade_fn>] [--nested-cascade <cascade_fn>] [<video_source>]
'''

def detect(img, cascade):
    rects = cascade.detectMultiScale(img, scaleFactor=1.3, minNeighbors=4, minSize=(30, 30), flags = cv2.CASCADE_SCALE_IMAGE)
    if len(rects) == 0:
        return []
    rects[:,2:] += rects[:,:2]
    return rects

def draw_rects(img, rects, color):
    for x1, y1, x2, y2 in rects:
        cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)

if __name__ == '__main__':
    import sys, getopt
    print help_message

    args, video_src = getopt.getopt(sys.argv[1:], '', ['cascade=', 'nested-cascade='])
    try:
        video_src = video_src[0]
    except:
        video_src = 0
    args = dict(args)
    cascade_fn = args.get('--cascade', "../../data/haarcascades/haarcascade_frontalface_alt.xml")
    nested_fn  = args.get('--nested-cascade', "../../data/haarcascades/haarcascade_eye.xml")

    cascade = cv2.CascadeClassifier(cascade_fn)
    nested = cv2.CascadeClassifier(nested_fn)

    cam = create_capture(video_src, fallback='synth:bg=../data/lena.jpg:noise=0.05')

    while True:
        ret, img = cam.read()
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        gray = cv2.equalizeHist(gray)

        t = clock()
        rects = detect(gray, cascade)
        vis = img.copy()
        draw_rects(vis, rects, (0, 255, 0))
        if not nested.empty():
            for x1, y1, x2, y2 in rects:
                roi = gray[y1:y2, x1:x2]
                vis_roi = vis[y1:y2, x1:x2]
                subrects = detect(roi.copy(), nested)
                draw_rects(vis_roi, subrects, (255, 0, 0))
        dt = clock() - t

        draw_str(vis, (20, 20), 'time: %.1f ms' % (dt*1000))
        cv2.imshow('facedetect', vis)

        if 0xFF & cv2.waitKey(5) == 27:
            break
    cv2.destroyAllWindows()