raspberry_pi_openCV_python

Proyecto vídeo vigilancia con Raspberry Pi y Python

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:

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()
  • Jose Antonio

    Pues… si esto es para torpes.. necesito la version para muuuuy torpes. No entiendo que hay que hacer con el codigo expuesto ni como hacer que algo funcione ni como confgurar nada. Gracias!