Desarrollo de prototipos con la uEye Python Interface y Open CV

Módulo de visión embebida

La visión artificial clásica evoluciona rápidamente hacia una visión embebida. Los sistemas compactos, en los que el factor coste es importante, ofrecen un menor consumo de energía y al mismo tiempo unas prestaciones más elevadas. Sin embargo, desarrollar un dispositivo de visión embebida puede suponer una gran inversión de tiempo y de dinero. Las limitaciones de estos sistemas altamente especializados en cuanto a interfaces, rendimiento, memoria y posibilidades de visualización y de introducción de datos dificultan mucho el manejo del hardware y el desarrollo del software en comparación con una estación de trabajo de escritorio con componentes estándar. Y precisamente con desarrollos propios (plataforma de hardware, firmware y software) se puede tardar mucho tiempo hasta obtener los primeros resultados.

Sin embargo, en el mercado existe una serie de componentes de visión embebida estándar para la fase inicial de desarrollo que permiten realizar pruebas preliminares "nada más salir de la caja". En combinación con los programas de software adecuados, permiten realizar pruebas y obtener los primeros resultados muy rápidamente.

Nuestro consejo técnico le explica cómo crear en muy pocos pasos una aplicación sencilla de visión embebida con una cámara uEye y una Raspberry Pi 3.

Visión embebida Aplicación con la uEye Python Interface y Open CV
Visión embebida Aplicación con la uEye Python Interface y Open CV

Paso 1: Preparar el hardware

Instale el SO Raspbian en una Raspberry Pi 3 y actualice el sistema con la última versión de software.

pi@raspberrypi:~ $ sudo apt-get update && apt-get upgrade

En internet encontrará las instrucciones para configurar una Raspberry Pi. Teóricamente para la demo puede utilizar cualquier otra tarjeta embebida compatible con ARMv7 (por ejemplo Odroid XU4). Sin embargo, con su CPU Quadcore, Raspberry Pi3 posee suficiente potencia para realizar pruebas sencillas de procesamiento de imágenes y el SO Raspbian ya tiene preinstalados muchos de los componentes necesarios. Todo lo demás se puede instalar después cómodamente mediante los paquetes fuente.

Conecte una cámara USB uEye a un puerto USB de la Raspberry Pi.

pi@raspberrypi:~ $ sudo pip install pyueye

De ese modo se instala la uEye Python Interface para el uso con Python 2.7 en el sistema. Las dependencias de módulo necesarias se instalan directamente con PIP. Para comprobar que la instalación es correcta inicie el Python-Interpreter e importe el módulo uEye.

pi@raspberrypi:~ $ python
Python 2.7.9 (default, Sep 17 2016, 20:26:04)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from pyueye import ueye
>>>

Si no aparece ningún mensaje de error significa que la instalación es correcta.

Paso 3: Instalar OpenCV

Las bibliotecas de desarrollo OpenCV se pueden instalar muy fácilmente a partir de los paquetes fuente de Raspbian. Se trata de una versión más antigua (2.4.9.1), pero es más que suficiente para nuestra demo. La conexión Python para las bibliotecas OpenCV para Python 2.7 también se encuentra en los paquetes fuente. Para el uso con Python 3 debe compilarla a partir de los códigos fuente para la plataforma embebida. En este caso también encontrará instrucciones sencillas en la red.

pi@raspberrypi:~ $ sudo apt-get install libopencv-dev python-opencv

Esta instalación también la puede comprobar en Python-Interpreter con la importación del módulo "cv2" de OpenCV.

Paso 4: Descargar y probar la aplicación de ejemplo PyuEye

Como punto de partida para sus propias aplicaciones de procesamiento de imágenes con uEye y la Python Interface descárguese el ejemplo de código fuente enlazado en este Consejo técnico y descomprímalo en el directorio que desee de la Raspberry Pi.

El ejemplo de código fuente se ha generado por completo en Python. Por ello no tiene que hacer una compilación cruzada para la arquitectura del sistema (ARMv7 A) de la Raspberry Pi. Puede ejecutarlo directamente a través del Python Interpreter. De ese modo será compatible con cualquier plataforma. Esto significa que también puede ejecutar el ejemplo de código fuente en un sistema Windows o Linux Desktop siempre que en estos sistemas estén instalados los requisitos necesarios (controlador uEye, PyuEye Interface, Python 2.7).

El ejemplo de código fuente PyuEye está dividido en cuatro archivos Python que ofrecen clases y funcionalidades a distintas partes del programa de ejemplo:

1) pyueye_example_camera.py

Proporciona la clase "Camera" con funciones que se necesitan con frecuencia para trabajar con la cámara.

2) pyueye_example_gui.py

Con las clases "PyuEyeQtView" y "PyuEyeQtApp" puede generar un programa Qt Widget sencillo y con ello el marco para una aplicación GUI. Este módulo se basa en Qt4 y por consiguiente utiliza bindings de Qt4 para Python (PyQt4). Qt4 ya está integrado en Raspbian Jessie. Puede instalar los bindings para Python mediante los paquetes fuente:

pi@raspberrypi:~ $ sudo apt-get install python-qt4 python-qt4-doc

3) pyueye_example_utils.py

Este módulo aporta importantes funciones y clases de conveniencia que son muy útiles para trabajar con una aplicación de cámara. Entre muchas otras, se encuentran el manejo de excepciones, de datos de la cámara y de las memorias gráficas.

4) pyueye_example_main.py

El módulo "main" crea una estructura de aplicación sencilla con Qt, abre e inicializa la cámara conectada y pone a su disposición una función callback en la que se ya se ha realizado un procesamiento de imágenes sencillo con OpenCV. Si ejecuta la demo visualizará la imagen en directo de la cámara conectada y los resultados del procesamiento de imágenes.

pi@raspberrypi:~/example $ python pyueye_example_main.py

Procesamiento de imágenes OpenCV

Nuestro sencillo método de procesamiento de imágenes con OpenCV busca círculos en la imagen y los marca.

Para ello basta con unas pocas líneas de código en el módulo "main", puesto que para esta tarea OpenCV contiene una implementación completa con la función cv2.HoughCircles que vamos a utilizar. Y para poder trabajar con OpenCV se han importado "cv2" y "numpy":

from pyueye_example_camera import Camera
from pyueye_example_utils import FrameThread
from pyueye_example_gui import PyuEyeQtApp, PyuEyeQtView
from PyQt4 import QtGui

from pyueye import ueye

import cv2
import numpy as np
def process_image(self, image_data):

    # reshape the image data as 1dimensional array
    image = image_data.as_1d_image()    
    # make a gray image
    image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    #image = cv2.medianBlur(image,5)
    # find circles in the image
    circles = cv2.HoughCircles(image, cv2.cv.CV_HOUGH_GRADIENT, 1.2, 100)
    # make a color image again to mark the circles in green
    image = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR)
    
    if circles is not None:
	   # convert the (x, y) coordinates and radius of the circles to integers
	   circles = np.round(circles[0, :]).astype("int") 
	   # loop over the (x, y) coordinates and radius of the circles
	   for (x, y, r) in circles:
		  # draw the circle in the output image, then draw a rectangle
		  # corresponding to the center of the circle
		  cv2.circle(image, (x, y), r, (0, 255, 0), 6)
    
    # show the image with Qt
    return QtGui.QImage(image.data,
                        image_data.mem_info.width,
                        image_data.mem_info.height,
                        QtGui.QImage.Format_RGB888)

Como es habitual en Python, puede ejecutar directamente la aplicación modificada. Puede seguir modificando la aplicación sin demasiado esfuerzo y probar otras tareas de procesamiento con OpenCV.