Revista 100% Verde

Cámara trasera inteligente con Raspberry Pi. Parte 2

Por Soloelectronicos @soloelectronico

Gracias a una Raspberry Pi por medio del procesamiento de imágenes en efecto podemos hacer más inteligente nuestro vehículo y añadir nuevas funcionalidades, pero para ello necesitaremos los siguientes componentes:

Conexión del módulo de cámara

El modulo de cámara de Pi tiene un mayor rendimiento que una cámara USB por lo que lo ideal es usar una cámara del tipo compatibles con Raspberry Pi (se puede comprar por unos 15€ en Amazon)

No es problema la distancia pues con un cable plano de 200 cm suele ser suficiente para llevar la cámara hasta la posición de conducción ( puede comprarlo aqui en Amazon por unos 7,29€ )

Se puede pues llevar el cable plano al l frente del coche y luego conectado a una pantalla de táctil de 7″ de modo que la Pi y la pantalla táctil pueden ser alimentados por el adaptador USB en el coche.

Estos son los pasos para instalar la cámara especifica para su uso , con la Raspberry Pi

    • Localice el puerto de la cámara y conecte la cámara:
      Cámara trasera inteligente con Raspberry Pi. Parte 2
    • Poner en marcha la Raspberry Pi
    • Abra la Herramienta de configuración de frambuesa Pi desde el menú principal:
      Cámara trasera inteligente con Raspberry Pi. Parte 2
    • Asegúrese de que está activado el software de la cámara:
      Cámara trasera inteligente con Raspberry Pi. Parte 2
    • Si no está activado, habilítelo y reinicie su Pi para comenzar. Asimismo si va utilizar una pantalla táctil también necesitara activar I2C y SPI

Es decir resumidamente; con la Raspberry Pi apagada, debe conectar el módulo de la cámara al puerto de la cámara de la Raspberry Pi,ahora encienda el Pi y asegúrese de que se activa el software.

Cámara trasera inteligente con Raspberry Pi. Parte 2

Añadiendo reconocimiento de imágenes

En un post anterior vimos como podemos superponer un imagen escalada a nuestro hw que nos determinara con bastante aproximación si vamos a encontrar obstáculos a la hora de introducir la marcha atrás ..¿pero se puede mejorar ?

Pues en efecto se puede ,pues p odemos usar OpenCV con python lo cual permitirá analizar lo que está en la imagen y definir los parámetros para lo que se encuentre.

La idea sería tomar las imágenes y establecer un límite en la parte inferior (cerca del parachoques) para la "z ona de alarma": justo entonces al detectar cualquier objeto grande en la iamgen capturada , si la mayor parte del área de los objetos de la parte inferior entra en la "zona de alarma", entonces debería enviar un mensaje de alerta.

Una de las desventajas de la instalación de OpenCV es que usted no tiene ningún control sobre la compilación en sí, ya que los archivos binarios están creados previamente para usted, lo que, aunque es bueno, también significa que no puede incluir optimizaciones adicionales.

Para la Raspberry Pi, estamos de suerte pues Dave Jones (creador del módulo Python picamera ) y Ben Nuttall de la piwheels.org , administran para la comunidad Raspberry Pi, un repositorio de paquetes Python que proporciona wheels ARM (es decir, paquetes de binarios precompilados) para la Raspberry Pi.

Al usar PiWheels, podemoss instalar OpenCV en cuestión de segundos, y(lo mismo se aplica a otras bibliotecas de Python que pueden tardar mucho tiempo en compilarse, incluidos NumPy, SciPy, scikit-learn, etc).

Si está utilizando Raspbian Stretch, le complacerá saber que el comando pip comprobará PiWheels en busca de un binario precompilado antes de que compruebe PyPI, permitiendo que su Pi guarde un montón de ciclos de CPU (y usted un montón de tiempor) ! Si termina usando pip para instalar OpenCV en su Raspberry Pi, puedes estar seguro de que estás usando la versión optimizada.

Comencemos aprendiendo cómo instalar OpenCV en nuestra Raspberry Pi.

Instale los requisitos previos en su Raspberry Pi

La Raspberry Pi requiere que instale algunos paquetes de sistema antes de comenzar:

$ sudo apt - get install libhdf5 - dev libhdf5 - serial - dev $ sudo apt - get install libqtwebkit4 libqt4 - test Instalar pip en su Raspberry Pi

El administrador de paquetes de Python, "pip", se puede obtener a través de wget:

$ wget https : / / bootstrap .pypa .io / get - pip .py $ sudo python3 get - pip .py

Instalar OpenCv

No se recomendaría esta opción si desea poder utilizar diferentes versiones de OpenCV en entornos aislados. . Pero muchas personas implementan su Raspberry Pis con un solo propósito / proyecto y no necesitan entornos virtuales. Dicho esto, es bastante complicado limpiarlo si cambia de opinión más tarde y quiere usar entornos virtuales, por lo que se recomienda que omita esta opción y sigas la Opción B.

Para instalar OpenCV en su sistema Raspberry Pi, asegúrese de usar sudo como este:

$ sudo pip install opencv - contrib - python

En cuestión de segundos, OpenCV está listo para entrar en los paquetes de sitio de Raspberry Pi junto con cualquier otro paquete que tenga instalado.

Antes de comenzar con el código, tenemos que instalar OpenCV en el Pi primero. Por suerte se puede hacer de forma muy sencilla . Para ello abrir la consola del sistema y ejecutar pip3 install opencv-python

Esto tardara unos minutos y la salida debería dar algo similar a esto:

[email protected]:~ $ pip3 install opencv-python
Collecting opencv-python
Downloading https://www.piwheels.org/simple/opencv-python/opencv_python-3.4.3.18-cp35-cp35m-linux_armv7l.whl (7.6MB)
100% |████████████████████████████████| 7.6MB 38kB/s
Collecting numpy>=1.12.1 (from opencv-python)
Downloading https://files.pythonhosted.org/packages/83/6b/d03277eacf113697675cd659086a4dcf9472108e2f1a83884c0271bdca46/numpy-1.15.3.zip (4.5MB)
100% |████████████████████████████████| 4.5MB 62kB/s
Building wheels for collected packages: numpy
Running setup.py bdist_wheel for numpy ... done
Stored in directory: /home/pi/.cache/pip/wheels/2c/e4/e7/1942c96c02074ab004084d3501ae056b9beffac38749658102
Successfully built numpy
Installing collected packages: numpy, opencv-python
Successfully installed numpy-1.15.3 opencv-python-3.4.3.18
[email protected]:~ $

En los tutoriales de instalación de OpenCV se recomienda compilar desde la fuente; sin embargo, en el último año ha sido posible instalar OpenCV a través de pip, el propio administrador de paquetes de Python. Si bien la instalación desde la fuente le dará el mayor control sobre su configuración de OpenCV, también es la más difícil y la que más tiempo consume. Si está buscando la manera más rápida posible de instalar OpenCV en su sistema, querrá usar pip para instalar OpenCV, pero hay algunas cosas que pueden hacer que se tropiece en el camino, así que asegúrese de leer el resto de este post.

Script en Python

Una vez OpenCV está instalado, podemos crear un nuevo archivo de Python y empezar en el código.

En las lineas siguientes podemos ver el código completamente documentado, que se puede visitar el repositorio de github de gigafide.

import time import cv2 import numpy as np from picamera.array import PiRGBArray from picamera import PiCamera import RPi.GPIO as GPIO buzzer = 22 GPIO.setmode(GPIO.BCM) GPIO.setup(buzzer, GPIO.OUT) camera = PiCamera() camera.resolution = (320, 240) #Una resolución más pequeña significa un procesamiento más rápido camera.framerate = 24 rawCapture = PiRGBArray(camera, size=(320, 240)) kernel = np.ones((2,2),np.uint8) time.sleep(0.1) for still in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True): GPIO.output(buzzer, False) image = still.array #create a detection area widthAlert = np.size(image, 1)#obtener el ancho de la imagen heightAlert = np.size(image, 0)#obtener la altura de la imagen   yAlert = (heightAlert/2) + 100 #determina la coordenada y del area cv2.line(image, (0,yAlert), (widthAlert,yAlert),(0,0,255),2) #dibujar una linea para mostrar el area lower = [1, 0, 20] upper = [60, 40, 200] lower = np.array(lower, dtype="uint8") upper = np.array(upper, dtype="uint8")#utilizar la gama de colores para crear una mascara para la imagen y aplicarla a la imagen mask = cv2.inRange(image, lower, upper) output = cv2.bitwise_and(image, image, mask=mask) dilation = cv2.dilate(mask, kernel, iterations = 3) closing = cv2.morphologyEx(dilation, cv2.MORPH_GRADIENT, kernel) closing = cv2.morphologyEx(dilation, cv2.MORPH_CLOSE, kernel) edge = cv2.Canny(closing, 175, 175) contours, hierarchy = cv2.findContours(closing, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) threshold_area = 400 centres = []rasp if len(contours) !=0: for x in contours: #encuentra el area de cada contorno area = cv2.contourArea(x) #encuentra el centro de cada contorno moments = cv2.moments(x) #elimine los contornos que son menores que nuestro umbral if area > threshold_area: (x,y,w,h) = cv2.boundingRect(x) centerX = (x+x+w)/2 centerY = (y+y+h)/2 cv2.circle(image,(centerX, centerY), 7, (255, 255, 255), -1) if ((y+h) > yAlert): cv2.putText(image, "ALERTA!", (centerX -20, centerY -20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,255,255),2) GPIO.output(buzzer, True) cv2.imshow("Display", image) rawCapture.truncate(0) key = cv2.waitKey(1) & 0xFF if key == ord("q"): GPIO.output(buzzer, False) break

Ahora este script puede ser nombrado como ar_detector.py y lanzarlo desde la consola .

Ojo no basta con lanzarlo F5 desde el propio Python pues dará probablemente error a l ahora de importar al libreria cv2, pero no se preocupe situarse en la ruta del scrript en prython y ejecutar

sudo python car_detector.py
Cámara trasera inteligente con Raspberry Pi. Parte 2

A partir desde ahí debería funcionar la detección de imágenes con lo que capte la imagen de la Raspberry Pi

En el siguiente vídeo podemos ver el script en acción

Como vemos en elvideo en pequeña escala, lo hizo bastante bien detectando un montón de objetos innecesarios, ( aunque a veces detecta las sombras como objetos.)En un escenario del mundo real, los resultados fueron sorprendentemente precisos ,pero si es cerca de las condiciones perfectas, Tenga en cuenta que el código es básico actualmente y necesitaria muchas más pruebas y depuración)

De los dos métodos,este método , pero el primer método es más confiable en múltiples situaciones. Así que si usted fuera a hacer esto para su coche, iría con el método inicial ( el que usa overlay).

Conexión hacia la Raspberry Pi via vnc

Ya que se ha conectado exitósamente a la consola de comandos por ssh , seguro que le interesa también poderse conectar tambien al interfaz gráfico por lo que ahora nos toca instalar y configurar el servidor de VNC sobre Raspberry Pi en su tablet/smartphone.

Para instalar y configurar el VNC viewer en su tablet/smartphon en android siga los siguientes pasos:

  • Descargue la app Vnc Viewwer desde Google Play desde la url oficial https://play.google.com/store/apps/details?id=com.realvnc.viewer.android
  • Al ejecutar la app por primera vez le pedira una cuenta de vnc, de modo qeu si no la tiene tendra que creala desde la propia aplicacion introduciendo una cuenta de correo, un nombre , apellido,pais y un catcha,
  • En nuestro correo electrónico recibiremos un email que debemos validar para confirmar que cuenta nos pertenece
  • Una vez que haya confirmado los datos puede intentar volver a entrar en la app VNV Viewer ingresando las credenciales que introdujo
  • Ahora siga el procedimiento similar al del ssh
    • Haga clic en el el Boton del signo más en la parte inferior izquierda de la pantalla y seleccione la opción .
    • Entrar los siguientes datos:

    Alias: cualquier nombre es aceptable como por ejemplo Raspberry Pi

    Nombre de host: la dirección Ip obatnida con el comando ifconfig

    Contraseña: la pwd que haya puesto

    Los demás campos se pueden dejar espacios en blanco, luego toque la marca de verificación en la derecha superior. Después de eso, haga clic en una Conectar cuando se le preguntó " Si desea conectar el dispositivo

  • Para conectarse a su Raspberry Pi , dado que ya ha creado la conexión, pulse sobre el icono nuevo que aparece en la pantalla de inicio
  • Enseguida deberían aparecer las credenciales de acceso y probablemente el pwd en blanco que deberemos completar .
  • Finalmente progresar la conexión pulsando en CONTINUE
  • Una vez dado el botón de conectar debería aparecer la pantalla principal de Raspbian que ahora podremos controlar desde nuestro smartphone
  • Podemos ver la imagen de la cámara ahora desde el propio teléfono
Cámara trasera inteligente con Raspberry Pi. Parte 2

Mas información en : https://www.hackster.io/tinkernut/raspberry-pi-smart-car-8641ca


Volver a la Portada de Logo Paperblog