Archivo para 'motion'

Videocámara de seguridad motorizada

... aglutinando superpoderes

Hola de nuevo!. Como ya adelantaba en el post anterior, voy a explicar como instalar Motion para que además de hacer de cámara de seguridad, la mueva persiguiendo al evento de alarma. Previamente necesitamos:
- Raspicam
- Streaming desde la Raspicam
- Mutt
- Pi-blaster
- 2 Servos
- Brazo pan-tilt (puede ser suprimido con un poco de talento).

Lo primero aclarar, que esto es más una idea, que un proyecto completo. Funcionar funciona, pero cierto es que puede mejorarse. Lo ideal sería usar OpenCV, pero resulta que no tengo ni idea, lo he intentado pero no he conseguido nada aceptable. Si buscáis en youtube veréis gente que lo ha conseguido, pero sigo sus tutoriales y no funcionan.
Empecemos, antes de nada insisto:
- Raspicam funcionando (o una cámara con mjpeg encoding compatible).
- Mjpg-stgreamer en funcionamiento.
- 2 Servos y pi-blaster.
- Mutt para el envío de las alertas por mail.
- Tener al gatete controlado.

Arranque de la captura y el streaming

Antes de instalar, vamos a dejar la camera board en marcha:
sesion=$(date +%s)
mkdir /tmp/$sesion/
screen -dmS raspistil raspistill -w 640 -h 480 -q 10 -o /tmp/$sesion/pic.jpg -tl 100 -t 9999999 -th 0:0:0
screen -dmS streamer /usr/src/mjpg-streamer/mjpg-streamer/mjpg_streamer -i "/usr/src/mjpg-streamer/mjpg-streamer/input_file.so -f /tmp/$sesion/" -o "/usr/src/mjpg-streamer/mjpg-streamer/output_http.so -w /usr/src/mjpg-streamer/mjpg-streamer/www/"

Instalación de motion

Motion es el programa que nos permite generar alarmas y configurar las cámaras que tendrá nuestro sistema de seguridad. Para instalarlo no puede ser más fácil:
apt-get update
apt-get install motion
Configuraciones de Motion hay millones, os cuento la que me ha funcionado. Le hacemos una copia de seguridad al archivo /etc/motion/motion.conf y lo dejamos así:
daemon off
process_id_file /var/run/motion/motion.pid
setup_mode off
v4l2_palette 8
input 8
norm 0
frequency 0
rotate 0
width 640
height 480
framerate 10
minimum_frame_time 0
netcam_url value http://127.0.0.1:8080/?action=stream
netcam_tolerant_check off
auto_brightness off
brightness 0
contrast 0
saturation 0
hue 0
roundrobin_frames 1
roundrobin_skip 1
switchfilter off
threshold 1500
threshold_tune off
noise_level 32
noise_tune on
despeckle EedDl
smart_mask_speed 0
lightswitch 0
minimum_motion_frames 1
pre_capture 0
post_capture 0
gap 1
max_mpeg_time 0
output_all off
output_normal on
output_motion off
quality 90
ppm off
ffmpeg_cap_new off
ffmpeg_cap_motion off
ffmpeg_timelapse 0
ffmpeg_timelapse_mode daily
ffmpeg_bps 500000
ffmpeg_variable_bitrate 0
ffmpeg_deinterlace off
snapshot_interval 0
locate off
text_right %Y-%m-%d\n%T-%q
text_changes off
text_event %Y%m%d%H%M%S
text_double off
target_dir /tmp/motion
snapshot_filename %v-%Y%m%d%H%M%S-snapshot
jpeg_filename %v-%Y%m%d%H%M%S-%q
movie_filename %v-%Y%m%d%H%M%S
timelapse_filename %Y%m%d-timelapse
webcam_port 0
webcam_quality 50
webcam_motion off
webcam_maxrate 1
webcam_localhost on
webcam_limit 0
control_port 0
control_localhost on
control_html_output on
track_type 0
track_auto off
track_motorx 0
track_motory 0
track_maxx 0
track_maxy 0
track_iomojo_id 0
track_step_angle_x 10
track_step_angle_y 10
track_move_wait 10
track_speed 255
track_stepsize 40
quiet on
on_event_end /bin/bash /usr/local/bin/torreta.sh centro
on_picture_save /bin/bash /usr/local/bin/camara.sh aviso %f
on_motion_detected /bin/bash /usr/local/bin/camara.sh mover %i %J %K %L
sql_log_image on
sql_log_snapshot on
sql_log_mpeg off
sql_log_timelapse off
sql_query insert into security(camera, filename, frame, file_type, time_stamp, event_time_stamp) values('%t', '%f', '%q', '%n', '%Y-%m-%d %T', '%C')
Son casi todas las opciones por defecto, con unos pocos cambios. Fíjate bien, no te dejes ninguno. Presta especial atención a los scripts de los eventos, ya que son estos los que nos enviarán el email y moverán la cámara.

Control de servos

Como te habrás imaginado, Motion tiene sus propias configuraciones para mover las cámaras de seguridad, pero claro, sólo para modelos compatibles, no para modelos "yo me lo guiso, yo me lo como". En la configuración de Motion, usamos el script /usr/local/bin/torreta.sh es este:
#!/bin/bash
# programado por Juanmol para http://rsppi.blogpost.com
servo_horizontal=1
servo_pan=1
servo_vertical=0
servo_tilt=0
estado_pan=/tmp/estado_pan.log
estado_tilt=/tmp/estado_tilt.log
min=0.045
max=0.25
med=0$(echo 'scale=3;('$min'+'$max')/2'|bc)
salto=0.01
dev=/dev/pi-blaster

if [ -e /tmp/estado_pan.log ];
then
pan=$(cat $estado_pan);
tilt=$(cat $estado_tilt);
case $1 in
izquierda)
if (( $(echo "$pan < 0.257" | bc -l) ));
then
pan=0$(echo 'scale=3;'$pan'+'$salto''|bc);
echo $pan > $estado_pan;
fi
;;
derecha)
if (( $(echo "$pan > 0.047" | bc -l) ));
then
pan=0$(echo 'scale=3;'$pan'-'$salto''|bc);
echo $pan > $estado_pan;
fi
;;
arriba)
if (( $(echo "$tilt > 0.067" | bc -l) ));
then
tilt=0$(echo 'scale=3;'$tilt'-'$salto''|bc);
echo $tilt > $estado_tilt;
fi
;;
abajo)
if (( $(echo "$tilt < 0.217" | bc -l) ));
then
tilt=0$(echo 'scale=3;'$tilt'+'$salto''|bc);
echo $tilt > $estado_tilt;
fi
;;
centro)
pan=$med
tilt=$med
echo $tilt > $estado_tilt
echo $pan > $estado_pan
;;
esac
else
echo $med > $estado_tilt;
echo $med > $estado_pan;
fi

#mover
pan=$(cat $estado_pan)
tilt=$(cat $estado_tilt)
echo $servo_pan=$pan > $dev
echo $servo_tilt=$tilt > $dev
Podemos usarlo así:
./torreta.sh arriba
./torreta.sh derecha
./torreta.sh izquierda
./torreta.sh abajo
./torreta.sh centro
Insisto que estas configuraciones son para mis servos, que son perrísimos, tendrás que comprobar cuales son los máximos y mínimos de los tuyos (son 30 segundos, no te asustes).

Control de alarmas

Motion es un poco tosco a la hora de generar los eventos, no permite hacer ajustes muy finos, pero si que devuelve mucha información. En la configuración de Motion llamamos al script /usr/local/bin/camara.sh que es este:
#!/bin/bash
# programado por Juanmol para http://rsppi.blogpost.com
echo se recibe $@ >> /tmp/prueba.log
area=$(echo $2*$3 | bc)
areamax=200000
ancho=640
alto=480
moversh=/usr/local/bin/torreta.sh
destinomail=EMAIL_DESTINO@gmail.com

case $1 in
mover)
if [ "$area" -lt "$areamax" ];
then
if [ "$4" -lt "$(echo $ancho/2 | bc)" ];
then
$moversh izquierda &
else
$moversh derecha &
fi

if [ "$5" -lt "$(echo $alto/2 | bc)" ];
then
$moversh arriba &
else
$moversh abajo &
fi
fi
;;
aviso)
if [ "$area" -lt "$areamax" ];
then
echo "$(date)" | mutt -s "Alarma detectada" $destinomail -a $2
fi
;;
esac
¡¡OJO!! esos valores son para trabajar con la camera board con resolución 640x480, si quieres usar 1080p tendrás que reajustar un poco.
La idea del script es descartar aquellos eventos en los que la cantidad de píxeles que han provocado la alarma sea muy grande. Esto tiene sentido cuando tenemos la cámara en interior y hay cambios en la iluminación. Además ten en cuenta que cuando la cámara se mueve, la imagen que captura es 100% distinta, por lo que tampoco nos interesa que nos genere una alarma por eso.

Resultado

Por si no te queda claro para que es todo esto, te pongo un vídeo (lo siento de nuevo por la calidad):

Tendrás mucho mejor resultado si cámara está en el techo o al menos a altura humana. Y por supuesto a cierta distancia de la posible alarma.
Finalmente puedes hacer un script que lo ejecute todo /usr/local/bin/seguridad.sh
#!/bin/bash
# programado por Juanmol para http://rsppi.blogspot.com
sesion=$(date +%s)
mkdir /tmp/$sesion/
screen -dmS raspistil raspistill -w 640 -h 480 -q 10 -o /tmp/$sesion/pic.jpg -tl 100 -t 9999999 -th 0:0:0
screen -dmS streamer /usr/src/mjpg-streamer/mjpg-streamer/mjpg_streamer -i "/usr/src/mjpg-streamer/mjpg-streamer/input_file.so -f /tmp/$sesion/" -o "/usr/src/mjpg-streamer/mjpg-streamer/output_http.so -w /usr/src/mjpg-streamer/mjpg-streamer/www/"
screen -dmS motion motion

Bonus: ¡¡cuidado con el gatete!!

Cuando los servos se mueven, hacen ruido ... un poco. Cabe la posibilidad de que a tu gato le llame la atención el ruido ...
... puede que el gatete sea un poco curioso ...
... puede que se aburra ...
... puede incluso que sea un gato ninja! ...
... el mio además de curioso y ninja ... no le gusta la cámara ...
... y no paró hasta que la tiró al suelo ...

Videocámara de seguridad motorizada

... aglutinando superpoderes

Hola de nuevo!. Como ya adelantaba en el post anterior, voy a explicar como instalar Motion para que además de hacer de cámara de seguridad, la mueva persiguiendo al evento de alarma. Previamente necesitamos:
- Raspicam
- Streaming desde la Raspicam
- Mutt
- Pi-blaster
- 2 Servos
- Brazo pan-tilt (puede ser suprimido con un poco de talento).

Lo primero aclarar, que esto es más una idea, que un proyecto completo. Funcionar funciona, pero cierto es que puede mejorarse. Lo ideal sería usar OpenCV, pero resulta que no tengo ni idea, lo he intentado pero no he conseguido nada aceptable. Si buscáis en youtube veréis gente que lo ha conseguido, pero sigo sus tutoriales y no funcionan.
Empecemos, antes de nada insisto:
- Raspicam funcionando (o una cámara con mjpeg encoding compatible).
- Mjpg-stgreamer en funcionamiento.
- 2 Servos y pi-blaster.
- Mutt para el envío de las alertas por mail.
- Tener al gatete controlado.

Arranque de la captura y el streaming

Antes de instalar, vamos a dejar la camera board en marcha:
sesion=$(date +%s)
mkdir /tmp/$sesion/
screen -dmS raspistil raspistill -w 640 -h 480 -q 10 -o /tmp/$sesion/pic.jpg -tl 100 -t 9999999 -th 0:0:0
screen -dmS streamer /usr/src/mjpg-streamer/mjpg-streamer/mjpg_streamer -i "/usr/src/mjpg-streamer/mjpg-streamer/input_file.so -f /tmp/$sesion/" -o "/usr/src/mjpg-streamer/mjpg-streamer/output_http.so -w /usr/src/mjpg-streamer/mjpg-streamer/www/"

Instalación de motion

Motion es el programa que nos permite generar alarmas y configurar las cámaras que tendrá nuestro sistema de seguridad. Para instalarlo no puede ser más fácil:
apt-get update
apt-get install motion
Configuraciones de Motion hay millones, os cuento la que me ha funcionado. Le hacemos una copia de seguridad al archivo /etc/motion/motion.conf y lo dejamos así:
daemon off
process_id_file /var/run/motion/motion.pid
setup_mode off
v4l2_palette 8
input 8
norm 0
frequency 0
rotate 0
width 640
height 480
framerate 10
minimum_frame_time 0
netcam_url value http://127.0.0.1:8080/?action=stream
netcam_tolerant_check off
auto_brightness off
brightness 0
contrast 0
saturation 0
hue 0
roundrobin_frames 1
roundrobin_skip 1
switchfilter off
threshold 1500
threshold_tune off
noise_level 32
noise_tune on
despeckle EedDl
smart_mask_speed 0
lightswitch 0
minimum_motion_frames 1
pre_capture 0
post_capture 0
gap 1
max_mpeg_time 0
output_all off
output_normal on
output_motion off
quality 90
ppm off
ffmpeg_cap_new off
ffmpeg_cap_motion off
ffmpeg_timelapse 0
ffmpeg_timelapse_mode daily
ffmpeg_bps 500000
ffmpeg_variable_bitrate 0
ffmpeg_deinterlace off
snapshot_interval 0
locate off
text_right %Y-%m-%d\n%T-%q
text_changes off
text_event %Y%m%d%H%M%S
text_double off
target_dir /tmp/motion
snapshot_filename %v-%Y%m%d%H%M%S-snapshot
jpeg_filename %v-%Y%m%d%H%M%S-%q
movie_filename %v-%Y%m%d%H%M%S
timelapse_filename %Y%m%d-timelapse
webcam_port 0
webcam_quality 50
webcam_motion off
webcam_maxrate 1
webcam_localhost on
webcam_limit 0
control_port 0
control_localhost on
control_html_output on
track_type 0
track_auto off
track_motorx 0
track_motory 0
track_maxx 0
track_maxy 0
track_iomojo_id 0
track_step_angle_x 10
track_step_angle_y 10
track_move_wait 10
track_speed 255
track_stepsize 40
quiet on
on_event_end /bin/bash /usr/local/bin/torreta.sh centro
on_picture_save /bin/bash /usr/local/bin/camara.sh aviso %f
on_motion_detected /bin/bash /usr/local/bin/camara.sh mover %i %J %K %L
sql_log_image on
sql_log_snapshot on
sql_log_mpeg off
sql_log_timelapse off
sql_query insert into security(camera, filename, frame, file_type, time_stamp, event_time_stamp) values('%t', '%f', '%q', '%n', '%Y-%m-%d %T', '%C')
Son casi todas las opciones por defecto, con unos pocos cambios. Fíjate bien, no te dejes ninguno. Presta especial atención a los scripts de los eventos, ya que son estos los que nos enviarán el email y moverán la cámara.

Control de servos

Como te habrás imaginado, Motion tiene sus propias configuraciones para mover las cámaras de seguridad, pero claro, sólo para modelos compatibles, no para modelos "yo me lo guiso, yo me lo como". En la configuración de Motion, usamos el script /usr/local/bin/torreta.sh es este:
#!/bin/bash
# programado por Juanmol para http://rsppi.blogpost.com
servo_horizontal=1
servo_pan=1
servo_vertical=0
servo_tilt=0
estado_pan=/tmp/estado_pan.log
estado_tilt=/tmp/estado_tilt.log
min=0.045
max=0.25
med=0$(echo 'scale=3;('$min'+'$max')/2'|bc)
salto=0.01
dev=/dev/pi-blaster

if [ -e /tmp/estado_pan.log ];
then
pan=$(cat $estado_pan);
tilt=$(cat $estado_tilt);
case $1 in
izquierda)
if (( $(echo "$pan < 0.257" | bc -l) ));
then
pan=0$(echo 'scale=3;'$pan'+'$salto''|bc);
echo $pan > $estado_pan;
fi
;;
derecha)
if (( $(echo "$pan > 0.047" | bc -l) ));
then
pan=0$(echo 'scale=3;'$pan'-'$salto''|bc);
echo $pan > $estado_pan;
fi
;;
arriba)
if (( $(echo "$tilt > 0.067" | bc -l) ));
then
tilt=0$(echo 'scale=3;'$tilt'-'$salto''|bc);
echo $tilt > $estado_tilt;
fi
;;
abajo)
if (( $(echo "$tilt < 0.217" | bc -l) ));
then
tilt=0$(echo 'scale=3;'$tilt'+'$salto''|bc);
echo $tilt > $estado_tilt;
fi
;;
centro)
pan=$med
tilt=$med
echo $tilt > $estado_tilt
echo $pan > $estado_pan
;;
esac
else
echo $med > $estado_tilt;
echo $med > $estado_pan;
fi

#mover
pan=$(cat $estado_pan)
tilt=$(cat $estado_tilt)
echo $servo_pan=$pan > $dev
echo $servo_tilt=$tilt > $dev
Podemos usarlo así:
./torreta.sh arriba
./torreta.sh derecha
./torreta.sh izquierda
./torreta.sh abajo
./torreta.sh centro
Insisto que estas configuraciones son para mis servos, que son perrísimos, tendrás que comprobar cuales son los máximos y mínimos de los tuyos (son 30 segundos, no te asustes).

Control de alarmas

Motion es un poco tosco a la hora de generar los eventos, no permite hacer ajustes muy finos, pero si que devuelve mucha información. En la configuración de Motion llamamos al script /usr/local/bin/camara.sh que es este:
#!/bin/bash
# programado por Juanmol para http://rsppi.blogpost.com
echo se recibe $@ >> /tmp/prueba.log
area=$(echo $2*$3 | bc)
areamax=200000
ancho=640
alto=480
moversh=/usr/local/bin/torreta.sh
destinomail=EMAIL_DESTINO@gmail.com

case $1 in
mover)
if [ "$area" -lt "$areamax" ];
then
if [ "$4" -lt "$(echo $ancho/2 | bc)" ];
then
$moversh izquierda &
else
$moversh derecha &
fi

if [ "$5" -lt "$(echo $alto/2 | bc)" ];
then
$moversh arriba &
else
$moversh abajo &
fi
fi
;;
aviso)
if [ "$area" -lt "$areamax" ];
then
echo "$(date)" | mutt -s "Alarma detectada" $destinomail -a $2
fi
;;
esac
¡¡OJO!! esos valores son para trabajar con la camera board con resolución 640x480, si quieres usar 1080p tendrás que reajustar un poco.
La idea del script es descartar aquellos eventos en los que la cantidad de píxeles que han provocado la alarma sea muy grande. Esto tiene sentido cuando tenemos la cámara en interior y hay cambios en la iluminación. Además ten en cuenta que cuando la cámara se mueve, la imagen que captura es 100% distinta, por lo que tampoco nos interesa que nos genere una alarma por eso.

Resultado

Por si no te queda claro para que es todo esto, te pongo un vídeo (lo siento de nuevo por la calidad):

Tendrás mucho mejor resultado si cámara está en el techo o al menos a altura humana. Y por supuesto a cierta distancia de la posible alarma.
Finalmente puedes hacer un script que lo ejecute todo /usr/local/bin/seguridad.sh
#!/bin/bash
# programado por Juanmol para http://rsppi.blogspot.com
sesion=$(date +%s)
mkdir /tmp/$sesion/
screen -dmS raspistil raspistill -w 640 -h 480 -q 10 -o /tmp/$sesion/pic.jpg -tl 100 -t 9999999 -th 0:0:0
screen -dmS streamer /usr/src/mjpg-streamer/mjpg-streamer/mjpg_streamer -i "/usr/src/mjpg-streamer/mjpg-streamer/input_file.so -f /tmp/$sesion/" -o "/usr/src/mjpg-streamer/mjpg-streamer/output_http.so -w /usr/src/mjpg-streamer/mjpg-streamer/www/"
screen -dmS motion motion

Bonus: ¡¡cuidado con el gatete!!

Cuando los servos se mueven, hacen ruido ... un poco. Cabe la posibilidad de que a tu gato le llame la atención el ruido ...
... puede que el gatete sea un poco curioso ...
... puede que se aburra ...
... puede incluso que sea un gato ninja! ...
... el mio además de curioso y ninja ... no le gusta la cámara ...
... y no paró hasta que la tiró al suelo ...

Streaming de video desde RaspberryPi (parte 3)

... probando 'motion' ...

Bueno, aquí seguimos. Me está empezando a mosquear este tema y en mi mente tengo 3 proyectos que usan esto, así que tengo que ponerlo en marcha sí o sí. Ahora voy a probar con 'motion'. Es el típico software de cámaras de seguridad de Linux, lleva años y años en los repositorios. Herramientas más complejas de videovigilancia, como Zoneminder, lo usan para hacer la captura básica. No quiero adelantarme a las pruebas, me temo que voy a tener el mismo resultado que en la parte 1. Al lío.

La instalación de 'motion' no puede ser más fácil:
apt-get update
apt-get install motion
ahora lo podemos poner en marcha ejecutando:
motion
o bien como demonio:
/etc/init.d/motion start
Primero diré que hay miles de configuraciones posibles, sólo hay que buscar un poco para darnos cuenta de cuantas cosas podemos hacer con 'motion', pero no nos sirve como streamind desde el RaspberryPi. El resultado lo vemos en http://ip_del_raspberrypi:8081
Como me temía el resultado es el mismo que en la parte 1, así que dejaremos 'motion' para lo que se inventó. En otro momento retomaré este programa.
Estoy perdiendo la esperanza de encontrar algo decente :'(