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

No hay comentarios:

Publicar un comentario