domingo, 4 de junio de 2017

Práctica 12

En esta práctica se pretende crear un útil que mediante dos cámaras sea capaz de:

  1. Reconocimiento facial del usuario 
  2. Un display que nos permita seleccionar los siguientes programas:
    • Lectura de un QR y apertura de su página web 
    • OCR: lectura de un texto
    • Contador/decontador de un objeto dado
La plantilla es la que sigue:


Los componentes que necesitaremos son:
  • Un motor PAP que nos mueva la cámara.
  • Arduino y driver para el PAP.
  • Una cámara para el útil.
  • Una cámara para el reconocimiento facial.
  • Una estructura sobre la que montarlo todo.
Comenzaremos por construir la estructura. El material elegido para su construcción es madera por la facilidad de trabajar con ella y el diseño será el que sigue:


De modo que en el lado izquierdo colocaremos el código QR, en el centro el texto y la pared derecha la usaremos para el contador.

El motor será situado en el centro de la estructura para que la cámara esté a la misma distancia de todas las paredes y podamos mantener el enfoque constante. El Arduino y el controlador lo fijaremos en la horizontal, en una esquina donde las conexiones nos sean cómodas.

El siguiente paso será controlar el motor, pues la posición de la cámara es importante para la parte de visión artificial.

El montaje y los materiales serán los mismos que hemos realizado en prácticas anteriores, solo que en este caso, controlaremos el servo por medio de instrucciones de LabView.

Como en otras ocasiones, crearemos un sub-VI que podamos llamar desde otra función principal, por lo que todas las entradas deberán ser variables. El conjunto de instrucciones que utilizaremos ya lo conocemos de otras practicas anteriores, por lo que vamos directos al programa. El primer paso como siempre será abrir y configurar el recurso:


El siguiente paso será configurar los pines que vamos a utilizar:

Ahora vamos con el movimiento del motor:

En este punto básicamente hemos copiado el algoritmo de control del programa de processing en LabView: generamos pulsos de reloj con periodos de 4 segundos. 

Para terminar con el diagrama de bloques, deshabilitamos el driver y cerramos el proceso. De nuevo, como en la práctica de Arduino, dejamos un pequeño tiempo de espera antes de deshabilitar el driver.


Antes de cerrar editaremos el icono y los terminales de este VI



Hay algo interesante que resaltar en estas instrucciones de Arduino, y es que aunque seleccionemos un pin digital sin PWM, el valor que podemos darle sigue siendo un entero entre 0 y 255, por lo que debemos introducir 255 cuando esperemos un nivel lógico alto. 

Ahora que ya tenemos el control del motor y la estructura ya podemos empezar con la programación en Vision Builder.

Como este programa ya tiene una complejidad elevada, debemos pensar primero un diagrama de estados. En mi caso yo he elegido el siguiente:

Lo explicaré brevemente:

El primer estado es el reconocimiento facial, si este no es positivo, el programa no sale de él. En caso de ser positivo pasamos al programa de espera, donde se pueden dar tres casos:
  • Que nos encontremos en la posición de lectura del QR
  • Que nos encontremos en la posición de lectura de texto
  • Que nos encontremos en la posición de contaje 
Cualquier otra condición provocará que volvamos al estado de espera. De entre estos tres casos, solo uno merece especial mención y es el de contaje. Si entramos en este estado, iremos hacia contar o decontar dependiendo de si el objeto pasa de derecha a izquierda o a la inversa. después vamos a un estado en el que operamos y volvemos al estado de espera.

Ahora iremos programando estado a estado. El primero es el estado de reconocimiento facial. empezaremos con la instrucción "Set Variable" donde definiremos e inicializaremos las variables locales que utilizaremos en el programa.


Utilizaremos variables para saber el estado en el que estamos (letras, código y contar), una para guardar el valor a operar (+1 o -1) y el estado actual del contador.

Las siguientes instrucciones serán adquirir imagen y eliminar un plano como hacemos siempre. 


Ahora debemos buscar algunos patrones en nuestro rostro que nos identifiquen solo a nosotros. En mi caso he escogido el puente de las gafas, la nariz y la boca. Es muy importante que hagamos esto con las condiciones de iluminación en las que vamos a utilizar el útil, ya que de no ser así puede que no nos identifique bien.

La instrucción que utilizaremos será "Mach Pattern". Al seleccionar esta instrucción se nos abrirá una ventana con una captura de la cámara donde debemos seleccionar el patrón que queremos buscar:


Una vez seleccionado, pulsamos siguiente y veremos una imagen recortada que representa nuestro patrón. 


 Hay que tener en cuenta que esta instrucción busca patrones por matrices de colores, por lo que debemos escoger zonas que no sean fácilmente reproducibles y ajustar el porcentaje de coincidencia que queremos, así como el ángulo de giro:




Repetimos estos pasos para todos los elementos que queramos comprobar y finalmente comprobamos que todos se cumple a la vez:

Y con esto, hemos terminado este estado. El siguiente será el estado de espera, que solamente reconoce el entorno en el cual se encuentra. Consta de estas instrucciones:


Hay que recordar que en este paso es donde se produce el cambio entra la webcam del reconocimiento facial (en mi caso la del portátil) y la que tenemos montada en el útil, por lo que debemos capturar de nuevo.

El próximo estado será el de lectura del código QR. La primera instrucción será seleccionar la imagen que vamos a procesar, en este caso no capturamos, pues nos sirve la imagen del estado anterior:


La instrucción que utilizaremos para leer el QR será "Read 2D Barcode", que se encuentra en el menú "Inspection Steps". Dicha instrucción solo precisa seleccionar en el desplegable "QR Code" y una ROI en nuestra imagen.

El siguiente paso será crear un custom overlay que nos muestre la dirección que acabamos de leer. El resultado es será algo así:


Y con esto hemos terminado con el lector de códigos. Ahora veremos el lector de texto u OCR. Al igual que el estado del QR, este estado no captura imagen, si no que utiliza la del estado de espera.

En el mismo menú que la instrucción de lectura de códigos, tenemos la instrucción para leer texto, aunque en este caso la configuración será tediosa. La configuración se realiza en la pestaña "Mode", concretamente en el botón "Edit Character Set File...". Es importante mencionar que reconocerá exclusivamente la tipografía que nosotros le vamos a introducir ahora.



Al pulsar este botón accederemos a una nueva ventana, donde introduciremos lo carácteres que queremos que pueda identificar y modificaremos los parámetros para que exista el menor ruido posible:


Aunque la imagen no es muy buena, podemos ver cómo identifica correctamente algunos de los caracteres. Para terminar con este estado, mostraremos en pantalla el resultado de este paso, como ya hicimos en el caso del QR.

Comenzaremos ahora con el estado principal de contador. En este caso si necesitaremos adquirir una nueva imagen y de nuevo quitar un plano de color. La siguiente instrucción será mostrar en pantalla el valor del contador.


Tras este paso, buscaremos el patrón del objeto que nos servirá para contar en un lado de la pantalla, para posteriormente hacerlo en el otro lado. En mi caso es un patrón bastante complejo, en una postura determinada:


Añadiremos un trío de instrucciones al final que realizarán la comprobación de que el objeto no es localizado a la vez en las dos zonas a la vez.


El siguiente estado será "izq" (derecha es inverso). La transición a este estado se producirá si el objeto a sido detectado por la derecha. En este estado volvemos a mostrar el contador, a adqurir imagen, a quitar un plano y a ver si el objeto es detectado en el lado derecho. En caso positivo, modificaremos la variable "temp" con un valor -1.


Por último en el estado operar, mostraremos el contador, realizaremos la operación temp+contador y haremos un delay de 750ms para no volver a detectar el objeto en esta posición y entrar de nuevo en el ciclo de contaje. 

Con esto ya hemos terminado la creación de los estamos, ahora nos quedan las transiciones. Para crear una nueva transición, hacemos click derecho sobre el estado del estado inicial y seleccionamos "Create New Transition"  e inmediatamente nos pide que pulsemos sobre el estado destino.

Para editar una transición tenemos que hacer click con boton derecho sobre ella y seleccionar "Edit Transition" y se nos abrirá una nueva ventana donde podemos seleccionar qué tipo de transión queremos y la variable que controlará esa transición:


Las transiciones que hemos configurado son estas:

  • CaraDetect: reconocimiento positivo
  • LeerQR: zona1=1
  • Contar: zona2=1
  • LeerTexto: zona3=1
  • NoContar: la variable que comprueba que el objeto "está" en los las dos zonas
El resto son por defecto o se han comentado ya.

Una vez en este punto ya hemos terminado la programación del Vision Builder y debemos pasar a LabView. Para ello primero hay que migrar el proyecto:




Este proceso es largo y hay que dejar el ordenador libre mientras se lleva a cabo. Cuando haya terminado, generará un proyecto un una cantidad respetable de VIs (unos 30).


Código de visión

Práctica 11

En esta práctica se pretende medir una pieza utilizando dos webcams y Vision Builder.

Para poder hacerlo, fabricaremos un útil donde instalaremos las cámaras y un metro.



Como hemos comentado anteriormente, lo primero es configurar adecuadamente la cámara. Una vez hecho abrir el Vision Builder y comenzar a programar.

Al ser un programa sencillo, lo implementaremos todo en un mismo estado. En mi caso utilizaré una cámara Full HD y otra de baja resolución.

El primer paso será adquirir la imagen de la izquierda, utilizaremos la instrucción de adquirir donde debemos definir la cámara que vamos a utilizar:



En esta misma instrucción debemos configurar también la calibración con respecto a nuestro metro y el punto de referencia, para poder obtener una medida al final.



El siguiente paso será quitar un plano de color para reducir el peso de las imágenes. Para ello recurrimos al "Vision Assistant", definimos la región de interés o ROI, que será la zona de la imagen donde se aplique este proceso (en nuestro caso "Full Image" y pulsamos editar:



Al hacerlo se abrirá una nueva ventana con nuevas instrucciones. Seleccionaremos extraer color e inmediatamente nos dará uno de los planos (Reed, Green, Blue) para escoger:




Cuando lo hayamos escogido, cerramos la nueva ventana. al volver a la ventana original, podemos ver la configuración de la instrucción:



Es importante modificar los nombre de los pasos para saber qué es lo que hacemos en cada uno.

El siguiente paso será localizar el inicio de la pieza, haremos esto de dos maneras:
  • Mediante "Find Edges"
  • Mediante "Find Straight Edge"
Utilizamos los dos porque posteriormente escogeremos la mejor. En ambos casos debemos ajustar los parámetros para optimizar la detección.

En este punto del programa ya hemos terminado con la parte izquierda, repetimos los mismos pasos con la cámara derecha.

Una vez ya tenemos detectados inicio y final, es momento de realizar los cálculo. Para ello recurrimos a la instrucción "Calculator" dentro del menú"Aditional Tools". Esta instrucción nos mostrará un interfaz muy similar a LabView donde podemos realizar nuestras operaciones:


Primero realizamos el cálculo entre detección de puntos.  Después el de detección de ejes:

Y por último seleccionamos con qué medida nos quedamos y decidimos si hemos medido bien.

.
Este paso existe porque para algunas piezas, posiciones y condiciones de luz, unas instrucciones funcionan mejor que otras. En nuestro caso, hemos comprobado que las instrucciones de flanco o línea dan mejor resultado y por eso las priorizamos. 

En cualquiera de estos tres pasos podemos acotar las medidas con un porcentaje de erro que creamos conveniente. 


Por último obtenemos la medida de la pieza y la printamos en pantalla. En esta misma instrucción podemos añadir un indicador que nos diga si está dentro de nuestros varemos o no.

La instrucción que nos permite mostrar información al usuario se llama "Custom Overlay":





Visión artificial

La visión artificial es una disciplina científica que incluye métodos para adquirir, procesar, analizar y comprender las imágenes del mundo real con el fin de producir información numérica o simbólica para que puedan ser tratados por un computador. Tal y como los humanos usamos nuestros ojos y cerebros para comprender el mundo que nos rodea, la visión artificial trata de producir el mismo efecto para que las computadoras puedan percibir y comprender una imagen o secuencia de imágenes y actuar según convenga en una determinada situación. Esta comprensión se consigue gracias a distintos campos como la geometría, la estadística, la física y otras disciplinas. La adquisición de los datos se consigue por varios medios como secuencias de imágenes, vistas desde varias cámaras de vídeo o datos multidimensionales desde un escáner médico.

Cuando se realiza a color hay que procesar siempre tres planos distinto (RGB).

La posición tanto de la cámara como de los objetos, al igual que la iluminación son factores determinantes en el éxito de los procesos de captación de imágenes. 

Nosotros vamos a ver la visión artificial desde "Vision Builder", un entorno configurable, interactivo, guiado por menú y fácil de usar para construir, realizar pruebas comparativas y desplegar aplicaciones completas de visión artificial sin las complejidades de la programación. Y en algunos casos procesar posteriormente la información que obtenemos o dirigir el proceso con LabView.

NI Max

Lo primero que tenemos que hacer es configurar la cámara dentro des este gestor. Dependiendo de la cámara tendremos más o menos opciones. Aunque las opciones podrán ser modificadas posteriormente tanto en LabView como en Vision Builder, ambos programas cargan de la configuración por defecto que guardemos en NI Max, por lo que conviene asegurarse de que esta sea la correcta. 



Vision Builder

El interfaz de programación se divide en varias zonas:


Es importante tener en cuenta que Vision Builder funciona con máquina de estados, donde dentro de cada estado podemos tener un subprograma. Podemos configurar las transiciones e incluso crear variables.

Las instrucciones son muy variadas: desde detectar patrones o flancos, a mostrar avisos en pantalla o realizar operaciones lógicas.




Práctica 10

En esta práctica se pretende dar el valor de la temperatura con una PT100 configurada en un puente de Wheastone. Realizaremos las medidas con un myDAQ y daremos el valor en temperatura comparando el valor de la resistencia con una base de datos.

En la entrada anterior ya hemos comentado analizado a fondo una PT100, así que nos queda analizar el myDAQ.



NI myDAQ es un dispositivo de adquisición de datos (DAQ) de bajo costo que brinda la posibilidad de para medir y analizar señales en cualquier lado. Combina hardware con ocho instrumentos definidos por software listos para ejecutar, incluyendo un generador de función, osciloscopio y multímetro digital (DMM). Incluye dos entradas analógicas y dos salidas analógicas a 200 kS/s y 16 bits, permitiendo aplicaciones como muestrear una señal de audio; ocho entradas digitales y líneas de salida, proporcionando potencia para circuitos simples con fuentes de alimentación de +5, +15 y -15 volts y un DMM de 60 V para medir voltaje, corriente y resistencia. 

Los parámetros que nos interesan para esta practica son los siguientes:


Podemos consultar el datasheet completo en esta dirección.

Las conexiones de las que dispone son las siguientes:



Ahora que ya conocemos los elementos que vamos a utilizar, vamos a programar. La primera parte de esta práctica consiste en crear una base de datos con los valores de la PT100. Estos pasos ya han sido explicados en una entrada anterior, así que los pasaremos rápido.



 A diferencia de la práctica anterior, esta vez vamos a utilizar instrucciones avanzadas, que se encargan ellas mismas de abrir el recurso, configurarlo y cerrarlo. Este conjunto de instrucciones es el que sigue:


El siguiente paso es tomar las medidas. Para ello utilizaremos la siguiente instrucción, dónde definiremos que recurso queremos usar y cuál es el rango de tensión que vamos a medir:

Haciendo doble click sobre dicha instrucción podemos ver el interfaz NI ELVIS:

El siguiente paso será calcular Rt en función del valor medido y convertirlo a String:



El motivo de la conversión es poder compararlo con los valores leídos en la base de datos en el siguiente paso:



Finalmente cerramos el recurso. 

En el panel frontal podemos ver una pequeña explicación de la práctica, junto con un resumen de medidas y resultados.