SlideShare una empresa de Scribd logo
Instituto Tecnológico de Hermosillo.
    INGENIERIA MECATRONICA




     SISTEMAS INTELIGENTES




            PRACTICA
  SISTEMA DE VISION ARTIFICIAL


           Elaborado por:

       LÓPEZ LÓPEZ OCTAVIO
   MARIO GUMARO DUARTE PERALTA




       Profesor de la asignatura:
    EDUARDO CHAVEZ MENDIOLA




                              Hermosillo, Son., 12 de junio del 2012




                                                                  1
INDICE                                                                          PAGINA

  1. RESUMEN………………………………………………………………………….3
  2. INTRODUCCION…………………………………………………………………..4
     2.1. Problema a investigar…………………………………………………………..4
     2.2. Importancia del estudio………………………………………………………...4
     2.3. Hipótesis………………………………………………………………………..4
  3. MARCO TEORICO………………………………………………………………...5
     3.1. Adquisición de imágenes……………………………………………………….5
     3.2. Características cuantitativas – análisis estadístico de la imagen…………… ….5
     3.3. Utilizando MatLab…………………………………………………………… ..6
          3.3.1. Interfaz de MatLab…………………………………………………......6
     3.4. Estructura básica de instrucciones de matlab…………………………………...6
     3.5. Comprender y observar…………………………………………………………6
     3.6. Creando una imagen binaria……………………………………………………7
     3.7. Imagen en escala de grises……………………………………………………...7
     3.8. Cursor de datos………………………………………………………………….7
     3.9. Umbral…………………………………………………………………………. 7
     3.10. Archivos M……………………………………………………………… .. 7
     3.11. Funciones………………………………………………………………….. 8
     3.12. Adquisición de imágenes………………………………………………… ..8
     3.13. Utilizando el toolbox de visión con matlab……………………………….. 8
     3.14. Obtención de la información del dispositivo……………………………… 8
     3.15. Captura de la imagen en Matlab………………………………………… .. 9
     3.16. Preparación del dispositivo………………………………………………...9
  4. METODOLOGIA………………………………………………………………….10
  5. RESULTADOS…………………………………………………………………….11
  6. CONCLUSIONES………………………………………………………………….24
  7. REFERENCIAS BIBLIOGRAFICAS……………………………………………..25




                                                                                         2
1. RESUMEN

Detección de patrones dentro de un entorno mediante el uso de MATLAB.

Octavio Lopez L., Instituto Tecnológico de Hermosillo.

Mario G. Duarte P.Instituto Tecnológico de Hermosillo.

        Este proyecto está enfocado a la detección de patrones mediante visión artificial utilizando
un software especial llamado Matlab. Con este software fue posible el poder programar y controlar
un dispositivo parecido a un carro de control remoto al cual se le montó una cámara para la
detección de figuras (en este caso un cuadrado) mediante esta detección de figuras el dispositivo
pudo seguir a la figura dependiendo de su posición, esta decisión tomada en base al umbralamiento
y gracias al reconocimiento de patrones proporcionado por Matlab.

        En el proceso de la realización del proyecto se llevaron a cabo bastantes pruebas con las
cuales se determinó y se definieron la mayoría de los parámetros para el funcionamiento de este, así
como el que figura geométrica detectar, el área (en pixeles) de detección del cuadrado, etc.

        El dispositivo se introdujo en un entorno completamente blanco y fue ahí con todo exito
donde detectó el color negro para así no perderse dentro se le puso de frente la figura y este lo
siguió sin ningún problema.




                                                                                                  3
2. INTRODUCCION.

        Elsiguiente reporte tiene como objetivo el de enseñar el uso del procesamiento de imágenes
y reconocimiento de patrones con Matlab mediante una cámara con la cual se detecta una figura en
particular y con ella un dispositivo en forma de carro mencionado previamente toma la decisión de
seguirlo hacia donde este objeto de color negro se encuentre dentro de un entorno completamente
blanco, ya sea hacia delante o hacia cualquiera de los dos lados.

       A continuación se mostrara a detalle cómo se realizó este trabajo, tanto su construcción,
como su programación, las complicaciones que se tuvieron durante la realización de este, así como
también después de terminado ya el dispositivo y su programación.



               2.1. Problema a investigar.
       El Siguiente problema es el de poder construir un dispositivo de visión artificial el cual
       detecte patrones específicamente esquinas de una figura por medio de una cámara y como
       complemento el seguirlo a manera de carro hacia donde se le coloque el objeto (en este caso
       cuadrado).
               ¿Cómo se diseñará este sistema de visión?
               Este sistema de visión será diseñado mediante un software especializado Matlab,
               que cuenta con una caja de herramientas específica para este tipo de aplicaciones.
               ¿Por qué se construirá este sistema de visión artificial?
               Este sistema de visión artificial será construido con el fin de así poder guiar a un
               dispositivo con ruedas hacia un objeto con la finalidad de que lo reconozca,
               enfocándose más a la detección de patrones que hoy en la actualidad muchas
               empresas lo utilizan para la detección de fallos.



               2.2. Importancia del estudio.
       La importancia que este estudio tiene hasta ahorita es de carácter estudiantil, pero de igual
       forma la aplicación que este estudio tiene puede abarcar amplias áreas en las cuales la
       visión artificial pueda ser aplicada de una forma en la cual sea de gran ayuda en muchos
       procesos, ya sea de producción o de búsqueda, este tipo de sistemas inteligentes hoy en la
       actualidad son de gran importancia en la industria, y es por tal, que es ahora el momento
       correcto de que esto se ponga a prueba la construcción de estos en escuelas, ya que con esto
       se refuerza el conocimiento que podría ser aplicado a la vida real.



              2.3. Hipótesis
       Todo el sistema en conjunto será capaz de poder seguir algún patrón por medio de un tipo
       seguidor, en el cual la cámara va montada se comunica con la computadora, en la cual se
       monitorea y detecta hacia donde y como se mueve el carro,



                                                                                                  4
3. MARCO TEORICO.

Antes de empezar con la metodología se tienen que comprender ciertos términos para así entender
por completo el funcionamiento y características del sistema.

    1. Adquisición de la imagen: esta consiste en una videocámara web, o una cámara analógica
       con una interface de conexión para el procesamiento.
    2. Procesamiento: esta parte consiste en una computadora personal que está dedicada al
       procesamiento de imagen.
    3. Análisis de la imagen: Un conjunto de herramientas usadas para analizar el contenido de la
       imagen capturada y encontrar la posición de un objeto.



    3.1. Adquisición de imágenes

La adquisición de imágenes puede ser usando una cámara de video que utilice diferentes tipos de
resoluciones, en esta caso de 320 x 240 pixeles, para esto se tienen dos tipos de cámaras
disponibles, cámaras digitales tipo CCD o cámaras analógicas.

Las cámaras digitales generalmente tienen una interfaz de conexión a la computadora por puerto
USB.

Requerimientos de alimentación: las cámaras CCD dan como resultado imágenes de alta calidad
con poco ruido. Estas generan una señal analógica que utilizan un convertidor analógico digital y
por lo tanto requieren un consumo alto de energía.

El análisis de la imagen consiste en extraer información útil a partir de las imágenes capturadas. En
primer lugar se deben de definir las características del objeto haciendo una búsqueda de la imagen.
Estas características del objeto deben ser lo más solidas posibles. Generalmente con el fin de
rastrear o identificar el objeto que se está utilizando, estas características son:

    A)   Color
    B)   Intensidad
    C)   Textura o patrón
    D)   Bordes circulares, rayas verticales o rayas rectas
    E)   Estructura, alineación de los objetos de una manera especifica



    3.2. Características cuantitativas – análisis estadístico de la imagen.
    A) Centro de gravedad. Punto donde los pixeles deseados pueden estar equilibrados.
    B) Numero de pixeles. Es un número alto de pixeles que indica la presencia de un objeto.
    C) BLOB, es el área de pixeles conectada.

Matlab proporciona una plataforma muy fácil de usar para la adquisición y procesamiento de
imágenes. Incluso los puertos serie y paralelo se pueden acceder directamente en matlab.

                                                                                                   5
Matlab sirve como una herramienta útil para los VCM. Proporcionan una poderosa biblioteca,
integrada de muchas funciones útiles para el procesamiento de la imagen.



    3.3. Utilizando Matlab.

Matlab provee un conjunto de librerías que soportan areas de la ingeniería y la ciencia y la
simulación.

    3.3.1.   Interfaz de matlab.

Cuando damos doble clic en el icono de matlab podemos observar 3 ventanas: comand window,
work space, y command history.

        Comand window.
        Esta ventana sirve para describir los comandos y observar los resultados.
        Work space.
        Esta ventana muestra las variables definidas dentro de la sesión abierta de matlab.
        Command history.
        En esta ventana se almacena una lista de todos los comandos que se han utilizado así como
        una referencia rápida de cada uno de ellos.



    3.4. Estructura básica de instrucciones de matlab.

Dentro de matlab, las variables pueden almacenar matrices asi como también se pueden definir para
números enteros, números reales o números complejos. También las matrices pueden ser
ensambladas en estructuras de arreglos de datos.

    3.5. Comprender y observar

Dentro de matlab la imagen se almacena en una matriz de dos dimensiones, donde dicha matriz
contiene los valores de la intensidad y brillo de los pixeles. Un pixel es el punto más pequeño en
una imagen que puede mostrarse en la pantalla, la resolución de la imagen es igual al número de
pixeles que pueden ser mostrados en una cuadricula donde las unidades son pulgadas dentro de la
pantalla del monitor.

Para ver realmente los valores almacenados en la matriz conviene activar los siguientes comandos:

>> im(1:10, 1:10)

>> figure, imshow(50:150,50;150);




                                                                                                    6
3.6. Creando una imagen binaria.

Imagen binaria.

Una imagen que contiene solo blanco y negro se le considera una imagen binaria.

Por ejemplo:

>>imbin= [0 1; 1 0]

>> Figure, imshow (imbin, „initialmagnification‟, „fit‟);

El negro indica intensidad 0 y el blanco indica intensidad máxima(1)

    3.7. Imagen en escala de grises.

Una imagen en escala de grises contiene valores de intensidades en un rango o intervalo de un cero
a un máximo, incluyendo el negro y el blanco normalmente este intervalo se encuentra entre 0 y
255. Asi los valores cercanos a cero son los tonos oscuros de gris, mientras que los valores cercanos
a 255 indican un gris claro.

Por ejemplo:

>> imgray= [0.0 0.2 0.4 0.8 1.0]

>> figure, imshow (uint8(imgray); „initialmagnification‟, „fit‟);



    3.8. Cursor de datos.

Para ver los colores en la ventana de la figura se tiene una opción en la barra de herramientas que se
llama cursor de datos, el cual al estar activado si hacemos un clic en la imagen sobre cualquier
punto, podremos ver los valores de RGB por pixeles en la imagen en posiciones X, Y.

    3.9. Umbral.

Una imagen en escala de brises se puede convertir en una imagen binaria pasando por un proceso
llamado umbral, el toolbox de procesamiento de imágenes proporciona una función.



    3.10.         Archivos M.

Matlab proporciona una facilidad para ejecutar múltiples secuencias de comandos con una sola
instrucción. Esto se hace escribiendo el nombre de un archivo extensión .m. es decir se puede crear
una función en la que manualmente se escriban todos los comandos y se guarden dentro de una
función en matlab.Hay que recordar que en matlab se pueden crear comentarios los cuales sirven
como una herramienta útil para poner información al momento de ir ejecutando un programa, esto
se logra utilizando el símbolo de %.

                                                                                                    7
3.11.       Funciones.

Las funciones ayudan a escribir de manera organizada el cogido, con un minimo de repeticiones
lógicas. Mientras escribe los archivos m, sucede a menudo que un conjunto de instrucciones
comunes se utilizan dentro un programa. En lugar de escribir nuevamente el conjunto de
instrucciones que se necesita dentro del programa, esto se puede simplificar definiendo una función
donde tienen que pasar los datos dentro de la función, para devolver un resultado.

    3.12.       Adquisición de imágenes.

Antes de continuar con el tema es conveniente revisar el apoyo prestado por la caja de herramientas
de “ADI” de matlab.

Hoy en dia la mayoría de las cámaras están disponibles con una interfaz USB. Una vez que esta
instalado el controlador de la cámara la computadora detecta el dispositivo cada vez que se conecta.
Por otra parte se tiene una cámara de video digital o una cámara CCD deben estar relacionados con
una tarjeta de adquisición de video que hace la función de interfaz con la computadora por lo lo que
el sistema operativo de Windows detecta automáticamente el dispositivo.

Con el fin de ejecutar las instrucciones tradicionales de procesamiento de imágenes es necesario
utilizar una cámara web USB funcional conectada a su PC.

    3.13.       Utiliando el toolbox de visión con matlab.

Resulta de suma utilidad para implementar algoritmos de visión o adquisición de imágenes en
tiempo real utilizando dispositivos simples y de bajo costo tales como las webcams. Matlab incluye
el toolbox "Image Acquisition" para este fin.

    3.14.       Obtencion de la información del dispositivo.

Imaqhwinfo
Devuelve la información del hardware y software disponibles, tales como: Adaptador de video
instalado, versión de Matlab, Toolbox (nombre y versión).

Imaqhwinfo(‘adaptor’)
Donde adaptor es el nombre del adaptador instalado, por lo general winvideo. Este comando
devuelve información relacionada al adaptador.
Imaqhwinfo(‘adaptor’,DeviceID)
Donde DeviceID es el ID del dispositivo a utilizar obtenido con el comando anterior. Si sólo se
cuenta con un dispositivo conectado el DeviceID será 1. Este comando muestra información del
dispositivo conectado (cámara) .




                                                                                                  8
En matlab se puede verificar si la cámara web está disponible o lista. Matlab puede acceder a
diferentes tipos de adaptadores de dispositivos de video. Un adaptador utiliza a matlab como un
dispositivo para adquisición de imágenes

A continuación se muestran los siguientes comandos:

>>imaghwinfo;

>>cam= imaqhwinfo;

>>cam.installedAdaptors;

>>dev_info= imaqhwinfo („winvideo‟, 1);



3.15.Captura de la imagen en matlab

Las imágenes capturadas utilizando la herramienta vfm son entregadas alespacio de trabajo en
formato RGB.Para capturar las imágenes entregadas por los drivers en el espacio de trabajode
matlab se utiliza la función vfm que tiene el siguiente formatoImageCaptured=vfm(grab,n);Donde
ImageCaptured es la variable que contiene la imagen RGB, y n es elnumero de ‟frames‟ a capturar,
en dado caso de que sea mas de uno la variablede la imagen capturada se indexa para recuperar el
‟frame‟ necesario.De tal forma que si se quisiera capturar el ‟frame‟ actual visto por la cámarase
procedería a escribir en línea de comandos:

>>ImageRGB=vfm(grab,1);


>>imshow(ImageRGB);



3.16. Preparacion del dispositivo

Crear la estructura:
cam=imaqhwinfo(‘adaptor’,DeviceID)

Para poder obtener las características del dispositivo con facilidad.
Por ejemplo, para obtener los formatos soportados:
cam.SupportedFormats

Ejecutar el comando:
video=videoinput(‘adaptor’,DeviceID,’Format’)


Construye un objeto de entrada de video (nexo entre el dispositivo y Matlab). Si no se especifica
Format se asume el formato por defecto.


                                                                                                9
Pre-Visualización.

Para desplegar la pre-visualización de las imágenes a capturar ejecutar el comando:
preview(video).

>>Preview (video)

Captura.

Para capturar una imagen ejecutar:
Image=getsnapshot(‘cam’)



4. METODOLOGIA.



El presente proyecto de desarrollo en la ciudad de Hermosillo, en distinto lugares, se tuvieron
muchos inconvenientes en este sentido ya que no se contaba con una área de trabajo totalmente
adecuada para trabajar, fue necesario trabajar en distintos lugares, en aulas de clases, laboratorios y
en nuestras casas.

Este trabajo fue realizado bajo diseño experimental ya que dentro de este se tuvieron que manejar
bastantes variables, que fueron necesarias para poder lograr el objetivo del sistema en conjunto con
su cámara como los que fueron la longitud de pixeles, el área, igual en pixeles el control de giro de
los motoreductores, entre otras cosas.

Para la elaboración de todo el proyecto podemos dividi su metodología en 3 partes:

        Diseño Electronico
        Programacion (MatLAb y Pics)
        Armado del prototipo

Diseño Electronico

En el diseño electrónico, incluimos la comunicación bluetooth, comunicación por radio frecuencia,
control, y una etapa de potencia, a continuación se entrara en detalle en cada una de estas etapas.

Comunicaciones inalámbricas

Un problema critico que se tuvo para el diseño del carrito para que fuera inalámbrico, fue la
transmicion de imágenes del prototitpo hacia una computadora de manera inalámbrica. Se
consideraron posibles alternativas, se evaluaron su factibilida y/o compatibilidad con Matlab y se
decidio por instalar un kit inalámbrico de transmicion de imágenes por radio frecuencia, debido al


                                                                                                    10
bajo costo y a la falta de tiempo para investigar otros protocolos de comunicación. Los
componentes que conforman el kit son los siguientes:

       Video Camara
       Receptor de video con antena
       Adaptador RCA a USB
       Cable AV(RCA)

La cámara consta de 3 cables, dos de ellos son para transmitir audio y video los cuales en nuestro
caso se quedaron desconectados, ya que la transmicion se realiza por medio de una antena ya
integrada a la cámara. Un tercer cable es para alimentar a la cámara con una batería de 9 volts. A
continuación se muestra una imagen de la cámara:




La señal transmitida desde de la cámara por medio de la antena integrada a la camapara es
capturada por un receptor el cual posee salidas RCA de video para ser vistas en alguna pantalla,
DVD etc. A continuaciokn se muestra una imagen de este equipo:




                                                                                               11
Para poder trabajar con las imágenes para su posterior procesamiento, la salida de video del reciber
se conecto a un adapatador USB que convierte la señal de video RCA a USB (digital). Con este
ultimo paso tenemos comunicación inalámbrica entre la cámara y una computadora, listo para
procesar imágenes en MatLab tomadas desde el prototipo y transmitidas inalambricamente. A
continuación se muestra una imagen de dicho adaptador.




                                                                                                 12
Otro aspecto muy importante es la comunicación inalámbrica para el control del prototipo (carrito).
Una vez que se han procesado las imágenes se genera un resultado de dicho proceso y esta
información se enviara inalámbricamente al dispositivo. Analizando los toolbox de Matlab el
dispositivo mas factible es la comunicación bluetooth, ya que Matlab cuenta con el toolbox
Instrument Control Toolbox, en el apartado de programación se entrara en detalle.



El modulo Bluetooth cuenta con salidas y entradas seriales en niveles TTL, con esto nos permitio
recibir datos desde una computadora y comunicarlo con un microcontrolador mediante el protocolo
de comunicación serial RS-232. De esta manera contamos con la comunicación inalámbrica desde
la computadora hacia el prototipo para enviarle la información necesaria para el control de los
motores. A continuación se muestra una imagen del modulo bluetooth y su diagrama de
conexionamiento.




                                                                                                13
En la imagen anterior se puede observar la conexión que se realizo entre el modulo bluetooth y el
microcontrolador para la transmicion de datos seriales. En el apartado de etapa de potencia se ablara
sobre el LM293 y su funcionamiento, y en el apartado de programación de microcontroladores se
ablara sobre el por que se conectaron de esta manera.



Control

El microcontrolador realiza el control de los motores, utilizando los pines RB0, RB1, RB2, RB3,
utilizando RB0 y RB1 para controlar el sentido de giro de un motor, sacando por estos pines
conbinaciones (0 0, 0 1, 1 0, 1 1) y de igual manera para el segundo motor utilizando los pines RB2
y RB3. De esta manera se logro controlar los dos motores. En el apartado de la etapa de potencia se
explica a detalle las conexiones del LM293.



Etapa de potencia

Para suministrar un voltaje de 5 volts a los motores de corriente directa, se utilizo el driver LM293,
este driver cuenta con dos canales repartidos en 2 entradas y 2 salidas por canal, además de los
enables que se alimentan directamente a 5 volts para activar los canales. Los pines RB0 y RB1 se
conectaron al canal 1, de tal manera que cuando el RB0=0 y RB1 el motor gira en un sentido al

                                                                                                   14
cambiar los valores a RB0=1 y RB=0 el motor cambia de giro. Se realiza exatamente lo mismo para
el segundo motor. La alimentación de todo el circuito se realizo con dos baterías de 3.6V a 700mA
conectadas en seria para aumentar el torque y pasando por una etapa de regulación de voltaje con un
7805 para mantener un voltaje de 5volts estable.De esta manera tenemos la potencia suficiente para
poder hacer girar los motores con el suficiente torque.

Programacion (MatLab y PICS)

MatLab



Una vez teniendo el circuito electrónico bien definido con todos las comunicacione bien definidas
se procedio a la programación de los componentes necesarios. El programa principal, el del control
del prototipo y el procesado de las imágenes se realizo en Matlab. Se utilizo una interface grafica
para la programación, a continuación se muestra una imagen de dicha interface grafica.




El programa consta de 3 botones principales, Encender Camara, Iniciar Procesamiento y Apagar
Camara, como su nombre lo indica estos botones realizan las funciones de encender la cámara,
iniciar el procesamiento de imágenes y apagar la cámara. Cuenta con dos áreas de graficacion una
para mostrar las imágenes a color (formato RGB24_320*240), y otra área mas pequeña donde se
grafica la imagen pero binarizada por un umbral, este umbral se controla por medio de un slider que
se encuentra arriba del área de graficacion. Cuenta con un edit text para indicar los movimientos
que deben de tener los motores, además de 3 edit text para indicar las coordenadas del centroide de
la figura y para mostrar el área del objeto. Por ultimo cuenta con un ultimo edit text para indicar el

                                                                                                   15
estado del carrito, si esta buscando el objetivo o si ya lo detecto. Además cuenta con un control
manual, para posicionar el carrito de manera manual en la posición deseada incial, para después
iniciar el procesamiento y desactivando el control manual y activando el control automatico.

Lo anterior descrito es una descripción breve de la interface grafica, ahora pasaremos a la forma de
programación y el funcionamiento del programa.



Cuando se corre el programa lo primero que aparece es la interface grafica, como se mostro en la
imagen anterior, al mismo tiempo también habilita la comunicación con el bluetooh utilizando el
bluetooth de la computadora, con la instrucción blue=Bluetooth(„nombre_dispositivo‟,1) donde el 1
representa el canal de comunicación, y con la instrucion fopen(„nombre_dispositivo) para abrir la
comunicación.



Cuando se presiona el botón iniciar procesamiento lo primero que realiza lo que realiza el programa
es entrar en un siglo infinito y tomar una foto y mostrarla en un axes principal, después la procesa
hasta obtener una imagen binarizada con un umbral regulado por el usurario mediante un slider,
después se la da un procesamiento para eliminar pixeles exedentes o ruido, primero dilatando la
imagen (agregación de pixeles en la frontera) y después erosionándola (eliminación de pixeles en la
frontera), una vez lista la imagen se realiza un barrido de la imagen recorriendo cada pixel de la
imagen por columnas y filas, y checando en el barrido cuales pixeles están en blanco, cuando
encuentra un pixel en blanco pasa a una serie de instrucciones para determinar si es una esquina
especifica de un cuadrado. Por ejemplo para detectar la esquina superior izquierda, en ese pixel que
se encuentra verefica que el pixel de arriba este en negro, el de la derecha en blanco, el de abajo en
blando y el de la izquierda en negro, de esta manera se garantiza que ese pixel es la esquina superior
esquierda y el mismo procedimiento se realiza para las cuatro esquinas. Cuando detecta que una
esquina esta presente, pone en uno una variable para indicar que se detecto la esquina, al final de
aver pasado por el chequeo de las 4 esquinas, revisa las variables, y si las 4 valen 1, quiere desir
que se detectaron 4 esquinas, entonces envía a un edit que se detecto el objetivo, si alguna de las
variables no vale uno, aparece en ese mismo edit buscando objetivo y no realiza ninguna acción.

En el caso que detecte satisfactoriamente las cuatro esquinas del objetivo pasa a una serie de
funciones, primeramente para calcular el centroide del objetivo, graficarlo y calcular el área del
objetivo y mostralo en los edit text. Como nada mas importa el control del carrito hacia a la derecha
y hacia la izquierda se tomo la coordenada del centroide en y, y entra a una serie de condiciones
donde se evaluava el valor de la coordenada y si era menor o igual a 120(pixeles) pasa a escribir un
dato por el bluetooth para hacer girar el carrito hacia la izquierda, de no cumplir esta condición pasa
a otra condición, si la coordenada es mayor o igual a 200 pasa a escribir en el bluetooth un dato para
hacer girar los motores hacia la derecha, de no cumplir esta condición, pasa a revisar si esta dentro
del rango 120-200 de ser haci quiere desir que el centroide esta en el centro de la imagen, y pasa a
revisar el tamaño de la imagen si el área de la imagen esta por arriba de un set point, quiere desir
que ya esta suficientemente cerca, por lo que escribe un sero en puerto bluetooth para apagar los
motores, si es menor que el valor del set point escribe en el bluetooth un dato para indicar que

                                                                                                    16
avanze el carrito, por lo tanto escribe un dato en el bluetooth para hacer que avanze el carrito,
dependiento de cual condición alla sido verdadera pasa a escribir en un edit text el sentido de giro
de los motores. Después de todo esto se inicializan las variables en 0, que se usaron para indicar
que se detecto una esquina. Habiendo echo esto termina una corrida completa del ciclo infinito y
comienza otra vez desde el inicio. Los datos que se mandaron desde matlab por el bluetooth hacia el
microcontrolador van en una secuenca determinada para que lo único que realice el
microcontrolador es pasar el dato al puerto B. a continuación se muestra el programa completo.



function varargout = Prueba_3(varargin)
% PRUEBA_3 MATLAB code for Prueba_3.fig
%      PRUEBA_3, by itself, creates a new PRUEBA_3 or raises the existing
%      singleton*.
%
%      H = PRUEBA_3 returns the handle to a new PRUEBA_3 or the handle to
%      the existing singleton*.
%
%      PRUEBA_3('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in PRUEBA_3.M with the given input
arguments.
%
%      PRUEBA_3('Property','Value',...) creates a new PRUEBA_3 or raises
the
%      existing singleton*. Starting from the left, property value pairs
are
%      applied to the GUI before Prueba_3_OpeningFcn gets called. An
%      unrecognized property name or invalid value makes property
application
%      stop. All inputs are passed to Prueba_3_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only
one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help Prueba_3

% Last Modified by GUIDE v2.5 10-Jun-2012 17:29:06

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @Prueba_3_OpeningFcn, ...
'gui_OutputFcn', @Prueba_3_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback',    []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout

                                                                                                 17
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before Prueba_3 is made visible.
function Prueba_3_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to Prueba_3 (see VARARGIN)

% Choose default command line output for Prueba_3
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes Prueba_3 wait for user response (see UIRESUME)
% uiwait(handles.figure1);
fondo1=imread('vision_1.jpg');              %carga una imagen de fondo
imshow(fondo1,'parent',handles.axes1);      % y la direcciona a un axes

fondo2=imread('vision_2.jpg');                 %carga una segunda imagen de
fondo
imshow(fondo2,'parent',handles.axes2);         % y la direcciona a otra axes

%bt=Bluetooth('Mario-Bluetooth',1);             % crea el objeto de
bluetooth
%fopen(bt);                                     % y abre la comunicacion
%handles.bt=bt;

guidata(hObject, handles);

% --- Outputs from this function are returned to the command line.
function varargout = Prueba_3_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;


% --- Executes on button press in encender_camara.
function encender_camara_Callback(hObject, eventdata, handles)
% hObject    handle to encender_camara (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)



                                                                           18
vid=videoinput('winvideo',1,'YUY2_320x240');     % configuracion de la web-
cam
handles.vid=vid;                                 % redireccionamiento de la
variable

triggerconfig(vid,'manual');                     % activacion de la camara
manualmente
set(vid,'FramesPerTrigger',1);                   % solo tomara una foto
set(vid,'TriggerRepeat',Inf);
set(vid,'ReturnedColorSpace','rgb');             % la imagen estara en
formato rgb
start(vid);                                      %inicializa la camara

set(gcf,'DoubleBuffer','on','renderer','painters');
guidata(hObject, handles);

% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

while 1
    trigger(handles.vid);                              %prepara la camara
    im_rgb=getdata(handles.vid);                       %toma una fotogradia

       imagesc(im_rgb,'parent',handles.axes1);         % y la manda a un
axes

    im_gray=rgb2gray(im_rgb);                          %convierte la imagen
de color a escalas de grises

    val_umbral=get(handles.slider1,'value');           % toma el valor de
umbralamiento
    im_bin=im_gray<=val_umbral;                        %para binarizarla

    EE=strel('square',20);                             % creacion de
constantes para el tratamiento
    SE=strel('square',20);                             % de imagenes

    im_dilatada=imdilate(im_bin,SE);                   % dilata la imagen
    im_erosionada=imerode(im_dilatada,EE);             % y despues la
erosiona

    imshow(im_erosionada,'parent',handles.axes2);      %y por ultimo la
direcciona a un axes

    a=0;                                               % variable que se
utilizan para la deteccion de las
    s=0;                                               % esquinas, tienen
que comenzar en cero cuando procesa
    d=0;                                               % cada imagen
    f=0;
   [m,n]=size(im_erosionada);                          %se determina el
tamaño de la matris de la imagen

                                                                             19
for i=10:(m-20)                                    %realiza un barrido de
toda la imagen
for j=10:(n-20)                               %pixel por pixel para
determinar si es
if im_erosionada(i,j)==1                  % blanco
if im_erosionada(i-1,j)==1 && im_erosionada(i-1,j+1)==1 &&....      % en el
caso que sea blanco estas lineas
                  im_erosionada(i,j+1)==1 && im_erosionada(i+1,j+1)==1
&&....    % determinan si esta presente la esquina superior
                  im_erosionada(i+1,j)==1 && im_erosionada(i+1,j-1)==1
&&....    % izquierda
                  im_erosionada(i,j-1)==1 && im_erosionada(i-1,j-1)==1
&&....
                  im_erosionada(i-3,j)==0 && im_erosionada(i-3,j-3)==0
&&....
                  im_erosionada(i,j-3)==0
                         a=1;
% de ser asi pone un uno en la variable de referencia
%q=cat(2,j,i);                                             % forma un vector
con las coordenadas del pixel
%hold on;                                                  % congela la
imagen
%plot(q(:,1), q(:,2), 'r*');                               %para poder
graficar la deteccion de la esquina
%hold off;
end

if im_erosionada(i-1,j)==1 && im_erosionada(i-1,j+1)==1 &&....     % pasa
a revisar si esta preseente la esquina superior derecha
                  im_erosionada(i,j+1)==1 && im_erosionada(i+1,j+1)==1
&&....     % y se realiza el mismo procedimiento anterior
                  im_erosionada(i+1,j)==1 && im_erosionada(i+1,j-1)==1
&&....
                  im_erosionada(i,j-1)==1 && im_erosionada(i-1,j-1)==1
&&....
                  im_erosionada(i-3,j)==0 && im_erosionada(i-3,j+3)==0
&&....
im_erosionada(i,j+3)==0
                         s=1;
%w=cat(2,j,i);
%hold on;
%plot(w(:,1), w(:,2), 'b*');
%hold off;
end

if im_erosionada(i-1,j)==1 && im_erosionada(i-1,j+1)==1 &&....    % pasa
a revisar si esta presente la esquina inferior derecha
                 im_erosionada(i,j+1)==1 && im_erosionada(i+1,j+1)==1
&&....    % y se realiza el mismo procedimiento anterior
                 im_erosionada(i+1,j)==1 && im_erosionada(i+1,j-1)==1
&&....
                 im_erosionada(i,j-1)==1 && im_erosionada(i-1,j-1)==1
&&....
                 im_erosionada(i-3,j+3)==0 && im_erosionada(i,j+3)==0
&&....


                                                                          20
im_erosionada(i+3,j)==0
                        d=1;
%e=cat(2,j,i);
%hold on;
%plot(e(:,1), e(:,2), 'g*');
%hold off;
end

if im_erosionada(i-1,j)==1 && im_erosionada(i-1,j+1)==1 &&....     % pasa
a revisar si esta presenta la esquina inferior izquierda
                  im_erosionada(i,j+1)==1 && im_erosionada(i+1,j+1)==1
&&....     % y realiza el mismo procedimiento anteior
                  im_erosionada(i+1,j)==1 && im_erosionada(i+1,j-1)==1
&&....
                  im_erosionada(i,j-1)==1 && im_erosionada(i-1,j-1)==1
&&....
                  im_erosionada(i-3,j-3)==0 && im_erosionada(i,j-3)==0
&&....
                  im_erosionada(i+3,j)==0
                         f=1;
%r=cat(2,j,i);
%hold on;
%plot(r(:,1), r(:,2), 'y*');
%hold off;
end

end
end
end

if a==1 && s==1 && d==1 && f==1
% revisa si estan detectadas las 4 esquinas
         set(handles.edit1,'string','Objectivo Detectado');
% de ser asi marca que se detecto el objetivo
         cx=0;cy=0;t=0;
% se definen variables para el centroide y el area
for y=1:(m-20)                                                            %
realiza un barrido de la imagen pixel por pixel
for u=1:(n-20)                                                        % para
ver si esta en blanco de ser asi
if im_erosionada(y,u)==1                                       % va
calculando el centroide y sumando el area en pixeles
                      t=t+1;
                      cx=cx+y;
                      cy=cy+u;
end
end
end
         set(handles.edit2,'string',cx/t);
% muestra los valores de las coordenadas en x
         set(handles.edit3,'string',cy/t);
% y en y
         q=cat(2,(cy/t),(cx/t));
% forma un vector que contiene las coordenadas del centroide
         hold (handles.axes1);
% y congela la imagen


                                                                          21
plot(q(:,1), q(:,2), 'r*','parent',handles.axes1);
% para graficarlo
hold (handles.axes1);

         set(handles.edit4,'string',t);
% muestra el area del objeto
if (cy/t)<=120                                                            %
si la cordenada en x esta del centroide esta mas a la izquierda
             set(handles.edit5,'string','CW');
% esta mas a la izqueirda muestra el sentido de giro de los motores
             fwrite(handles.bt,(9));
% y manda el valor binario por bluetooth para hacerlos girar
             guidata(hObject, handles);
end

if (cy/t)>=200                                                            %
si la coordeana en x del centroide esta mas a la derecha
             set(handles.edit5,'string','CCW');
% muestra el sentido de giro de los motores
             fwrite(handles.bt,(6));
% y manda el dato por el bluetooth para que giren en ese sentido
             guidata(hObject, handles);
end

if (cy/t)>=120 && (cy/t)<=200                                             %
define el centro de la imagen donde debe de estar para acer
if t<=50000                                                           %
girar los motores para delante o apagarlos si alcanzo el objetivo
                set(handles.edit5,'string','Avanza');
% si el area del objeto es menor a 50000 pixeles avanza
                fwrite(handles.bt,(10));
% manda los datos para ke avanse
                guidata(hObject, handles);
else
                set(handles.edit5,'string','Alto');
% si el area es mayor el carrito se para
                fwrite(handles.bt,(0));
% y manda los datos para apagar los motores
guidata(hObject, handles);
end
end
else
set(handles.edit1,'string','Buscando Objetivo');                          %
estas lineas restantes se ejecutan si no se ha detectado el objeto
        fwrite(handles.bt,(9));
% apaga los motores
guidata(hObject, handles);
        set(handles.edit5,'string','Motores Apagados');
% e inicializa los edit en cero
        set(handles.edit2,'string',0);
        set(handles.edit3,'string',0);
        set(handles.edit4,'string',0);
end

   guidata(hObject, handles);
   flushdata(handles.vid);

                                                                          22
end
% --- Executes on button press in apagar_camara.
function apagar_camara_Callback(hObject, eventdata, handles)
% hObject    handle to apagar_camara (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
fclose(handles.bt);
% cierra la comunicacion bluetooth
stop(handles.vid);
% cierra la comunicacion de video

% --- Executes on slider movement.
function slider1_Callback(hObject, eventdata, handles)
% hObject    handle to slider1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'Value') returns position of slider
%        get(hObject,'Min') and get(hObject,'Max') to determine range of
slider


% --- Executes during object creation, after setting all properties.
function slider1_CreateFcn(hObject, eventdata, handles)
% hObject    handle to slider1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns
called

% Hint: slider controls usually have a light gray background.
if isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor',[.9 .9 .9]);
end




function edit1_Callback(hObject, eventdata, handles)
% hObject    handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit1 as text
%        str2double(get(hObject,'String')) returns contents of edit1 as a
double


% --- Executes during object creation, after setting all properties.
function edit1_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns
called


                                                                       23
% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end




function edit2_Callback(hObject, eventdata, handles)
% hObject    handle to edit2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit2 as text
%        str2double(get(hObject,'String')) returns contents of edit2 as a
double


% --- Executes during object creation, after setting all properties.
function edit2_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns
called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end




function edit3_Callback(hObject, eventdata, handles)
% hObject    handle to edit3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit3 as text
%        str2double(get(hObject,'String')) returns contents of edit3 as a
double


% --- Executes during object creation, after setting all properties.
function edit3_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns
called

% Hint: edit controls usually have a white background on Windows.

                                                                       24
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end




function edit4_Callback(hObject, eventdata, handles)
% hObject    handle to edit2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit2 as text
%        str2double(get(hObject,'String')) returns contents of edit2 as a
double


% --- Executes during object creation, after setting all properties.
function edit4_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns
called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end




function edit5_Callback(hObject, eventdata, handles)
% hObject    handle to edit5 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit5 as text
%        str2double(get(hObject,'String')) returns contents of edit5 as a
double


% --- Executes during object creation, after setting all properties.
function edit5_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit5 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns
called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.


                                                                       25
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end




function edit6_Callback(hObject, eventdata, handles)
% hObject    handle to edit6 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit6 as text
%        str2double(get(hObject,'String')) returns contents of edit6 as a
double


% --- Executes during object creation, after setting all properties.
function edit6_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit6 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns
called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end




function edit7_Callback(hObject, eventdata, handles)
% hObject    handle to edit7 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit7 as text
%        str2double(get(hObject,'String')) returns contents of edit7 as a
double


% --- Executes during object creation, after setting all properties.
function edit7_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit7 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns
called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))

                                                                       26
set(hObject,'BackgroundColor','white');
end




function edit8_Callback(hObject, eventdata, handles)
% hObject    handle to edit8 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit8 as text
%        str2double(get(hObject,'String')) returns contents of edit8 as a
double


% --- Executes during object creation, after setting all properties.
function edit8_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit8 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns
called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end




function edit9_Callback(hObject, eventdata, handles)
% hObject    handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit1 as text
%        str2double(get(hObject,'String')) returns contents of edit1 as a
double


% --- Executes during object creation, after setting all properties.
function edit9_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns
called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

                                                                       27
function edit12_Callback(hObject, eventdata, handles)
% hObject    handle to edit3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit3 as text
%        str2double(get(hObject,'String')) returns contents of edit3 as a
double


% --- Executes during object creation, after setting all properties.
function edit12_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns
called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end




function edit13_Callback(hObject, eventdata, handles)
% hObject    handle to edit2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit2 as text
%        str2double(get(hObject,'String')) returns contents of edit2 as a
double


% --- Executes during object creation, after setting all properties.
function edit13_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns
called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end




                                                                       28
% --- Executes on button press in avanza.
function avanza_Callback(hObject, eventdata, handles)
% hObject    handle to avanza (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
fwrite(handles.bt,(10));
guidata(hObject, handles);
% --- Executes on button press in giro_derecha.
function giro_derecha_Callback(hObject, eventdata, handles)
% hObject    handle to giro_derecha (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
fwrite(handles.bt,(6)); %4
guidata(hObject, handles);

% --- Executes on button press in giro_izquierda.
function giro_izquierda_Callback(hObject, eventdata, handles)
% hObject    handle to giro_izquierda (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
fwrite(handles.bt,(9)); %1
guidata(hObject, handles);

% --- Executes on button press in retrocede.
function retrocede_Callback(hObject, eventdata, handles)
% hObject    handle to retrocede (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

fwrite(handles.bt,(5));
guidata(hObject, handles);


% --- Executes on button press in alto.
function alto_Callback(hObject, eventdata, handles)
% hObject    handle to alto (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
fwrite(handles.bt,(0));
guidata(hObject, handles);




PICS

El microcontrolador que se utilizo fue el pic16f628a, la palabra de configuración que se utilizo esta
definida para que funcione con el oscilador externo y desactivando el MCLR. La única función que
tiene el microcontrolador es leer el dato que manda matlab por el bluetooth y sacarlo al puerto tal
cual, como lo manda MatLab, dejándole todo el control del prototipo a Matlab. A continuación se
muestra la programación que se utilizo en lenguaje basic.




                                                                                                  29
'****************************************************************

'* Name : UNTITLED.BAS                                  *

'* Author : [select VIEW...EDITOR OPTIONS]                  *

'* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *

'*        : All Rights Reserved                     *

'* Date       : 6/9/2012                        *

'* Version : 1.0                            *

'* Notes :                              *

'*        :                         *

'****************************************************************



@ DEVICE PIC16F628A, INTRC_OSC_NOCLKOUT

@ DEVICE PIC16F628A, MCLR_OFF



INCLUDE "MODEDEFS.BAS"



CMCON=7

DAT VAR BYTE

TRISA=$0F

TRISB=$00

PORTB=0



INICIO:

     SERIN PORTA.0,2,DAt

PORTB=DAT

     PAUSEUS 100



                                                                    30
GOTO INICIO

END

Armado del Prototipo

5. RESULTADOS.

Al final en este proyecto se llego al objetivo esperado, lo que desde un principio se planteo, se logro
que el dispositivo pudiera seguir correctamente a una figura, por medio de la cámara

El propósito de utilizar un entorno de color blanco es para que el dispositivo no se pierda e intente
buscar algún otro objeto que se le parezca o trate de imitar a la figura que realmente debería de
seguir, ya que es un problema si este se pierde e intenta seguir otro objeto, ya que se guía solo por
figuras.




                                                                                                    31
6. CONCLUSIONES.

Al finalizar este proyecto se pudo llegar a la conclusión de que el poder diseñar un sistema de visión
artificial que reconozca patrones, tiene muchas aplicaciones no nomas de forma didáctica si no
fuera en la industria donde realmente se utilizan este tipo de sistemas para la detección de fallas en
algún proceso o maquinado.



Un problema muy particular y especifico que se nos presento fue en la detecccion de las cuatro
esquinas, ya que la función que se desarrollo funciona para cuadrados estrictamente perfectos, cosa
que con la resolución de la cámara y la calidad en la forma del objeto a seguir no se pudo lograr ya
que se perdían las esquinas por instantes de tiempos muy pequeños debido a diferentes
circunstancias como el cambio en la luminosidad del entorno entre otras cosas, este problema se
soluciono agregando ala parte de código donde se detectan las esquinas chequear los pixeles que se
encuentran a todas las direcciones arriba, abajo, derecha, izquierda, diagonales, y también dándole
una tolerancia entre 1 y 5 pixeles para la detección de la esquina (esto se puede ver en los
comentarios del programa).



Otro punto critico fue la rapidez con que el carrito giraba ya que inicialmente el dato que mandaba
MatLab al microcontrolador estaba diseñado que para el momento de girar un motor encendiera en
un sentido y el otro en sentido contrario esto proboco una respuesta demasiado rápida, tan rápida
que el carrito perdia el objeto, la solución fue girar nada mas un motor para dar la vuelta un poco
mas lento y de esta manera no perder el objetivo.



Para lograr una mayor respuesta del sistema se necesita una unidad de procesamiento muy rápida ya
que todo el proceso que realiza es tardado pero resulto ser dentro de lo factible ya que el carrito no
perdió el objeto debido al retardo en procesar las imágenes, por ejemplo supongamos que se detecta
que el objeto buscado esta a la derecha entonces se manda el dato para que gire a la derecha, y
vuelve a procesar otra imagen para determinar la posición actual del objeto, en este lapso de tiempo
de ser muy largo, pudiera ser que ya se alla perdido el objeto ya sigue girando a la derecha.
Afortunadamente no tuvimos problemas con esto ya que el procesamiento se realizo
moderadamente rápido de manera que no perdiera el objetivo.



Como punto de vista personal del equipo, sentimos que hace falta mas apoyo por parte de la
institución, para la realización de proyectos, ya que mucha veces no contamos con las herramientas
necesarias para la construcción y/o pruebas, como taladros, tornos fresas, fuentes de alto amperaje y
voltaje. Una buena opción es que estuviera siempre un área destinada a la elaboración de proyectos
y con la herramienta almenos minima para poder presentar proyectos de mayor calidad ya que al no
contar con herramienta adecuada o necesaria es una gran limitante en el diseño mecanico o en la
realización de pruebas de los circuitos electrónicos.

                                                                                                   32
Un error que se cometio fue al momento de realizar las pruebas preliminares en la elaboración del
programa, ya que primero se realizo el diseño electrónico, después toda la programación y por
ultimo la construcción del prototipo. Esto nos afecto en tiempo, ya que se perdió mucho tiempo por
que las pruebas que se realizaban durante la elaboración del programa eran con una cartulina y un
cuadrado de color negro, el impacto fue que no obteníamos como el sistema se comportaría
realmente, lo ideal ubiera sido tener el diseño electrónico, el prototipo y por ultimo hacer todo la
programación e ir haciendo las pruebas necesarias con el prototipo ya montado.

MatLab es un entorno de trabajo grandísimo, con demasiadas herramientas para la elaboración de
cualquier proyecto, por lo que nos dimos cuenta la gran variedad y utilidad que tienen todos los
Toolbox de visión artificial de matlab, y otros áreas, ya que fue de bastante ayuda en la elaboración
de este proyecto.

Como recomendaciones para futuras investigaciones o construcciones de proyectos de este tipo,
recomendamos investigar sobre Computer Vision System Toolbox, que es una caja de herramienta
especialmente diseñada para sistemas de visión artificial no de Adquisicion y Procesamiento. Si se
realizaron pruebas o experimentos sobre este toolbox pero por falta de tiempo y dado de que no era
el objetivo principal se dejo por un lado esta manera de procesar la información, pero seria bueno
realizar pruebas con este toolbox.




7. REFERENCIAS BIBLIOGRAFICAS.
      Apuntes del cuaderno de clases de “Sistemas Inteligentes”. Eduarto Chavez Mendiola.
      Visión por Computador utilizando MatLAB y el Toolbox de Procesamiento Digital de
      Imágenes. Erik Valdemar Cuevas Jimenez, Daniel Zaldivar Navarro.
      Procesamiento de imágenes con MatLAB. http://lonely113.blogspot.com
      Segmentación de colores con MatLAB. Dr. Alejandro Aceves.
      Metodología de la investigación. Roberto Hernandez Sampieri.




                                                                                                  33

Más contenido relacionado

PPTX
Level(s) Marco europeo para los edificios sostenibles - Josefina Lindblom
PDF
Localización del eje de una vía caminera
PDF
36 trivino 2012 barrera nj 41812545
PDF
Visión artificial
PDF
Utp pdi_2014-2 lab3 borrador
PDF
Manual de prácticas de fotointerpretacion
PDF
Manipulador de 2 grados de libertad
DOCX
Level(s) Marco europeo para los edificios sostenibles - Josefina Lindblom
Localización del eje de una vía caminera
36 trivino 2012 barrera nj 41812545
Visión artificial
Utp pdi_2014-2 lab3 borrador
Manual de prácticas de fotointerpretacion
Manipulador de 2 grados de libertad

Similar a Proyecto. vision artificial (20)

PDF
Navegacion autonoma reactiva en pasillos usando el punto de fuga
PDF
Reporte proyecto primer parcial 1
DOCX
Curso: "Prototipos Interactivos 2". Plantilla Implementación
PPTX
Metrología: Sistemas De Visión Artificial
PDF
Reconocimiento de placas matlab
PPTX
Vision-Artificial-Inteligencia-Artificial.pptx
PPTX
Entregable3
PPTX
MOOC de Realidad aumentada (Coursera)
DOCX
Brazo Robotico de 6 grados de libertad
PPTX
PROYECTO_COLOQUxIO.ppasdasdasdasdsadasdt
PPT
Realidad aumentada
DOCX
Actividad integradora N°2
PDF
Patrones
PDF
1962235_PRACT_5_TRAY_SCRIPT.pdffffffffff
PDF
Soft recono matriculas
PDF
Segmentación imagenes
PPTX
Colegio nacional pomasqui 1
PPSX
Agente Reconedor de Señales de Transito
PDF
Sistema autoalerta para vehículos.
Navegacion autonoma reactiva en pasillos usando el punto de fuga
Reporte proyecto primer parcial 1
Curso: "Prototipos Interactivos 2". Plantilla Implementación
Metrología: Sistemas De Visión Artificial
Reconocimiento de placas matlab
Vision-Artificial-Inteligencia-Artificial.pptx
Entregable3
MOOC de Realidad aumentada (Coursera)
Brazo Robotico de 6 grados de libertad
PROYECTO_COLOQUxIO.ppasdasdasdasdsadasdt
Realidad aumentada
Actividad integradora N°2
Patrones
1962235_PRACT_5_TRAY_SCRIPT.pdffffffffff
Soft recono matriculas
Segmentación imagenes
Colegio nacional pomasqui 1
Agente Reconedor de Señales de Transito
Sistema autoalerta para vehículos.
Publicidad

Proyecto. vision artificial

  • 1. Instituto Tecnológico de Hermosillo. INGENIERIA MECATRONICA SISTEMAS INTELIGENTES PRACTICA SISTEMA DE VISION ARTIFICIAL Elaborado por: LÓPEZ LÓPEZ OCTAVIO MARIO GUMARO DUARTE PERALTA Profesor de la asignatura: EDUARDO CHAVEZ MENDIOLA Hermosillo, Son., 12 de junio del 2012 1
  • 2. INDICE PAGINA 1. RESUMEN………………………………………………………………………….3 2. INTRODUCCION…………………………………………………………………..4 2.1. Problema a investigar…………………………………………………………..4 2.2. Importancia del estudio………………………………………………………...4 2.3. Hipótesis………………………………………………………………………..4 3. MARCO TEORICO………………………………………………………………...5 3.1. Adquisición de imágenes……………………………………………………….5 3.2. Características cuantitativas – análisis estadístico de la imagen…………… ….5 3.3. Utilizando MatLab…………………………………………………………… ..6 3.3.1. Interfaz de MatLab…………………………………………………......6 3.4. Estructura básica de instrucciones de matlab…………………………………...6 3.5. Comprender y observar…………………………………………………………6 3.6. Creando una imagen binaria……………………………………………………7 3.7. Imagen en escala de grises……………………………………………………...7 3.8. Cursor de datos………………………………………………………………….7 3.9. Umbral…………………………………………………………………………. 7 3.10. Archivos M……………………………………………………………… .. 7 3.11. Funciones………………………………………………………………….. 8 3.12. Adquisición de imágenes………………………………………………… ..8 3.13. Utilizando el toolbox de visión con matlab……………………………….. 8 3.14. Obtención de la información del dispositivo……………………………… 8 3.15. Captura de la imagen en Matlab………………………………………… .. 9 3.16. Preparación del dispositivo………………………………………………...9 4. METODOLOGIA………………………………………………………………….10 5. RESULTADOS…………………………………………………………………….11 6. CONCLUSIONES………………………………………………………………….24 7. REFERENCIAS BIBLIOGRAFICAS……………………………………………..25 2
  • 3. 1. RESUMEN Detección de patrones dentro de un entorno mediante el uso de MATLAB. Octavio Lopez L., Instituto Tecnológico de Hermosillo. Mario G. Duarte P.Instituto Tecnológico de Hermosillo. Este proyecto está enfocado a la detección de patrones mediante visión artificial utilizando un software especial llamado Matlab. Con este software fue posible el poder programar y controlar un dispositivo parecido a un carro de control remoto al cual se le montó una cámara para la detección de figuras (en este caso un cuadrado) mediante esta detección de figuras el dispositivo pudo seguir a la figura dependiendo de su posición, esta decisión tomada en base al umbralamiento y gracias al reconocimiento de patrones proporcionado por Matlab. En el proceso de la realización del proyecto se llevaron a cabo bastantes pruebas con las cuales se determinó y se definieron la mayoría de los parámetros para el funcionamiento de este, así como el que figura geométrica detectar, el área (en pixeles) de detección del cuadrado, etc. El dispositivo se introdujo en un entorno completamente blanco y fue ahí con todo exito donde detectó el color negro para así no perderse dentro se le puso de frente la figura y este lo siguió sin ningún problema. 3
  • 4. 2. INTRODUCCION. Elsiguiente reporte tiene como objetivo el de enseñar el uso del procesamiento de imágenes y reconocimiento de patrones con Matlab mediante una cámara con la cual se detecta una figura en particular y con ella un dispositivo en forma de carro mencionado previamente toma la decisión de seguirlo hacia donde este objeto de color negro se encuentre dentro de un entorno completamente blanco, ya sea hacia delante o hacia cualquiera de los dos lados. A continuación se mostrara a detalle cómo se realizó este trabajo, tanto su construcción, como su programación, las complicaciones que se tuvieron durante la realización de este, así como también después de terminado ya el dispositivo y su programación. 2.1. Problema a investigar. El Siguiente problema es el de poder construir un dispositivo de visión artificial el cual detecte patrones específicamente esquinas de una figura por medio de una cámara y como complemento el seguirlo a manera de carro hacia donde se le coloque el objeto (en este caso cuadrado). ¿Cómo se diseñará este sistema de visión? Este sistema de visión será diseñado mediante un software especializado Matlab, que cuenta con una caja de herramientas específica para este tipo de aplicaciones. ¿Por qué se construirá este sistema de visión artificial? Este sistema de visión artificial será construido con el fin de así poder guiar a un dispositivo con ruedas hacia un objeto con la finalidad de que lo reconozca, enfocándose más a la detección de patrones que hoy en la actualidad muchas empresas lo utilizan para la detección de fallos. 2.2. Importancia del estudio. La importancia que este estudio tiene hasta ahorita es de carácter estudiantil, pero de igual forma la aplicación que este estudio tiene puede abarcar amplias áreas en las cuales la visión artificial pueda ser aplicada de una forma en la cual sea de gran ayuda en muchos procesos, ya sea de producción o de búsqueda, este tipo de sistemas inteligentes hoy en la actualidad son de gran importancia en la industria, y es por tal, que es ahora el momento correcto de que esto se ponga a prueba la construcción de estos en escuelas, ya que con esto se refuerza el conocimiento que podría ser aplicado a la vida real. 2.3. Hipótesis Todo el sistema en conjunto será capaz de poder seguir algún patrón por medio de un tipo seguidor, en el cual la cámara va montada se comunica con la computadora, en la cual se monitorea y detecta hacia donde y como se mueve el carro, 4
  • 5. 3. MARCO TEORICO. Antes de empezar con la metodología se tienen que comprender ciertos términos para así entender por completo el funcionamiento y características del sistema. 1. Adquisición de la imagen: esta consiste en una videocámara web, o una cámara analógica con una interface de conexión para el procesamiento. 2. Procesamiento: esta parte consiste en una computadora personal que está dedicada al procesamiento de imagen. 3. Análisis de la imagen: Un conjunto de herramientas usadas para analizar el contenido de la imagen capturada y encontrar la posición de un objeto. 3.1. Adquisición de imágenes La adquisición de imágenes puede ser usando una cámara de video que utilice diferentes tipos de resoluciones, en esta caso de 320 x 240 pixeles, para esto se tienen dos tipos de cámaras disponibles, cámaras digitales tipo CCD o cámaras analógicas. Las cámaras digitales generalmente tienen una interfaz de conexión a la computadora por puerto USB. Requerimientos de alimentación: las cámaras CCD dan como resultado imágenes de alta calidad con poco ruido. Estas generan una señal analógica que utilizan un convertidor analógico digital y por lo tanto requieren un consumo alto de energía. El análisis de la imagen consiste en extraer información útil a partir de las imágenes capturadas. En primer lugar se deben de definir las características del objeto haciendo una búsqueda de la imagen. Estas características del objeto deben ser lo más solidas posibles. Generalmente con el fin de rastrear o identificar el objeto que se está utilizando, estas características son: A) Color B) Intensidad C) Textura o patrón D) Bordes circulares, rayas verticales o rayas rectas E) Estructura, alineación de los objetos de una manera especifica 3.2. Características cuantitativas – análisis estadístico de la imagen. A) Centro de gravedad. Punto donde los pixeles deseados pueden estar equilibrados. B) Numero de pixeles. Es un número alto de pixeles que indica la presencia de un objeto. C) BLOB, es el área de pixeles conectada. Matlab proporciona una plataforma muy fácil de usar para la adquisición y procesamiento de imágenes. Incluso los puertos serie y paralelo se pueden acceder directamente en matlab. 5
  • 6. Matlab sirve como una herramienta útil para los VCM. Proporcionan una poderosa biblioteca, integrada de muchas funciones útiles para el procesamiento de la imagen. 3.3. Utilizando Matlab. Matlab provee un conjunto de librerías que soportan areas de la ingeniería y la ciencia y la simulación. 3.3.1. Interfaz de matlab. Cuando damos doble clic en el icono de matlab podemos observar 3 ventanas: comand window, work space, y command history. Comand window. Esta ventana sirve para describir los comandos y observar los resultados. Work space. Esta ventana muestra las variables definidas dentro de la sesión abierta de matlab. Command history. En esta ventana se almacena una lista de todos los comandos que se han utilizado así como una referencia rápida de cada uno de ellos. 3.4. Estructura básica de instrucciones de matlab. Dentro de matlab, las variables pueden almacenar matrices asi como también se pueden definir para números enteros, números reales o números complejos. También las matrices pueden ser ensambladas en estructuras de arreglos de datos. 3.5. Comprender y observar Dentro de matlab la imagen se almacena en una matriz de dos dimensiones, donde dicha matriz contiene los valores de la intensidad y brillo de los pixeles. Un pixel es el punto más pequeño en una imagen que puede mostrarse en la pantalla, la resolución de la imagen es igual al número de pixeles que pueden ser mostrados en una cuadricula donde las unidades son pulgadas dentro de la pantalla del monitor. Para ver realmente los valores almacenados en la matriz conviene activar los siguientes comandos: >> im(1:10, 1:10) >> figure, imshow(50:150,50;150); 6
  • 7. 3.6. Creando una imagen binaria. Imagen binaria. Una imagen que contiene solo blanco y negro se le considera una imagen binaria. Por ejemplo: >>imbin= [0 1; 1 0] >> Figure, imshow (imbin, „initialmagnification‟, „fit‟); El negro indica intensidad 0 y el blanco indica intensidad máxima(1) 3.7. Imagen en escala de grises. Una imagen en escala de grises contiene valores de intensidades en un rango o intervalo de un cero a un máximo, incluyendo el negro y el blanco normalmente este intervalo se encuentra entre 0 y 255. Asi los valores cercanos a cero son los tonos oscuros de gris, mientras que los valores cercanos a 255 indican un gris claro. Por ejemplo: >> imgray= [0.0 0.2 0.4 0.8 1.0] >> figure, imshow (uint8(imgray); „initialmagnification‟, „fit‟); 3.8. Cursor de datos. Para ver los colores en la ventana de la figura se tiene una opción en la barra de herramientas que se llama cursor de datos, el cual al estar activado si hacemos un clic en la imagen sobre cualquier punto, podremos ver los valores de RGB por pixeles en la imagen en posiciones X, Y. 3.9. Umbral. Una imagen en escala de brises se puede convertir en una imagen binaria pasando por un proceso llamado umbral, el toolbox de procesamiento de imágenes proporciona una función. 3.10. Archivos M. Matlab proporciona una facilidad para ejecutar múltiples secuencias de comandos con una sola instrucción. Esto se hace escribiendo el nombre de un archivo extensión .m. es decir se puede crear una función en la que manualmente se escriban todos los comandos y se guarden dentro de una función en matlab.Hay que recordar que en matlab se pueden crear comentarios los cuales sirven como una herramienta útil para poner información al momento de ir ejecutando un programa, esto se logra utilizando el símbolo de %. 7
  • 8. 3.11. Funciones. Las funciones ayudan a escribir de manera organizada el cogido, con un minimo de repeticiones lógicas. Mientras escribe los archivos m, sucede a menudo que un conjunto de instrucciones comunes se utilizan dentro un programa. En lugar de escribir nuevamente el conjunto de instrucciones que se necesita dentro del programa, esto se puede simplificar definiendo una función donde tienen que pasar los datos dentro de la función, para devolver un resultado. 3.12. Adquisición de imágenes. Antes de continuar con el tema es conveniente revisar el apoyo prestado por la caja de herramientas de “ADI” de matlab. Hoy en dia la mayoría de las cámaras están disponibles con una interfaz USB. Una vez que esta instalado el controlador de la cámara la computadora detecta el dispositivo cada vez que se conecta. Por otra parte se tiene una cámara de video digital o una cámara CCD deben estar relacionados con una tarjeta de adquisición de video que hace la función de interfaz con la computadora por lo lo que el sistema operativo de Windows detecta automáticamente el dispositivo. Con el fin de ejecutar las instrucciones tradicionales de procesamiento de imágenes es necesario utilizar una cámara web USB funcional conectada a su PC. 3.13. Utiliando el toolbox de visión con matlab. Resulta de suma utilidad para implementar algoritmos de visión o adquisición de imágenes en tiempo real utilizando dispositivos simples y de bajo costo tales como las webcams. Matlab incluye el toolbox "Image Acquisition" para este fin. 3.14. Obtencion de la información del dispositivo. Imaqhwinfo Devuelve la información del hardware y software disponibles, tales como: Adaptador de video instalado, versión de Matlab, Toolbox (nombre y versión). Imaqhwinfo(‘adaptor’) Donde adaptor es el nombre del adaptador instalado, por lo general winvideo. Este comando devuelve información relacionada al adaptador. Imaqhwinfo(‘adaptor’,DeviceID) Donde DeviceID es el ID del dispositivo a utilizar obtenido con el comando anterior. Si sólo se cuenta con un dispositivo conectado el DeviceID será 1. Este comando muestra información del dispositivo conectado (cámara) . 8
  • 9. En matlab se puede verificar si la cámara web está disponible o lista. Matlab puede acceder a diferentes tipos de adaptadores de dispositivos de video. Un adaptador utiliza a matlab como un dispositivo para adquisición de imágenes A continuación se muestran los siguientes comandos: >>imaghwinfo; >>cam= imaqhwinfo; >>cam.installedAdaptors; >>dev_info= imaqhwinfo („winvideo‟, 1); 3.15.Captura de la imagen en matlab Las imágenes capturadas utilizando la herramienta vfm son entregadas alespacio de trabajo en formato RGB.Para capturar las imágenes entregadas por los drivers en el espacio de trabajode matlab se utiliza la función vfm que tiene el siguiente formatoImageCaptured=vfm(grab,n);Donde ImageCaptured es la variable que contiene la imagen RGB, y n es elnumero de ‟frames‟ a capturar, en dado caso de que sea mas de uno la variablede la imagen capturada se indexa para recuperar el ‟frame‟ necesario.De tal forma que si se quisiera capturar el ‟frame‟ actual visto por la cámarase procedería a escribir en línea de comandos: >>ImageRGB=vfm(grab,1); >>imshow(ImageRGB); 3.16. Preparacion del dispositivo Crear la estructura: cam=imaqhwinfo(‘adaptor’,DeviceID) Para poder obtener las características del dispositivo con facilidad. Por ejemplo, para obtener los formatos soportados: cam.SupportedFormats Ejecutar el comando: video=videoinput(‘adaptor’,DeviceID,’Format’) Construye un objeto de entrada de video (nexo entre el dispositivo y Matlab). Si no se especifica Format se asume el formato por defecto. 9
  • 10. Pre-Visualización. Para desplegar la pre-visualización de las imágenes a capturar ejecutar el comando: preview(video). >>Preview (video) Captura. Para capturar una imagen ejecutar: Image=getsnapshot(‘cam’) 4. METODOLOGIA. El presente proyecto de desarrollo en la ciudad de Hermosillo, en distinto lugares, se tuvieron muchos inconvenientes en este sentido ya que no se contaba con una área de trabajo totalmente adecuada para trabajar, fue necesario trabajar en distintos lugares, en aulas de clases, laboratorios y en nuestras casas. Este trabajo fue realizado bajo diseño experimental ya que dentro de este se tuvieron que manejar bastantes variables, que fueron necesarias para poder lograr el objetivo del sistema en conjunto con su cámara como los que fueron la longitud de pixeles, el área, igual en pixeles el control de giro de los motoreductores, entre otras cosas. Para la elaboración de todo el proyecto podemos dividi su metodología en 3 partes: Diseño Electronico Programacion (MatLAb y Pics) Armado del prototipo Diseño Electronico En el diseño electrónico, incluimos la comunicación bluetooth, comunicación por radio frecuencia, control, y una etapa de potencia, a continuación se entrara en detalle en cada una de estas etapas. Comunicaciones inalámbricas Un problema critico que se tuvo para el diseño del carrito para que fuera inalámbrico, fue la transmicion de imágenes del prototitpo hacia una computadora de manera inalámbrica. Se consideraron posibles alternativas, se evaluaron su factibilida y/o compatibilidad con Matlab y se decidio por instalar un kit inalámbrico de transmicion de imágenes por radio frecuencia, debido al 10
  • 11. bajo costo y a la falta de tiempo para investigar otros protocolos de comunicación. Los componentes que conforman el kit son los siguientes: Video Camara Receptor de video con antena Adaptador RCA a USB Cable AV(RCA) La cámara consta de 3 cables, dos de ellos son para transmitir audio y video los cuales en nuestro caso se quedaron desconectados, ya que la transmicion se realiza por medio de una antena ya integrada a la cámara. Un tercer cable es para alimentar a la cámara con una batería de 9 volts. A continuación se muestra una imagen de la cámara: La señal transmitida desde de la cámara por medio de la antena integrada a la camapara es capturada por un receptor el cual posee salidas RCA de video para ser vistas en alguna pantalla, DVD etc. A continuaciokn se muestra una imagen de este equipo: 11
  • 12. Para poder trabajar con las imágenes para su posterior procesamiento, la salida de video del reciber se conecto a un adapatador USB que convierte la señal de video RCA a USB (digital). Con este ultimo paso tenemos comunicación inalámbrica entre la cámara y una computadora, listo para procesar imágenes en MatLab tomadas desde el prototipo y transmitidas inalambricamente. A continuación se muestra una imagen de dicho adaptador. 12
  • 13. Otro aspecto muy importante es la comunicación inalámbrica para el control del prototipo (carrito). Una vez que se han procesado las imágenes se genera un resultado de dicho proceso y esta información se enviara inalámbricamente al dispositivo. Analizando los toolbox de Matlab el dispositivo mas factible es la comunicación bluetooth, ya que Matlab cuenta con el toolbox Instrument Control Toolbox, en el apartado de programación se entrara en detalle. El modulo Bluetooth cuenta con salidas y entradas seriales en niveles TTL, con esto nos permitio recibir datos desde una computadora y comunicarlo con un microcontrolador mediante el protocolo de comunicación serial RS-232. De esta manera contamos con la comunicación inalámbrica desde la computadora hacia el prototipo para enviarle la información necesaria para el control de los motores. A continuación se muestra una imagen del modulo bluetooth y su diagrama de conexionamiento. 13
  • 14. En la imagen anterior se puede observar la conexión que se realizo entre el modulo bluetooth y el microcontrolador para la transmicion de datos seriales. En el apartado de etapa de potencia se ablara sobre el LM293 y su funcionamiento, y en el apartado de programación de microcontroladores se ablara sobre el por que se conectaron de esta manera. Control El microcontrolador realiza el control de los motores, utilizando los pines RB0, RB1, RB2, RB3, utilizando RB0 y RB1 para controlar el sentido de giro de un motor, sacando por estos pines conbinaciones (0 0, 0 1, 1 0, 1 1) y de igual manera para el segundo motor utilizando los pines RB2 y RB3. De esta manera se logro controlar los dos motores. En el apartado de la etapa de potencia se explica a detalle las conexiones del LM293. Etapa de potencia Para suministrar un voltaje de 5 volts a los motores de corriente directa, se utilizo el driver LM293, este driver cuenta con dos canales repartidos en 2 entradas y 2 salidas por canal, además de los enables que se alimentan directamente a 5 volts para activar los canales. Los pines RB0 y RB1 se conectaron al canal 1, de tal manera que cuando el RB0=0 y RB1 el motor gira en un sentido al 14
  • 15. cambiar los valores a RB0=1 y RB=0 el motor cambia de giro. Se realiza exatamente lo mismo para el segundo motor. La alimentación de todo el circuito se realizo con dos baterías de 3.6V a 700mA conectadas en seria para aumentar el torque y pasando por una etapa de regulación de voltaje con un 7805 para mantener un voltaje de 5volts estable.De esta manera tenemos la potencia suficiente para poder hacer girar los motores con el suficiente torque. Programacion (MatLab y PICS) MatLab Una vez teniendo el circuito electrónico bien definido con todos las comunicacione bien definidas se procedio a la programación de los componentes necesarios. El programa principal, el del control del prototipo y el procesado de las imágenes se realizo en Matlab. Se utilizo una interface grafica para la programación, a continuación se muestra una imagen de dicha interface grafica. El programa consta de 3 botones principales, Encender Camara, Iniciar Procesamiento y Apagar Camara, como su nombre lo indica estos botones realizan las funciones de encender la cámara, iniciar el procesamiento de imágenes y apagar la cámara. Cuenta con dos áreas de graficacion una para mostrar las imágenes a color (formato RGB24_320*240), y otra área mas pequeña donde se grafica la imagen pero binarizada por un umbral, este umbral se controla por medio de un slider que se encuentra arriba del área de graficacion. Cuenta con un edit text para indicar los movimientos que deben de tener los motores, además de 3 edit text para indicar las coordenadas del centroide de la figura y para mostrar el área del objeto. Por ultimo cuenta con un ultimo edit text para indicar el 15
  • 16. estado del carrito, si esta buscando el objetivo o si ya lo detecto. Además cuenta con un control manual, para posicionar el carrito de manera manual en la posición deseada incial, para después iniciar el procesamiento y desactivando el control manual y activando el control automatico. Lo anterior descrito es una descripción breve de la interface grafica, ahora pasaremos a la forma de programación y el funcionamiento del programa. Cuando se corre el programa lo primero que aparece es la interface grafica, como se mostro en la imagen anterior, al mismo tiempo también habilita la comunicación con el bluetooh utilizando el bluetooth de la computadora, con la instrucción blue=Bluetooth(„nombre_dispositivo‟,1) donde el 1 representa el canal de comunicación, y con la instrucion fopen(„nombre_dispositivo) para abrir la comunicación. Cuando se presiona el botón iniciar procesamiento lo primero que realiza lo que realiza el programa es entrar en un siglo infinito y tomar una foto y mostrarla en un axes principal, después la procesa hasta obtener una imagen binarizada con un umbral regulado por el usurario mediante un slider, después se la da un procesamiento para eliminar pixeles exedentes o ruido, primero dilatando la imagen (agregación de pixeles en la frontera) y después erosionándola (eliminación de pixeles en la frontera), una vez lista la imagen se realiza un barrido de la imagen recorriendo cada pixel de la imagen por columnas y filas, y checando en el barrido cuales pixeles están en blanco, cuando encuentra un pixel en blanco pasa a una serie de instrucciones para determinar si es una esquina especifica de un cuadrado. Por ejemplo para detectar la esquina superior izquierda, en ese pixel que se encuentra verefica que el pixel de arriba este en negro, el de la derecha en blanco, el de abajo en blando y el de la izquierda en negro, de esta manera se garantiza que ese pixel es la esquina superior esquierda y el mismo procedimiento se realiza para las cuatro esquinas. Cuando detecta que una esquina esta presente, pone en uno una variable para indicar que se detecto la esquina, al final de aver pasado por el chequeo de las 4 esquinas, revisa las variables, y si las 4 valen 1, quiere desir que se detectaron 4 esquinas, entonces envía a un edit que se detecto el objetivo, si alguna de las variables no vale uno, aparece en ese mismo edit buscando objetivo y no realiza ninguna acción. En el caso que detecte satisfactoriamente las cuatro esquinas del objetivo pasa a una serie de funciones, primeramente para calcular el centroide del objetivo, graficarlo y calcular el área del objetivo y mostralo en los edit text. Como nada mas importa el control del carrito hacia a la derecha y hacia la izquierda se tomo la coordenada del centroide en y, y entra a una serie de condiciones donde se evaluava el valor de la coordenada y si era menor o igual a 120(pixeles) pasa a escribir un dato por el bluetooth para hacer girar el carrito hacia la izquierda, de no cumplir esta condición pasa a otra condición, si la coordenada es mayor o igual a 200 pasa a escribir en el bluetooth un dato para hacer girar los motores hacia la derecha, de no cumplir esta condición, pasa a revisar si esta dentro del rango 120-200 de ser haci quiere desir que el centroide esta en el centro de la imagen, y pasa a revisar el tamaño de la imagen si el área de la imagen esta por arriba de un set point, quiere desir que ya esta suficientemente cerca, por lo que escribe un sero en puerto bluetooth para apagar los motores, si es menor que el valor del set point escribe en el bluetooth un dato para indicar que 16
  • 17. avanze el carrito, por lo tanto escribe un dato en el bluetooth para hacer que avanze el carrito, dependiento de cual condición alla sido verdadera pasa a escribir en un edit text el sentido de giro de los motores. Después de todo esto se inicializan las variables en 0, que se usaron para indicar que se detecto una esquina. Habiendo echo esto termina una corrida completa del ciclo infinito y comienza otra vez desde el inicio. Los datos que se mandaron desde matlab por el bluetooth hacia el microcontrolador van en una secuenca determinada para que lo único que realice el microcontrolador es pasar el dato al puerto B. a continuación se muestra el programa completo. function varargout = Prueba_3(varargin) % PRUEBA_3 MATLAB code for Prueba_3.fig % PRUEBA_3, by itself, creates a new PRUEBA_3 or raises the existing % singleton*. % % H = PRUEBA_3 returns the handle to a new PRUEBA_3 or the handle to % the existing singleton*. % % PRUEBA_3('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in PRUEBA_3.M with the given input arguments. % % PRUEBA_3('Property','Value',...) creates a new PRUEBA_3 or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before Prueba_3_OpeningFcn gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to Prueba_3_OpeningFcn via varargin. % % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)". % % See also: GUIDE, GUIDATA, GUIHANDLES % Edit the above text to modify the response to help Prueba_3 % Last Modified by GUIDE v2.5 10-Jun-2012 17:29:06 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @Prueba_3_OpeningFcn, ... 'gui_OutputFcn', @Prueba_3_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout 17
  • 18. [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end % End initialization code - DO NOT EDIT % --- Executes just before Prueba_3 is made visible. function Prueba_3_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to Prueba_3 (see VARARGIN) % Choose default command line output for Prueba_3 handles.output = hObject; % Update handles structure guidata(hObject, handles); % UIWAIT makes Prueba_3 wait for user response (see UIRESUME) % uiwait(handles.figure1); fondo1=imread('vision_1.jpg'); %carga una imagen de fondo imshow(fondo1,'parent',handles.axes1); % y la direcciona a un axes fondo2=imread('vision_2.jpg'); %carga una segunda imagen de fondo imshow(fondo2,'parent',handles.axes2); % y la direcciona a otra axes %bt=Bluetooth('Mario-Bluetooth',1); % crea el objeto de bluetooth %fopen(bt); % y abre la comunicacion %handles.bt=bt; guidata(hObject, handles); % --- Outputs from this function are returned to the command line. function varargout = Prueba_3_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Get default command line output from handles structure varargout{1} = handles.output; % --- Executes on button press in encender_camara. function encender_camara_Callback(hObject, eventdata, handles) % hObject handle to encender_camara (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) 18
  • 19. vid=videoinput('winvideo',1,'YUY2_320x240'); % configuracion de la web- cam handles.vid=vid; % redireccionamiento de la variable triggerconfig(vid,'manual'); % activacion de la camara manualmente set(vid,'FramesPerTrigger',1); % solo tomara una foto set(vid,'TriggerRepeat',Inf); set(vid,'ReturnedColorSpace','rgb'); % la imagen estara en formato rgb start(vid); %inicializa la camara set(gcf,'DoubleBuffer','on','renderer','painters'); guidata(hObject, handles); % --- Executes on button press in pushbutton2. function pushbutton2_Callback(hObject, eventdata, handles) % hObject handle to pushbutton2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) while 1 trigger(handles.vid); %prepara la camara im_rgb=getdata(handles.vid); %toma una fotogradia imagesc(im_rgb,'parent',handles.axes1); % y la manda a un axes im_gray=rgb2gray(im_rgb); %convierte la imagen de color a escalas de grises val_umbral=get(handles.slider1,'value'); % toma el valor de umbralamiento im_bin=im_gray<=val_umbral; %para binarizarla EE=strel('square',20); % creacion de constantes para el tratamiento SE=strel('square',20); % de imagenes im_dilatada=imdilate(im_bin,SE); % dilata la imagen im_erosionada=imerode(im_dilatada,EE); % y despues la erosiona imshow(im_erosionada,'parent',handles.axes2); %y por ultimo la direcciona a un axes a=0; % variable que se utilizan para la deteccion de las s=0; % esquinas, tienen que comenzar en cero cuando procesa d=0; % cada imagen f=0; [m,n]=size(im_erosionada); %se determina el tamaño de la matris de la imagen 19
  • 20. for i=10:(m-20) %realiza un barrido de toda la imagen for j=10:(n-20) %pixel por pixel para determinar si es if im_erosionada(i,j)==1 % blanco if im_erosionada(i-1,j)==1 && im_erosionada(i-1,j+1)==1 &&.... % en el caso que sea blanco estas lineas im_erosionada(i,j+1)==1 && im_erosionada(i+1,j+1)==1 &&.... % determinan si esta presente la esquina superior im_erosionada(i+1,j)==1 && im_erosionada(i+1,j-1)==1 &&.... % izquierda im_erosionada(i,j-1)==1 && im_erosionada(i-1,j-1)==1 &&.... im_erosionada(i-3,j)==0 && im_erosionada(i-3,j-3)==0 &&.... im_erosionada(i,j-3)==0 a=1; % de ser asi pone un uno en la variable de referencia %q=cat(2,j,i); % forma un vector con las coordenadas del pixel %hold on; % congela la imagen %plot(q(:,1), q(:,2), 'r*'); %para poder graficar la deteccion de la esquina %hold off; end if im_erosionada(i-1,j)==1 && im_erosionada(i-1,j+1)==1 &&.... % pasa a revisar si esta preseente la esquina superior derecha im_erosionada(i,j+1)==1 && im_erosionada(i+1,j+1)==1 &&.... % y se realiza el mismo procedimiento anterior im_erosionada(i+1,j)==1 && im_erosionada(i+1,j-1)==1 &&.... im_erosionada(i,j-1)==1 && im_erosionada(i-1,j-1)==1 &&.... im_erosionada(i-3,j)==0 && im_erosionada(i-3,j+3)==0 &&.... im_erosionada(i,j+3)==0 s=1; %w=cat(2,j,i); %hold on; %plot(w(:,1), w(:,2), 'b*'); %hold off; end if im_erosionada(i-1,j)==1 && im_erosionada(i-1,j+1)==1 &&.... % pasa a revisar si esta presente la esquina inferior derecha im_erosionada(i,j+1)==1 && im_erosionada(i+1,j+1)==1 &&.... % y se realiza el mismo procedimiento anterior im_erosionada(i+1,j)==1 && im_erosionada(i+1,j-1)==1 &&.... im_erosionada(i,j-1)==1 && im_erosionada(i-1,j-1)==1 &&.... im_erosionada(i-3,j+3)==0 && im_erosionada(i,j+3)==0 &&.... 20
  • 21. im_erosionada(i+3,j)==0 d=1; %e=cat(2,j,i); %hold on; %plot(e(:,1), e(:,2), 'g*'); %hold off; end if im_erosionada(i-1,j)==1 && im_erosionada(i-1,j+1)==1 &&.... % pasa a revisar si esta presenta la esquina inferior izquierda im_erosionada(i,j+1)==1 && im_erosionada(i+1,j+1)==1 &&.... % y realiza el mismo procedimiento anteior im_erosionada(i+1,j)==1 && im_erosionada(i+1,j-1)==1 &&.... im_erosionada(i,j-1)==1 && im_erosionada(i-1,j-1)==1 &&.... im_erosionada(i-3,j-3)==0 && im_erosionada(i,j-3)==0 &&.... im_erosionada(i+3,j)==0 f=1; %r=cat(2,j,i); %hold on; %plot(r(:,1), r(:,2), 'y*'); %hold off; end end end end if a==1 && s==1 && d==1 && f==1 % revisa si estan detectadas las 4 esquinas set(handles.edit1,'string','Objectivo Detectado'); % de ser asi marca que se detecto el objetivo cx=0;cy=0;t=0; % se definen variables para el centroide y el area for y=1:(m-20) % realiza un barrido de la imagen pixel por pixel for u=1:(n-20) % para ver si esta en blanco de ser asi if im_erosionada(y,u)==1 % va calculando el centroide y sumando el area en pixeles t=t+1; cx=cx+y; cy=cy+u; end end end set(handles.edit2,'string',cx/t); % muestra los valores de las coordenadas en x set(handles.edit3,'string',cy/t); % y en y q=cat(2,(cy/t),(cx/t)); % forma un vector que contiene las coordenadas del centroide hold (handles.axes1); % y congela la imagen 21
  • 22. plot(q(:,1), q(:,2), 'r*','parent',handles.axes1); % para graficarlo hold (handles.axes1); set(handles.edit4,'string',t); % muestra el area del objeto if (cy/t)<=120 % si la cordenada en x esta del centroide esta mas a la izquierda set(handles.edit5,'string','CW'); % esta mas a la izqueirda muestra el sentido de giro de los motores fwrite(handles.bt,(9)); % y manda el valor binario por bluetooth para hacerlos girar guidata(hObject, handles); end if (cy/t)>=200 % si la coordeana en x del centroide esta mas a la derecha set(handles.edit5,'string','CCW'); % muestra el sentido de giro de los motores fwrite(handles.bt,(6)); % y manda el dato por el bluetooth para que giren en ese sentido guidata(hObject, handles); end if (cy/t)>=120 && (cy/t)<=200 % define el centro de la imagen donde debe de estar para acer if t<=50000 % girar los motores para delante o apagarlos si alcanzo el objetivo set(handles.edit5,'string','Avanza'); % si el area del objeto es menor a 50000 pixeles avanza fwrite(handles.bt,(10)); % manda los datos para ke avanse guidata(hObject, handles); else set(handles.edit5,'string','Alto'); % si el area es mayor el carrito se para fwrite(handles.bt,(0)); % y manda los datos para apagar los motores guidata(hObject, handles); end end else set(handles.edit1,'string','Buscando Objetivo'); % estas lineas restantes se ejecutan si no se ha detectado el objeto fwrite(handles.bt,(9)); % apaga los motores guidata(hObject, handles); set(handles.edit5,'string','Motores Apagados'); % e inicializa los edit en cero set(handles.edit2,'string',0); set(handles.edit3,'string',0); set(handles.edit4,'string',0); end guidata(hObject, handles); flushdata(handles.vid); 22
  • 23. end % --- Executes on button press in apagar_camara. function apagar_camara_Callback(hObject, eventdata, handles) % hObject handle to apagar_camara (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) fclose(handles.bt); % cierra la comunicacion bluetooth stop(handles.vid); % cierra la comunicacion de video % --- Executes on slider movement. function slider1_Callback(hObject, eventdata, handles) % hObject handle to slider1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'Value') returns position of slider % get(hObject,'Min') and get(hObject,'Max') to determine range of slider % --- Executes during object creation, after setting all properties. function slider1_CreateFcn(hObject, eventdata, handles) % hObject handle to slider1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: slider controls usually have a light gray background. if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 .9 .9]); end function edit1_Callback(hObject, eventdata, handles) % hObject handle to edit1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of edit1 as text % str2double(get(hObject,'String')) returns contents of edit1 as a double % --- Executes during object creation, after setting all properties. function edit1_CreateFcn(hObject, eventdata, handles) % hObject handle to edit1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called 23
  • 24. % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit2_Callback(hObject, eventdata, handles) % hObject handle to edit2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of edit2 as text % str2double(get(hObject,'String')) returns contents of edit2 as a double % --- Executes during object creation, after setting all properties. function edit2_CreateFcn(hObject, eventdata, handles) % hObject handle to edit2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit3_Callback(hObject, eventdata, handles) % hObject handle to edit3 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of edit3 as text % str2double(get(hObject,'String')) returns contents of edit3 as a double % --- Executes during object creation, after setting all properties. function edit3_CreateFcn(hObject, eventdata, handles) % hObject handle to edit3 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. 24
  • 25. % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit4_Callback(hObject, eventdata, handles) % hObject handle to edit2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of edit2 as text % str2double(get(hObject,'String')) returns contents of edit2 as a double % --- Executes during object creation, after setting all properties. function edit4_CreateFcn(hObject, eventdata, handles) % hObject handle to edit2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit5_Callback(hObject, eventdata, handles) % hObject handle to edit5 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of edit5 as text % str2double(get(hObject,'String')) returns contents of edit5 as a double % --- Executes during object creation, after setting all properties. function edit5_CreateFcn(hObject, eventdata, handles) % hObject handle to edit5 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. 25
  • 26. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit6_Callback(hObject, eventdata, handles) % hObject handle to edit6 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of edit6 as text % str2double(get(hObject,'String')) returns contents of edit6 as a double % --- Executes during object creation, after setting all properties. function edit6_CreateFcn(hObject, eventdata, handles) % hObject handle to edit6 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit7_Callback(hObject, eventdata, handles) % hObject handle to edit7 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of edit7 as text % str2double(get(hObject,'String')) returns contents of edit7 as a double % --- Executes during object creation, after setting all properties. function edit7_CreateFcn(hObject, eventdata, handles) % hObject handle to edit7 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) 26
  • 27. set(hObject,'BackgroundColor','white'); end function edit8_Callback(hObject, eventdata, handles) % hObject handle to edit8 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of edit8 as text % str2double(get(hObject,'String')) returns contents of edit8 as a double % --- Executes during object creation, after setting all properties. function edit8_CreateFcn(hObject, eventdata, handles) % hObject handle to edit8 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit9_Callback(hObject, eventdata, handles) % hObject handle to edit1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of edit1 as text % str2double(get(hObject,'String')) returns contents of edit1 as a double % --- Executes during object creation, after setting all properties. function edit9_CreateFcn(hObject, eventdata, handles) % hObject handle to edit1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end 27
  • 28. function edit12_Callback(hObject, eventdata, handles) % hObject handle to edit3 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of edit3 as text % str2double(get(hObject,'String')) returns contents of edit3 as a double % --- Executes during object creation, after setting all properties. function edit12_CreateFcn(hObject, eventdata, handles) % hObject handle to edit3 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function edit13_Callback(hObject, eventdata, handles) % hObject handle to edit2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of edit2 as text % str2double(get(hObject,'String')) returns contents of edit2 as a double % --- Executes during object creation, after setting all properties. function edit13_CreateFcn(hObject, eventdata, handles) % hObject handle to edit2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end 28
  • 29. % --- Executes on button press in avanza. function avanza_Callback(hObject, eventdata, handles) % hObject handle to avanza (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) fwrite(handles.bt,(10)); guidata(hObject, handles); % --- Executes on button press in giro_derecha. function giro_derecha_Callback(hObject, eventdata, handles) % hObject handle to giro_derecha (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) fwrite(handles.bt,(6)); %4 guidata(hObject, handles); % --- Executes on button press in giro_izquierda. function giro_izquierda_Callback(hObject, eventdata, handles) % hObject handle to giro_izquierda (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) fwrite(handles.bt,(9)); %1 guidata(hObject, handles); % --- Executes on button press in retrocede. function retrocede_Callback(hObject, eventdata, handles) % hObject handle to retrocede (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) fwrite(handles.bt,(5)); guidata(hObject, handles); % --- Executes on button press in alto. function alto_Callback(hObject, eventdata, handles) % hObject handle to alto (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) fwrite(handles.bt,(0)); guidata(hObject, handles); PICS El microcontrolador que se utilizo fue el pic16f628a, la palabra de configuración que se utilizo esta definida para que funcione con el oscilador externo y desactivando el MCLR. La única función que tiene el microcontrolador es leer el dato que manda matlab por el bluetooth y sacarlo al puerto tal cual, como lo manda MatLab, dejándole todo el control del prototipo a Matlab. A continuación se muestra la programación que se utilizo en lenguaje basic. 29
  • 30. '**************************************************************** '* Name : UNTITLED.BAS * '* Author : [select VIEW...EDITOR OPTIONS] * '* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] * '* : All Rights Reserved * '* Date : 6/9/2012 * '* Version : 1.0 * '* Notes : * '* : * '**************************************************************** @ DEVICE PIC16F628A, INTRC_OSC_NOCLKOUT @ DEVICE PIC16F628A, MCLR_OFF INCLUDE "MODEDEFS.BAS" CMCON=7 DAT VAR BYTE TRISA=$0F TRISB=$00 PORTB=0 INICIO: SERIN PORTA.0,2,DAt PORTB=DAT PAUSEUS 100 30
  • 31. GOTO INICIO END Armado del Prototipo 5. RESULTADOS. Al final en este proyecto se llego al objetivo esperado, lo que desde un principio se planteo, se logro que el dispositivo pudiera seguir correctamente a una figura, por medio de la cámara El propósito de utilizar un entorno de color blanco es para que el dispositivo no se pierda e intente buscar algún otro objeto que se le parezca o trate de imitar a la figura que realmente debería de seguir, ya que es un problema si este se pierde e intenta seguir otro objeto, ya que se guía solo por figuras. 31
  • 32. 6. CONCLUSIONES. Al finalizar este proyecto se pudo llegar a la conclusión de que el poder diseñar un sistema de visión artificial que reconozca patrones, tiene muchas aplicaciones no nomas de forma didáctica si no fuera en la industria donde realmente se utilizan este tipo de sistemas para la detección de fallas en algún proceso o maquinado. Un problema muy particular y especifico que se nos presento fue en la detecccion de las cuatro esquinas, ya que la función que se desarrollo funciona para cuadrados estrictamente perfectos, cosa que con la resolución de la cámara y la calidad en la forma del objeto a seguir no se pudo lograr ya que se perdían las esquinas por instantes de tiempos muy pequeños debido a diferentes circunstancias como el cambio en la luminosidad del entorno entre otras cosas, este problema se soluciono agregando ala parte de código donde se detectan las esquinas chequear los pixeles que se encuentran a todas las direcciones arriba, abajo, derecha, izquierda, diagonales, y también dándole una tolerancia entre 1 y 5 pixeles para la detección de la esquina (esto se puede ver en los comentarios del programa). Otro punto critico fue la rapidez con que el carrito giraba ya que inicialmente el dato que mandaba MatLab al microcontrolador estaba diseñado que para el momento de girar un motor encendiera en un sentido y el otro en sentido contrario esto proboco una respuesta demasiado rápida, tan rápida que el carrito perdia el objeto, la solución fue girar nada mas un motor para dar la vuelta un poco mas lento y de esta manera no perder el objetivo. Para lograr una mayor respuesta del sistema se necesita una unidad de procesamiento muy rápida ya que todo el proceso que realiza es tardado pero resulto ser dentro de lo factible ya que el carrito no perdió el objeto debido al retardo en procesar las imágenes, por ejemplo supongamos que se detecta que el objeto buscado esta a la derecha entonces se manda el dato para que gire a la derecha, y vuelve a procesar otra imagen para determinar la posición actual del objeto, en este lapso de tiempo de ser muy largo, pudiera ser que ya se alla perdido el objeto ya sigue girando a la derecha. Afortunadamente no tuvimos problemas con esto ya que el procesamiento se realizo moderadamente rápido de manera que no perdiera el objetivo. Como punto de vista personal del equipo, sentimos que hace falta mas apoyo por parte de la institución, para la realización de proyectos, ya que mucha veces no contamos con las herramientas necesarias para la construcción y/o pruebas, como taladros, tornos fresas, fuentes de alto amperaje y voltaje. Una buena opción es que estuviera siempre un área destinada a la elaboración de proyectos y con la herramienta almenos minima para poder presentar proyectos de mayor calidad ya que al no contar con herramienta adecuada o necesaria es una gran limitante en el diseño mecanico o en la realización de pruebas de los circuitos electrónicos. 32
  • 33. Un error que se cometio fue al momento de realizar las pruebas preliminares en la elaboración del programa, ya que primero se realizo el diseño electrónico, después toda la programación y por ultimo la construcción del prototipo. Esto nos afecto en tiempo, ya que se perdió mucho tiempo por que las pruebas que se realizaban durante la elaboración del programa eran con una cartulina y un cuadrado de color negro, el impacto fue que no obteníamos como el sistema se comportaría realmente, lo ideal ubiera sido tener el diseño electrónico, el prototipo y por ultimo hacer todo la programación e ir haciendo las pruebas necesarias con el prototipo ya montado. MatLab es un entorno de trabajo grandísimo, con demasiadas herramientas para la elaboración de cualquier proyecto, por lo que nos dimos cuenta la gran variedad y utilidad que tienen todos los Toolbox de visión artificial de matlab, y otros áreas, ya que fue de bastante ayuda en la elaboración de este proyecto. Como recomendaciones para futuras investigaciones o construcciones de proyectos de este tipo, recomendamos investigar sobre Computer Vision System Toolbox, que es una caja de herramienta especialmente diseñada para sistemas de visión artificial no de Adquisicion y Procesamiento. Si se realizaron pruebas o experimentos sobre este toolbox pero por falta de tiempo y dado de que no era el objetivo principal se dejo por un lado esta manera de procesar la información, pero seria bueno realizar pruebas con este toolbox. 7. REFERENCIAS BIBLIOGRAFICAS. Apuntes del cuaderno de clases de “Sistemas Inteligentes”. Eduarto Chavez Mendiola. Visión por Computador utilizando MatLAB y el Toolbox de Procesamiento Digital de Imágenes. Erik Valdemar Cuevas Jimenez, Daniel Zaldivar Navarro. Procesamiento de imágenes con MatLAB. http://lonely113.blogspot.com Segmentación de colores con MatLAB. Dr. Alejandro Aceves. Metodología de la investigación. Roberto Hernandez Sampieri. 33