2

I need to setup a Windows 10 PC with a Webcam to automatically play a video when it detects a person, ideally face detection or motion detection.

Are there any Windows apps available that do this or an application that will detect motion and allow me to send commands to another program like VLC or XBMC?

This is not for recording video or surveillance, this is just to play a video for each person that walks up to the PC.

5
  • Is motion detection good enough, or do you need facial recognition?
    – Daniel
    Commented Oct 22, 2015 at 22:30
  • Because honestly you don't need Win10 for this, just a RasPi
    – Daniel
    Commented Oct 22, 2015 at 22:31
  • @Daniel It's a 27" All-In-One Touchscreen with Windows 10 - what linux software were you going to recommend for the RasPi?
    – Tim B
    Commented Oct 23, 2015 at 1:23
  • 1
    @TimB see raspberrypi.org/blog/…
    – Daniel
    Commented Oct 23, 2015 at 3:50
  • You would just write a script to fire off the video for each face.
    – Daniel
    Commented Oct 23, 2015 at 3:50

1 Answer 1

1

You can use OpenCV2 and python together to do this sort of thing in about 100 lines of code as can be seen from the example of face detection or the sample file.

  • Free, Gratis & Open Source
  • Cross Platform - works on Windows, OS-X, Linux, Android, iOS, even Raspberry-Pi with a camera module.

The sample file which connects to the camera and displays a window with the view from the camera with the face and eyes marked when they are detected could easily be modified to play, or trigger the playing of, a specific video file when a face is detected, (you could even tweak it to only play when the face detection is over a given size). The sample file:

#!/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()

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.