Cámara remota super simple con Raspberry Pi (modulo camara o camara NOIR)

Este tutorial intentará mostrar como montar un acceso remoto a la camara de nuestra raspberry de la manera mas sencilla posible segun la opinion del autor. Hacer que la cámara grabe imágenes y poder ver el contenido de manera remota puede alcanzarse de diferentes maneras, aquí presentaremos las más conocidas y explicaremos como realizar la más sencilla de todas.

camara-raspberry-pi

Las dos formas más populares para poner la cámara a grabar y poder después retransmitirlo por Internet se usan son las siguientes:

– Mediante el uso del software Motion.
– Haciendo uso de raspistill y mjpg-streamer.

En la primera opcíon, con Motion, la cámara grabará directamente sobre un fichero de vídeo y se proporcionará un acceso HTTP sobre un puerto determinado para ver el contenido desde cualquier navegador. Está opción es más costosa computacionalmente, sobre todo si usaís una webcam normal, ya que todo el trabajo se lo llevará la CPU y no será poco, algo que hay que evitar teniendo una GPU en nuestra raspberry pi.

En la segunda opción haremos uso de raspistill, el software oficial de la camara de raspberry y de la aplicacion mjpg-streamer. Raspistill es utilizado para capturar una imagen cada poco tiempo y grabarla sobre un mismo archivo de imágen, este proceso lo lleva directamente la GPU por lo que liberamos a la CPU de cualquier carga innecesaria. Por otro lado, ejecutaremos mjpg-streamer que usa dichas imagenes para ofrecer un streamer de video eficiente creando ademas un servidor web ligero sobre otro puerto para mostrar el contenido a través de HTTP.

Existe además un método más simple para montar un streamer de video con nuestra modulo de cámara, en el cual prescindimos del software mjpg-streamer, que aunque sea un componente eficiente y rápido, no deja de ser componente más que además crea un servidor web dedicado para su funcionamiento. Por lo tanto, esta tercera opción la considero más flexible si nuestro proyecto no se centra unicamente en crear una cama de video-vigilancia.

El quid de la cuestión es que nosotros en nuestro proyecto ya tenemos operativo un servidor web, ya sea apache o nodejs con express, para hacer otras cosas y lo ideal es aprovechar este componente para mostrar las imágenes de la cámara sin tener que tener más servidores web como sucede con mjpg-streamer o motion. Además el hecho de utilizar varios puertos para un fin, complicará las cosas si queremos abrir un acceso remoto a través de nuestro router.

Con esta tercera manera, solo utilizaremos el software raspistill y una pagina web con un codigo determinado que sera alojado en nuestro servidor web ya operativo. Si no tenemos un servidor web y queremos seguir este método, tendremos que instalar uno. Para el ejemplo, usaremos el servidor apache, aunque se puede hacer con nodejs y express sin problema.

Instalación de apache:

1
apt-get install apache2

Poner en funcionamiento la cámara

Para poner a la cámara a grabar, usaremos raspistill para que capture una imagen cada poco tiempo en una carpeta dentro de la carpeta publica del servidor web.

1
sudo raspistill -w 640 -h 480 -q 5 -o /var/www/pic.jpg -tl 100 -t 9999999 -th 0:0:0 -n & /dev/null 2>&1&

El parametro más importante es -o, que indica donde guardará la cámara la imágen. Debemos poner una localización dentro la carpeta pública de nuestro servidor, en el ejemplo, ponemos “/var/www”, que es la carpeta pública de apache por defecto.

El resto de parametos indican la resolución de la imagen (-w, -h), la calidad sobre 100 (-q), cada cuanto la cámara renovará la imágen en milisegundos (-tl) y el tiempo que la cámara grabará, tiempo infinito en este caso usando 9999999 (-t). Más información sobre parámetros aquí.

Creando la página para transmitir la imágenes en un navegador web

Suponiendo que IP de la raspberry en vuestra red local es la 192.168.0.160. Si accedemos a la siguiente dirección “http://192.168.0.160/pic.jpg” en un navegador dentro de nuestra red local, veremos una captura fija de la cámara. La idea para montar el stream es hacer que esa imágen se recargue automaticamente cada cierto creando el efecto de video remoto. Para ello haremos uso de una página en HTML con código javascript.

Para ello crearemos un archivo html llamado “camara.html” en la carpeta pública de apache.

1
/var/www/index.html

Y escribiremos el siguiente código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    <html>
    <head>
        <title>MI CAMARA</title>
        <!-- Usamos JQUERY -->
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
        <script>
        $(document).ready(function(){
            var images = '/image_*.png';
            var i = 1;
            setInterval(function() {
                var path = images.replace('*', i);
                $('#cam').attr('src', '/pic.jpg?n=' + i);
                i = i + 1;
                if (i == 100) i = 1;
            }, 1000);
        });
        </script>
    </head>
    <body>
    <h1>WELCOME</h1>
    <img id="cam" src="/images/pic.jpg" alt="" />
    </body>
    </html>

El código javascript utilizado simplemente refresca la imágen cada 1000 milisegundos. Cuanto menor sea el valor, más veces tendrá que cargar la imágen por segundo y por lo tanto, más ancho de banda se consumirá.

Ahora accedemos al navegador de nuestro ordenador e introducimos la dirección “http://192.168.0.160/index.html”, a continuación veremos una retransmisión razonable de lo que graba nuestra cámara. Si queremos minimizar el ancho de banda, podemos jugar con la tasa de refresco, usando 1000 milisegundos por ejemplo.

Fin

En este punto ya tenemos un streaming de video basico, flexible y compatible con cualquier navegador web. Ya solo nos falta abrir un puerto de nuestro router y redigirlo a la IP de nuestra raspberry con el puerto del servidor web (puerto 80 u 8080).

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>