Actualización: Recomiendo que miréis el artículo motionEyeOS vigilando con la Raspberry Pi
Después del anterior Proyecto vídeo vigilancia con Raspberry Pi y Motion os traigo una nueva versión más simple y que hace uso solo de python
Para el hardware necesitaréis:
Para ello se dispuso de:
- Raspberry Pi 100437 - Tarjeta de Puerto USB (7000 MHz, 512 MB de RAM, 4 x USB) o Raspberry Pi RBCA000 Model B - Placa base (ARM 1176JZF-S, 512 MB de RAM, HDMI, 2 x USB 2.0, 3,5 W)
y sus correspondientes complementos: cargador, SD o micro SD y cable de red o adaptador Wi-Fi - Logitech C170 - Webcam, color negro
Para el software:
El tratamiento de imagen que tiene es:
- Extracción de fondo: la primera imagen obtiene lo que es el fondo para el programa, cada vez que se produce un cambio, al comparar los frames fondo y actual, lo detecta, de forma que guarda las imágenes correspondientes.
- Filtro gausiano, para suavizar y eliminar al máximo el ruido, es bastante potente. Como solo nos interesan cambios funciona bien, además la imagen que guardamos es la que no tiene ningún tratamiento, en bruto.
- Esto tiene un solo inconveniente, está puesto en el README del github del autor, y es que cuando se producen cambios de luz los detecta como una intrusión. Podría usarse para colocarla en una habitación donde no haya cambios de luz o tenga que estar siempre a oscuras, si alguien entra lo detectará.
Se podría mejorar con algún sensor de luz de manera que cuando haya cambios de luminosidad elevados actualice el fondo para comparar al nuevo más iluminado, o en caso contrario, menos iluminado. De todas formas, en el uso real que se le está dando lleva asociado un detector de movimiento, de forma que si detecta que la puerta se abre, permite que las imágenes se guarden, esto también se explica más o menos en el README.
Todo el código lo tenéis disponible en el GitHub de su autor: https://github.com/j0sete/motion-sensor
Os pongo aquí la versión inicial, pero recordad que puede haber nuevas versiones en el GitHub:
#!/usr/bin/python
import numpy as np
import cv2
import cv
import time
def comprobarFichero():
existe = False
archivo = "//path/a/algun/fichero"
try:
fichero = open(archivo)
fichero.close()
existe = True
except:
existe = False
return existe
tamanoMax = 400
movimiento = False
cam = cv2.VideoCapture(0)
for x in xrange(1,100):
ret, frame = cam.read()
fgbg = cv2.BackgroundSubtractorMOG()
while True:
ret, frame = cam.read()
if ret == True:
frame = cv2.resize(frame, (tamanoMax,tamanoMax))
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray = cv2.bilateralFilter(gray, 11, 17, 17)
blur = cv2.blur(gray,(10,10))
fgmask = fgbg.apply(blur) # Aplicamos la mascara
columnas = cv2.reduce(fgmask,0,cv.CV_REDUCE_MAX)
filas = cv2.reduce(fgmask,1,cv.CV_REDUCE_MAX)
for x in xrange(1, len(columnas[0])):
if columnas[0][x] > 0:
movimiento = True
break
if movimiento == False:
for x in xrange(1, len(filas)):
if filas[x,0] > 0:
movimiento = True
break
if movimiento == True and comprobarFichero():
nombre = time.strftime("%y%m%d-%H:%M:%S")+".jpg"
path="/path/donde/guardar/imagenes/"+nombre
cv2.imwrite(path,frame)
movimiento = False
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()