Está en la página 1de 127

INSTITUTO TECNOLÓGICO SUPERIOR

DE HUAUCHINANGO

“Prototipo de un brazo robótico de detección y


reconocimiento de formas o colores con visión
artificial”

INGENIERÍA
MECATRÓNICA

P R E S E N T A :

RENÉ GUERRERO PAREDES

J10312013

HUAUCHINANGO, PUE. A 08 SEPTIEMBE DE 2015


INSTITUTO TECNOLÓGICO SUPERIOR
DE HUAUCHINANGO

“Prototipo de un brazo robótico de detección y


reconocimiento de formas o colores con visión
artificial”

INGENIERÍA
MECATRÓNICA

P R E S E N T A :

RENÉ GUERRERO PAREDES

J10312013

HUAUCHINANGO, PUE. A 08 SEPTIEMBE DE 2015


Resumen

En la actualidad se dispone de la tecnología adecuada para la fabricación de robots que


simulen el comportamiento humano; para que estos realicen adecuadamente su trabajo
es necesario lograr una adecuada interacción entre estos y su entorno, esta interacción
las personas la realizamos a través de los sentidos; siendo el sentido de la vista el más
importante, ya que con este sentido logramos reconocer y localizar los objetos que hay
a nuestro alrededor.

El presente trabajo describe la forma en que se elaboró una aproximación al


sentido de la vista a través de la visión artificial mediante la implementación de un
brazo robot para el reconocimiento y detección de colores o formas utilizando MatLab
y Arduino.

Para el reconocimiento y detección de formas o colores se desarrolló un


algoritmo en Matlab.

El movimiento del brazo robótico se realizó mediante la comunicación entre


MatLab y Arduino.

Se ha obtenido un sistema capaz de reconocer objetos de acuerdo a su forma y


color.

i
Abstract

In the actually it has the technology to manufacture robots that simulate human
behavior; so that they do their job properly is a need for proper interaction between
them and their environment, this interaction people perform through the senses; still
the sense of sight the most important, because with this sense we recognize ant locate
that are around us.

The present work describes the way in which it had been prepared an
approximation to the sense of sight through the artificial vision through the
implementation of a robot arm for the detection and recognition of colors or shapes
using MatLab and Arduino.

For the detection and recognition of shapes or colors was developed an


algorithm in MatLab.

The movement of the robotic arm is performed by the communication between


MatLab and Arduino.

It has obtained a system capable recognizing objects according to their shape


and color.

ii
Dedicatoria

El presente trabajo lo dedico a mi abuelo Lucio, a mis hermanos Estrella y Jordy; y


finalmente también a mi gran y eterno amor Liliana, gracias por todos los cuidados y
bellos momentos que conmigo compartieron; realmente no sé dónde se encuentren en
estos momentos pero confió ciegamente en que volveremos a estar juntos.

iii
Agradecimientos

En primer lugar le agradezco a Dios, por estar conmigo en cada momento de mi vida
a pesar de mi alejamiento de toda religión, gracias por ponerme en el juego de este
mundo tan loco.

A mi padrino Silverio por su apoyo para iniciar mis estudios.

A mi asesor Dr. Gregorio, por su gran apoyo durante mi formación académica


y asesoramiento en la realización de este trabajo.

A mi padre y su familia, la mayor parte de mi vida la he pasado a su lado y a


su manera me han apoyado.

A mi madre y hermanas, aunque hace poco las conocí se han vuelto un gran
apoyo y felicidad en mi vida.

A mis amigos, por estar a mi lado cuando más los he necesitado.

A mis maestros, que compartieron conmigo sus conocimientos, gracias a


ustedes ahora ignoro menos y estoy más cerca de la verdad.

A mis compañeros de clase, de todos aprendí algo.

iv
Índice de contenido

Página

Resumen i
Abstract ii
Dedicatoria iii
Agradecimientos iv
Antecedentes xii

Capítulo I. Introducción
1.1 Problema a resolver 1
1.2 Justificación 1
1.3 Objetivo general 2
1.4 Objetivos específicos 2
1.5 Aportaciones del trabajo 2
1.6 Estructura del trabajo 3

Capítulo II. Marco Teórico


2.1 Luz, ojo humano y color 4
2.2 Visión artificial 11
2.2.1 Componentes de un sistema de visión artificial 13
2.2.1.1 Iluminación 13
2.2.1.2 Cámara 19
2.2.1.3 Sistema de procesamiento 20
2.2.1.4 Actuadores externos 21
2.2.2 Procesamiento digital de imágenes 21
2.2.2.1 Captación o adquisición de imagen 21
2.2.2.2 Preprocesamiento 27
2.2.2.3 Segmentación 31
2.2.2.4 Representación y descripción 35
2.2.2.5 Reconocimiento e interpretación 37
2.3 MatLab 37

v
2.4 Arduino 44
2.5 Comunicación entre MatLab y Arduino 48
2.6 Servomotor 51

Capítulo III. Marco Metodológico


3.1 Desarrollo de algoritmo para el reconocimiento de forma
53
y color en imágenes almacenadas en la PC
3.2 Diseño y elaboración del brazo robótico 56
3.3 Desarrollo de Interfaz Gráfica de Usuario en MatLab para
la manipulación del brazo robótico y el reconocimiento de
forma o color a través de una webcam 59

Capítulo IV. Análisis de Resultados


4.1 Propiedades obtenidas de los objetos presentes en las
imágenes de prueba 67
4.2 Propiedades obtenidas de las figuras de prueba 68

69
Conclusiones

70
Recomendaciones

71
Referencias

Anexos
Anexo A: Imágenes de prueba 76
Anexo B: Función “ColorRGB” 79
Anexo C: Función “Propiedades” 80
Anexo D: Función “DeteccionForma” 81
Anexo E: Script “DeteccionFunciones” 82
Anexo F: Interfaz Gráfica de Usuario “ColoryForma” 86
Anexo G: Figuras de prueba 92
Anexo H: Interfaz Gráfica de Usuario en MatLab 94

vi
Índice de figuras

Página

Figura 1 Pájaros de Herón xiii


Figura 2 Gallo de Estrasburgo xiv
Figura 3 Pato de Vaucanson xiv
Figura 4 Telar de Jacquard xv
Figura 5 Telemanipuladores de Goertz xvi
Figura 6 Handy-man de Mosher xvi
Figura 7 Primer robot industrial xvii
Figura 8. Robot de accionamiento eléctrico xviii
Figura 1.1 Problema a resolver 1
Figura 2.1 Partes del ojo humano 4
Figura 2.2 Fotoreceptores de la retina 5
Figura 2.3 Espectrograma de la luz visible e invisible 5
Figura 2.4 Colores primarios 6
Figura 2.5 Colores secundarios 6
Figura 2.6 Modelo RGB 8
Figura 2.7 Modelo YIQ 8
Figura 2.8 Modelo YCbCr 9
Figura 2.9 Modelo HSI 10
Figura 2.10 Modelo HSV 10
Figura 2.11 Modelo HSL 11
Figura 2.12 Componentes de un sistema de visión artificial 13
Figura 2.13 Iluminación frontal 14
Figura 2.14 Iluminación lateral 14
Figura 2.15 Iluminación por campo oscuro 15
Figura 2.16 Iluminación a contra luz 16
Figura 2.17 Iluminación axial difusa 16
Figura 2.18 Iluminación difusa tipo domo 17
Figura 2.19 Iluminación por láser 18
Figura 2.20 Iluminación estructurada 18

vii
Figura 2.21 Imagen vectorial 23
Figura 2.22 Acercamiento de imagen vectorial 23
Figura 2.23 Imagen ráster 23
Figura 2.24 Acercamiento de imagen ráster 23
Figura 2.25 Imagen RGB 24
Figura 2.26 Imagen indexada 25
Figura 2.27 Imagen en escala de grises 25
Figura 2.28 Imagen binaria 26
Figura 2.29 Tipos de ruido en una imagen 28
Figura 2.30 Ejemplos de transformaciones aritmético-lógicas 29
Figura 2.31 Transformaciones geométricas 29
Figura 2.32 Aumento y reducción de contraste 30
Figura 2.33 Ecualizado del histograma de una imagen 31
Figura 2.34 Ejemplo de segmentación por umbral 33
Figura 2.35 Ejemplo de segmentación por contornos 33
Figura 2.36 Ejemplo de segmentación basada en regiones 33
Figura 2.37 Ejemplo de segmentación basada en el color 34
Figura 2.38 Ejemplo de segmentación basada en la textura 34
Figura 2.39 Ejemplo de segmentación basada en el movimiento 35
Figura 2.40 Ventana de comandos 38
Figura 2.41 Ventana historia de comandos 38
Figura 2.42 Ventana del área de trabajo 39
Figura 2.43 Ventana de carpeta actual 39
Figura 2.44 Representación de imagen RGB en MatLab 40
Figura 2.45 Imagen leída y mostrada en MatLab 42
Figura 2.46 Conversión de imagen RGB a intensidad de gris
y binaria 43
Figura 2.47 Tarjeta Arduino UNO 45
Figura 2.48 Entorno de desarrollo de Arduino 47
Figura 2.49 Estructura básica de un programa de Arduino 47
Figura 2.50 Comunicación MatLab-Arduino 50
Figura 2.51 Componentes internos de un servomotor 52
Figura 2.52 Duración del pulso y ángulo del eje de un servomotor 52

viii
Figura 3.1 Selección del tipo de reconocimiento 54
Figura 3.2 Enumeración de los objetos presentes en la imagen 55
Figura 3.3 Conteo de objetos de acuerdo al tipo de reconocimiento
Seleccionado 55
Figura 3.4 Diseño del brazo robótico 56
Figura 3.5 Brazo robótico terminado 57
Figura 3.6 Conexión de servomotores 58
Figura 3.7 Brazo robótico con cámara 58
Figura 3.8 Funcionamiento de la interfaz gráfica 60
Figura 3.9 Mensaje de error al no realizarse la comunicación
MatLab-Arduino 60
Figura 3.10 Opciones iniciales de la interfaz gráfica 61
Figura 3.11 Selección del adaptador de video 61
Figura 3.12 Selección del ID de la cámara 62
Figura 3.13 Selección del formato 62
Figura 3.14 Mensaje de error al no configurar correctamente
la cámara 62
Figura 3.15 Botón "Visualizar Video" habilitado 63
Figura 3.16 Opciones de control del brazo robot y de reconocimiento
habilitadas 64
Figura 3.17 Selección de tipo de reconocimiento 64
Figura 3.18 Resultados mostrados en la interfaz gráfica 65
Figura 3.19 Cambio de tipo de reconocimiento 66
Figura 3.20 Confirmación de terminar la interfaz gráfica 66
Figura 4.1 Brazo robótico integrado a una banda transportadora 68
Figura A.1 Círculo azul 76
Figura A.2 Círculo rojo 76
Figura A.3 Círculo verde 76
Figura A.4 Cuadrado azul 76
Figura A.5 Cuadrado rojo 76
Figura A.6 Cuadrado verde 76
Figura A.7 Estrella azul 77
Figura A.8 Estrella roja 77

ix
Figura A.9 Estrella verde 77
Figura A.10 Rombo azul 77
Figura A.11 Rombo rojo 77
Figura A.12 Rombo verde 77
Figura A.13 Triángulo azul 78
Figura A.14 Triángulo rojo 78
Figura A.15 Triángulo verde 78
Figura A.16 Algunas imágenes de prueba colocadas en una sola 78
Figura G.1 Círculo rojo 92
Figura G.2 Cuadrado rojo 92
Figura G.3 Estrella verde 92
Figura G.4 Rombo verde 93
Figura G.5 Triángulo azul 93
Figura H.1 Ejemplo de interfaz gráfica 94
Figura H.2 Comando guide 94
Figura H.3 Selección de nueva interfaz gráfica 95
Figura H.4 Cuadro de diálogo al iniciar nueva interfaz gráfica 95
Figura H.5 Ventana para crear nueva interfaz gráfica 96
Figura H.6 Opciones de la ventana para crear una interfaz gráfica 96
Figura H.7 Componentes para una interfaz gráfica 97
Figura H.8 Ventana Property Inspector 97
Figura H.9 Opción View Call 98
Figura H.10 Archivo “.m” 98
Figura H.11 Guardar valor de una variable 99
Figura H.12 Asignar valor de un componente a una variable 99
Figura H.13 Asignar valor de una variable a un componente 99
Figura H.14 Opción Blank GUI (Default) 100
Figura H.15 Componentes a utilizar 100
Figura H.16 Configuración del Push Button 101
Figura H.17 Presentación de la interfaz gráfica 101
Figura H.18 Archivo “.m” creado al guardar 101
Figura H.19 Opción para crear la función Callback 102
Figura H.20 Función Callback de un Push Button 102

x
Figura H.21 Función Callback de un Edit Text 102
Figura H.22 Propiedad “Tag” de un componente 102
Figura H.23 Código del primer Edit Text 103
Figura H.24 Código del segundo Edit Text 103
Figura H.25 Código del Push Button 103
Figura H.26 Botón para ejecutar la interfaz gráfica 104
Figura H.27 Interfaz gráfica de la suma de números 104

xi
Índice de tablas

Página

Tabla 2.1 Comparativa entre Visión Humana y Visión Artificial 12


Tabla 3.1 Especificaciones de servomotores 57
Tabla 3.2 Características de WebCam 59
Tabla 4.1 Propiedades de los objetos contenidos dentro de las
imágenes de prueba 67
Tabla 4.2 Propiedades de las figuras de prueba 68

xii
Antecedentes

Durante los últimos años los robots han incursionado en la mayoría de las actividades
que realiza el ser humano, un robot es un manipulador multifuncional reprogramable
y diseñado para mover materiales, partes, herramientas o dispositivos especiales a
través de movimientos programados para la ejecución de una variedad de tareas [1].

El término robot proviene de la palabra checa “robota” que significa “trabajo


forzado u obligatorio”. Aunque la idea de los robots se remonta a hace más de 3000
años en la leyenda hindú de los elefantes mecánicos (Fuller, 1999), la palabra robot se
usó por primera vez en 1921, en la obra de teatro Rossum´s Universal Robots (Los
robots universales del Rossum), escrita por el checo Karel Capek (1890-1938); en esta
obra (Dorf, 1988) un fabricante ficticio de criaturas mecánicas diseñaba robots para
reemplazar a trabajadores humanos. Eficientes pero completamente faltos de
emociones, se pensaba al principio que estos eran mejores que las personas, puesto
que hacían lo que se les ordenaba sin preguntar. Al final los robots se volvieron contra
sus amos, acabaron con la raza humana salvo con un solo hombre para que pudiera
seguir produciendo más robots; desgraciadamente la formula se había perdido en la
destrucción causada por los robots [4].

El término robot hubiera quedado en desuso si no hubiera sido por los escritores
del género literario de la ciencia ficción. Muchos de ellos reutilizaron la palabra robot,
e incluso algunos mantuvieron el mensaje de la obra de Capek: la dominación de la
especie humana por seres hechos a su propia imagen. Entre los muchos escritores es
inevitable nombrar a Isaac Asimov (1920-1992) como el mayor impulsor de la palabra
robot, escribió diferentes novelas sobre el tema como por ejemplo: Los robots del
amanecer, El sol desnudo o Robots e imperio. Yo, Robot es una colección de relatos
escritos en 1950, en los que se enuncian por primera vez las tres famosas leyes de la
robótica:

1. Un robot no puede hacer daño a un ser humano o, por inanición, permitir que
un ser humano sufra daño.

xiii
2. Un robot debe obedecer las órdenes dadas por los seres humanos, excepto si
estas órdenes entrasen en conflicto con la Primera Ley.
3. Un robot debe proteger su propia existencia en la medida en que esta protección
no entre en conflicto con la Primera Ley o la Segunda Ley.

En su novela Robots e Imperio, publicada en 1985, Asimov incorporó una


cuarta ley, conocida como Ley Cero: un robot no puede lastimar a la humanidad, o por
falta de acción, permitir que la humanidad sufra daño. Esta ley, de mayor prioridad
que la primera, antepone el bien comunitario al individual.

Mucho antes de que la palabra robot fuera utilizada por primera vez, el hombre
creaba máquinas y dispositivos capaces de imitar las funciones y movimientos de los
seres vivos. Los griegos ya utilizaban la palabra automato, de la que deriva la actual
autómata. Herón de Alejandría (400 a.c.) desarrolló uno de los primero autómatas con
carácter lúdico en su famoso teatro de autómatas, el cual se movía por medio de
dispositivos hidráulicos, poleas y palancas. Otro autómata famoso de Herón son los
Pájaros de Herón, un conjunto de aves que vuelan, gorjean y beben (Figura 1).

Figura 1 Pájaros de Herón [6].

La cultura árabe (siglos VIII a XV) heredo y difundió los conocimientos


griegos, dándole una aplicación práctica, introduciéndolo en la vida cotidiana, como
por ejemplo en diversos sistemas dispensadores de agua. En esta época, también se
desarrollaron diversos ejemplos de autómatas como el Hombre de Hierro de Alberto
Magno (1204-1282), o la Cabeza Parlante de Roger Bacon (1214-1294). Otro ejemplo
relevante fue el Gallo de Estrasburgo (Figura 2) de autor desconocido, es el autómata

xiv
más antiguo que se conserva en la actualidad, y que formaba parte del reloj de la torre
de la catedral de Estrasburgo; al dar las horas, movía las alas y el pico.

Figura 2 Gallo de Estrasburgo [6].

Durante los siglos XV y XVI, los autores del renacimiento siguieron


interesados por los ingenios descritos y desarrollados en la antigüedad, de esta época
es conocido el León mecánico construido por Leonardo Da Vinci (1415-1519), que
abría su pecho con su garra y mostraba el escudo de armas del Rey.

Durante los siglos XVII y XVIII se desarrollaron los primeros autómatas con
algunas de las características modernas de los robots, fueron desarrollados en su gran
mayoría por artesanos del gremio de la relojería, y su funcionamiento principal era la
de entretener a la gente de la corte; se destacan en esta época el Pato de Vaucanson
(Figura 3), y los Muñecos de la Familia Droz, del relojero suizo Pierre Jaquet Droz
(1721-1790) y sus hijos Henri-Louis y Jaquet.

Figura 3 Pato de Vaucanson [6].

xv
A finales del siglo XVIII y XIX se desarrollaron invenciones mecánicas
utilizadas principalmente en la industria textil, entre las que se pueden destacar la
hiladora giratoria de Hargreaves, la hiladora mecánica de Cromptron, el telar de
Cartwright y el famoso telar de Jacquard (Figura 4). Jacquard fue el primero en
utilizar tarjetas perforadas como soporte de un programa de trabajo donde se definía
el tipo de tarea que se deseaba realizar; se puede decir que estas máquinas
constituyeron los primeros referentes de las máquinas de control numérico.

Figura 4 Telar de Jacquard [6].

Los antecedentes más directos de los robots, son los telemanipuladores. En


1948, R. C. Goertz desarrolló en el Argonne Nacional Laboratory el primer
manipulador (Figura 5), con el objetivo de manipular elementos radiactivos sin riesgo
para el operador. Éste consistía en un dispositivo mecánico maestro-esclavo, donde el
manipulador maestro, colocado en zona segura, era movido por el operador; mientras
que el esclavo, reproducía los movimientos del primero. El operador, además de poder
observar a través de un grueso cristal, sentía por medio del dispositivo maestro, las
fuerzas que el esclavo ejercía sobre el entorno.

xvi
Figura 5 Telemanipuladores de Goertz [6].

Más adelante, en 1958, Ralph Mosher, ingeniero de General Electric,


desarrolló un dispositivo Handy-Man consistente en dos brazos robóticos teleoperados
mediante un manipulador maestro del tipo denominado exoesqueleto (Figura 6).

Figura 6 Handy-Man de Mosher [7].

Junto a la industria nuclear, en los años sesenta, la industria submarina


comenzó a interesarse por los telemanipuladores, y más tarde, en los años setenta, la
industria espacial se sumó a este interés.

La sustitución del operador por un programa de ordenador que controlase los


movimientos del manipulador, dio paso al concepto de robot. La primera patente de
un dispositivo robótico fue solicitada en 1954 por el británico C.E. Kenward. Sin
embargo, fue George C. Devol, un ingeniero norteamericano, el que estableció las
bases del robot industrial moderno. En 1956, Joseph F. Engelberger y Devol
comenzaron a trabajar en la utilización industrial de sus máquinas, fundando la
Consolidated Controls Corporation. Más tarde se convertiría en Unimation (Universal
Automation), instalando su primera máquina Unimate en la General Motors de

xvii
Trenton, Nueva Jersey, en 1960 (Figura 7). Con esto se produjo un boom de la fábrica
del futuro, aunque en su primer intento el resultado y la viabilidad económica fueron
desastrosos.

Figura 7 Primer robot industrial [6].

Otras grandes empresas, como la AMF (American Machine and Foundry


Company), emprendieron la construcción de máquinas similares, que más tarde se
comenzaron a denominar robots por motivos comerciales, a pesar de no contar con la
apariencia humana de aquellos.

En 1968, J.F. Engelberger visitó Japón y poco más tarde se firmaron acuerdos
con Kawasaki para la construcción de robots tipo Unimate. El crecimiento de la
robótica en Japón aventajó en breve a los Estados Unidos gracias a Nissan, que formó
la primera asociación robótica del mundo, la Asociación de Robótica Industrial de
Japón (JIRA) en 1972. Dos años más tarde se formó el Instituto de Robótica de
América (RIA), que en 1984 cambió su nombre por el de Asociación de Industrias
Robóticas, manteniendo las mismas siglas. Por su parte, Europa tuvo un despertar más
tardío y hasta 1973 se construyó el primer robot con accionamiento totalmente
eléctrico (Figura 8), a cargo de la firma sueca ASEA. En 1980 se fundó la Federación
Internacional de Robótica.

xviii
Figura 8 Robot de accionamiento eléctrico: ASEA IRb6 [6].

.
La evolución de los robots industriales ha sido vertiginosa. En poco más de 30
años, las investigaciones y desarrollos sobre robótica industrial han permitido que los
robots tomen fuerza en casi todas las áreas productivas. Hay 5 momentos relevantes
en el desarrollo de la robótica industrial:

1. 1948, desarrollo del primer manipulador.


2. 1956, con la fundación de Unimation, se realizan los primeros proyectos de
robots.
3. 1970, los laboratorios de la universidad de Stanford y del MIT se proponen
controlar un robot mediante un computador.
4. 1975, la aplicación del microprocesador transforma la imagen y las
características del robot, hasta entonces grande y tosco.
5. 1980, el fuerte impulso de la investigación potencia la configuración del robot
inteligente.

Aunque siguen siendo los robots industriales los más utilizados en la industria
para el montaje, soldadura, etc., existen otro tipo de aplicaciones que han hecho
evolucionar en gran medida tanto la concepción de los robots como su morfología,
acercándolos cada vez más a la idea que en su momento presentó K. Capek.

xix
Actualmente una de las tendencias más importante en robótica es la de dotar a
los robots con los sentidos humanos para que puedan interactuar adecuadamente con
su entorno, siendo el sentido de la vista el que más importancia ha adquirido. El sentido
de la vista se implementa en robotica mediante el desarrollo de Sistemas de Visión
Artificial, cuyo propósito es el de programar un computador para que "entienda" una
escena o las características de una imagen [8].

La visión artificial surge en la década de los 60 con la idea básica de conectar


una cámara de video a un computador; esto implicó no solo la captura de imágenes a
través de la cámara sino también la comprensión de lo que estas imágenes
representaban. Un resultado muy importante de este trabajo y que marcó el inicio de
la visión artificial, fue un trabajo de Larry Roberts, el creador de ARPAnet. En 1961
creó un programa, el “mundo de microbloques”, en el que un robot podía “ver” una
estructura de bloques sobre una mesa, analizar su contenido y reproducirla desde otra
perspectiva, demostrando así que esa información visual que había sido mandada al
ordenador por una cámara, había sido procesada adecuadamente por él [9].

Las técnicas usadas en visión artificial se han desarrollado a gran velocidad en


las últimas décadas; los primeros sistemas se basaron en imágenes binarias que se
procesaban en bloques, ventanas o píxeles. Gracias al desarrollo de nuevos algoritmos
de visión artificial se logró reconocer el contorno de objetos y su posición dentro de
una imagen, estos algoritmos tenían la limitante de no poder operar en diferentes tipos
de iluminación. Posteriormente se introdujeron los sistemas de intensidad de gris, en
estos cada píxel de la imagen es representado con un número proporcional a la
intensidad de gris de dicho elemento; esta técnica podía operar en diferentes tipos de
iluminación, ya que pueden encontrar los bordes de los objetos utilizando cambios en
los valores de intensidad de los píxeles [10].

La visión por computador actualmente comprende tanto la obtención como la


caracterización e interpretación de los objetos contenidos en una imagen y es uno de
los elementos sensoriales más atractivos para incrementar la autonomía en robótica ya
que proveen de información relevante sobre el estado de los robots y de su entorno
físico inmediato y son bastante baratos en comparación con otros; la única dificultad

xx
que puede existir al emplear estos sistemas es la extracción de la información a partir
de una imagen.

Por último cabe destacar el rango de aplicaciones en la que la visión por


computador tiene cada vez más, un papel importante:

 Militares: gran parte de los logros informáticos conseguidos han sido


promovidos o posteriormente adquiridos y mejorados por este sector.
 Robótica: en aplicaciones industriales para guiado de robots.
 Análisis de imágenes tomadas por satélite.
 Identificación automática de huellas: muy extendidos en sistemas de
seguridad y control de acceso.
 Control de calidad: muy extendido en cadenas de montaje.
 Medicina: dando especial importancia a los avances obtenidos con imágenes
RMI (imágenes por resonancia magnética), y en imágenes por Rayos X.
 Reconocimiento de Caracteres: dentro de esta área se encuentran
aplicaciones como lectura de etiquetas, procesamiento de cheques bancarios,
lectura de texto, etc.
 Cartografía: elaboración de mapas a partir de fotografías, síntesis de mapas
de clima, etc.

xxi
Capítulo I. Introducción

La idea de desarrollar sistemas con funciones y capacidades similares a los de los


humanos se remonta desde la antigüedad, una de estas capacidades es la visión; la cual
nos permite procesar nuestro entorno, identificar objetos y detectar el comportamiento
de los objetos que hay a nuestro alrededor.

1.1 Problema a resolver

Desde hace muchos años se ha intentado imitar los sistemas de visión biológicos para
implementarlos en los robots, para que estos puedan interactuar con su entorno; es por
esto que en el presente proyecto el problema a resolver es construir un brazo robot que
detecte y reconozca formas o colores a través de una webcam (Figura 1.1).

Figura 1.1 Problema a Resolver.

1.2 Justificación

Durante la última década, la visión artificial ha pasado de ser un área de investigación


a una tecnología ampliamente aceptada y capaz de proporcionar un aumento dramático

1
en la productividad. Los factores clave que han contribuido en el desarrollo actual de
la visión artificial son el crecimiento exponencial de la velocidad del procesador y la
capacidad de memoria.

Aplicando técnicas de visión artificial se puede realizar un tratamiento


inteligente de las imágenes recibidas en un ordenador, para así analizar, reconocer y
manipular los objetos presentes en ellas.

Al implementar la visión artificial en el brazo robot, se amplía la inteligencia


de este y su capacidad para interactuar con su entorno.

1.3 Objetivo general

El objetivo general de este proyecto es desarrollar un prototipo de brazo robot que


detecte y reconozca formas o colores con visión artificial mediante el uso de MatLab
y Arduino.

1.4 Objetivos específicos

- Estudio y análisis del procesamiento digital de imágenes.


- Desarrollar en MatLab un algoritmo para la detección de formas y colores a
través de una webcam.
- Realizar la comunicación entre MatLab y Arduino para la manipulación del
brazo robot.

1.5 Aportaciones del trabajo

El desarrollo de este proyecto tiene como alcance reconocer y detectar a través de una
webcam:

- Cinco figuras (Circulo, Cuadrado, Estrella, Rombo y Triangulo).

2
- Tres colores (Rojo, Verde y Azul).

Al desarrollar el proyecto las limitaciones que se nos presentaron fueron de


aspecto económico y el tiempo para terminar el trabajo.

1.6 Estructura del trabajo

A continuación se describe el contenido de los capítulos que conforman este trabajo:

En el Capítulo I: Introducción, se hace una breve descripción de las


características principales del proyecto.

En el Capítulo II: Marco Teórico, se presentan las definiciones y bases


teóricas sobre las que se fundamenta el proyecto.

En el Capítulo III: Metodología, se explican los algoritmos realizados en


MatLab y la elaboración del brazo robot.

En el Capítulo IV: Análisis de Resultados, se analizan los resultados


obtenidos para determinar si se ha logrado el objetivo trazado.

3
Capítulo II. Marco Teórico

En este capítulo se introducen una serie de conceptos preliminares para comprender


los procesos involucrados en el sentido de la vista y su enfoque dentro de la visión
artificial.

2.1 Luz, ojo humano y color

La luz es una forma de radiación electromagnética, llamada energía radiante, la cual


al interactuar con alguna superficie se refleja o transmite hacia el sistema visual y
produce la respuesta de los fotoreceptores del ojo humano (Figura 2.1). Desde el punto
de vista del procesado digital de imágenes la luz se considera como una onda, la cual
está determinada por dos propiedades: su amplitud y su longitud de onda [11].

Figura 2.1 Partes del ojo humano [12].

El recorrido de la luz a través del ojo humano es el siguiente [13]:

1. La luz entra a través del ojo por la córnea y llega a la pupila que se contrae o
expande según su intensidad. La pupila será más pequeña cuanta más luz haya
para evitar deslumbramientos y cuando haya poca luz aumentara su tamaño
para dejar entrar mayor cantidad de luz.
2. El cristalino del ojo será quien proyecte las imágenes enfocadas en la retina,
puede ampliarse o reducirse según lo cerca o lejos que esté el objeto observado.

4
3. La retina recibe la imagen invertida y los 125 millones de fotoreceptores que
se encuentran situados a lo largo de la superficie retiniana (Figura 2.2)
transforman esa información en impulsos nerviosos; los cuales se trasladan al
cerebro a través del nervio óptico. El cerebro es quien realmente ve las
imágenes, endereza la imagen invertida e interpreta la información de color,
tamaño, posición, etc.

Figura 2.2 Fotoreceptores de la retina [13].

El ojo humano solo ve una parte del espectro de toda la luz (Figura 2.3), este
rango de luz que podemos ver se denomina luz visible [14]. Nuestro sistema visual
interpreta las diferentes amplitudes y longitudes de onda de la luz, produciendo las
sensaciones que conocemos como brillo y color respectivamente.

Figura 2.3 Espectrograma de la luz visible e invisible [15].

5
El color es un atributo que percibimos de acuerdo a la cantidad de luz que
absorben o reflejan los objetos, los colores absorbidos desaparecen en el interior del
objeto y los reflejados llegan al ojo humano. Para le percepción de colores el ojo
humano tiene dos tipos de receptores: bastones y conos. Los bastones transmiten
diferentes intensidades de gris y los conos le permiten al cerebro percibir la tonalidad
de los colores, existen tres tipos de conos:

1. Sensibles a la luz roja.


2. Sensibles a la luz verde.
3. Sensibles a la luz azul.

La identificación del color se hace mediante la combinación de las señales


producida por los conos, a los colores percibidos por los tipos de conos mencionados
se les denomina colores primarios (rojo, verde y azul), de la combinación aditiva en
partes iguales de estos, se obtienen los colores secundarios (amarillo, magenta y cian);
de la combinación de estos tres obtenemos el blanco, y al combinar los secundarios
substractivamente obtenemos los colores primarios y el negro (Figuras 2.4 y 2.5) [16].

Figura 2.4 Colores primarios [16]. Figura 2.5 Colores secundarios [16].

En función del color, se pueden distinguir dos tipos de luz:

1. Acromática. Sin color, sus atributos son la intensidad o cantidad de luz.


2. Cromática. Con color, y se caracteriza mediante tres parámetros.
- Radiancia. Cantidad total de energía que sale de la fuente luminosa.

6
- Luminancia. Cantidad de energía procedente de la fuente luminosa que
percibe un observador.
- Brillo. Es la luminosidad de un color.

Todo color posee una serie de propiedades que le hacen variar de aspecto y que
definen su apariencia final, estas propiedades son:

- Tono o matiz. Es la propiedad del color que se refiere al estado puro del
mismo, es la cualidad por la cual diferenciamos y damos su nombre al color.
- Saturación o intensidad. Representa la pureza o intensidad de un color
particular, la viveza o palidez del mismo.
- Valor o brillo. Se refiere a la luminosidad del color, la luminosidad puede
variar añadiendo negro o blanco en un tono.

En el procesamiento de imagen se utilizan diversos modelos de color, los cuales


se describen a continuación [17]:

a) Modelo RGB. En este modelo el color aparece en sus componentes espectrales


primarias: rojo, verde y azul; este modelo está basado en el sistema de
coordenadas cartesianas; el subespacio de color de interés en este modelo es el
tetraedro mostrado en la Figura 2.6, en el cual los valores RGB están en tres
vértices, el negro corresponde al origen y el blanco se sitúa en el vértice más
alejado del origen. En este modelo, la escala de grises se extiende desde el
negro al blanco a lo largo de la diagonal que une esos dos puntos, y los colores
son puntos dentro del tetraedro definidos por los vectores desde el origen. Las
imágenes en este modelo se forman por la combinación en diferentes
proporciones de cada uno de los colores primarios RGB.

7
Figura 2.6 Modelo RGB [17].

b) Modelo CMY. Este modelo lo componen los colores secundarios de la luz:


cian (C), magenta (M) y amarillo (Y); estos se denominan sustractivos ya que
se utilizan como filtros para sustraer colores de la luz blanca. El sistema
coordenado es el mismo que en el modelo RGB pero donde había negro ahora
existe blanco y viceversa.
c) Modelo YIQ. Se utiliza en las emisiones comerciales de televisión,
básicamente es una recodificación del RGB utilizada por su eficiencia en la
transmisión y para mantener la compatibilidad de estándares de televisión en
blanco y negro. La ventaja principal del modelo YIQ en el procesamiento de
imágenes es que la luminancia (Y) y la información del color (I y Q) están
desacopladas, así la importancia de este desacoplamiento radica en que la
componente de luminancia de una imagen puede procesarse sin afectar a su
contenido cromático (Figura 2.7).

Figura 2.7 Modelo YIQ [17].

8
d) Modelo YCbCr. Se trata de una codificación no lineal del espacio RGB; el
parámetro Y indica la luminancia, los parámetros Cb y Cr indican el tono del
color: Cb ubica el color en una escala entre el azul y el amarillo, Cr indica la
ubicación del color entre el rojo y el verde (Figura 2.8).

Figura 2.8 Modelo YCbCr [17].

e) Modelo HSI. Sus siglas corresponden a H: Hue/Tonalidad, S:


Saturation/Saturación e I: Intensity/Intensidad; este debe su utilidad a dos
hechos básicos: Primero, la componente de intensidad está desacoplada de la
información cromática contenida en la imagen; Segundo, las componentes de
tono y saturación están íntimamente relacionadas con la forma en que los seres
humanos percibimos el color. Estas características hacen que el modelo HSI
(Figura 2.9) sea una herramienta ideal para desarrollar algoritmos de
procesamiento de imágenes basados en alguna de las propiedades de la
percepción del color del sistema visual humano.

9
Figura 2.9 Modelo HSI [17].

f) Modelo HSV. Sus siglas corresponden a H: Hue/Tonalidad, S:


Saturation/Saturación y V: Value/Valor; se trata de una transformación no
lineal del espacio de color RGB, y se puede usar para crear nuevos colores
variando el grado de propiedades del color. En la Figura 2.10 se muestra el
sistema de coordenadas de este modelo; la parte superior de este corresponde
a V=1, que contiene los colores relativamente más brillantes, el valor de H se
mide con el ángulo alrededor del eje vertical y el valor de S es una razón que
varía de 0 en la línea central (eje V) a 1 en los lados.

Figura 2.10 Modelo HSV [18].

g) Modelo HSL. Sus siglas corresponden a H: Hue/Tonalidad, S:


Saturation/Saturación y L: Lightness/Luminosidad (Figura 2.11); este modelo

10
es similar al HSV pero refleja mejor la noción intuitiva de la saturación y
luminosidad como dos parámetros independientes; en HSL la componente de
la saturación va desde el completamente saturado hasta el gris equivalente,
mientras que en HSV, con V al máximo, va desde el color saturado hasta el
blanco, lo que no es intuitivo.

Figura 2.11 Modelo HSL [18].

2.2 Visión artificial

La visión artificial, también conocida como visión por computador o visión técnica es
un subcampo de la inteligencia artificial que tiene como finalidad la extracción de
información del mundo físico a partir de imágenes, utilizando para ello un computador.

La entrada de un Sistema de Visión Artificial es una imagen obtenida por un


elemento de adquisición, mientras que su salida es una descripción de la escena
contenida en la imagen. Por un lado, esta descripción debe estar relacionada de algún
modo con aquella realidad que produce la imagen y, por el otro, debe contener toda la
información requerida para la tarea de interacción con el medio ambiente que se desea
llevar a cabo, por ejemplo mediante un robot.

Los Sistema de Visión Artificial pretenden ser tan avanzados y complejos


como el propio ojo humano; en procesos de medición de precisión ya lo han superado,

11
pero en otros aún falta desarrollar la tecnología para tan siquiera igualarlo; en la Tabla
1.1 se muestra una comparativa entre la Visión Humana y la Visión Artificial [19].

Tabla 1.1 Comparativa entre Visión Humana y Visión Artificial [19].

Capacidades Visión Humana Visión Artificial


Distancia Buena capacidad Capacidades limitadas
Orientación Buena capacidad Buena para 2D

Limitada, sensible al objeto


Movimiento Buena capacidad
a inspeccionar

Requerimiento de existencia
Detección de bordes Elevadas capacidades
de alto contraste en la
imagen
Imágenes Buena para diferencias
Valoración cualitativa
parcialmente ocultas
cuantificables
Interpretación de la
Muy desarrollada Capacidades limitadas
imagen
Sombras en la
Muy desarrollada Limitado sobre todo en
imagen
blanco y negro

Valoración en 2D Muy desarrollada Excelente


Valoración en 3D Muy desarrollada Capacidades limitadas
Resolución Capacidades de alta Limitado por el tamaño
resolución de los píxeles
Procesamiento en tiempo
Tiempo de procesado Fracciones de segundo por
real
Imagen
Discriminación muy
Discriminación Limitado a imágenes de
elevada
alto contraste

Sensibilidad Muy sensible Aceptable


Costo de operación Bajo para poco volumen Alto para poco volumen
Óptimo para poca
Costo total Óptimo para grandes
producción
Producciones
o muy variable

12
2.2.1 Componentes de un sistema de visión artificial

Los componentes de un Sistema de Visión Artificial se muestran en la Figura 2.12


[20]:

Figura 2.12 Componentes de un sistema de visión artificial [20].

2.2.1.1 Iluminación

El propósito de la iluminación es el de controlar la forma en que la cámara va a ver el


objeto, juega un papel muy importante dentro de la visión artificial, ya que simplifica
considerablemente el posterior procesamiento de la escena captada. Los objetivos de
la iluminación son: optimizar el contraste, normalizar cualquier variación de la
iluminación ambiente y simplificar el procesamiento posterior de la imagen [19].

El tipo de iluminación dependerá del entorno en que este implementado el


sistema de visión artificial, los más importantes son:

a) Iluminación frontal. La cámara se posiciona mirando al objeto en la misma


posición que la luz (Figura 2.13), esto reduce las sombras, suaviza las texturas
y minimiza la influencia de rayas, polvo e imperfecciones que pueda tener el
objeto; este tipo de iluminación se consigue mediante anillos de luz. Se utiliza
en superficies con poco reflejo de la luz para la detección de diferentes colores
[19].

13
Figura 2.13 Iluminación frontal [19].

b) Iluminación lateral. La cámara se posiciona mirando al objeto mientras que


la dirección de la luz es lateral al objeto (Figura 2.14); el grado de inclinación
del elemento emisor de luz vendrá determinado por el grado deseado de resalte
de los relieves. Su aplicación es conveniente para resaltar: bordes, rayas y
fisuras en una dirección determinada, presenta la desventaja de resaltar los
relieves pequeños que sean de los objetos, resultando una sombra muy definida
[19].

Figura 2.14 Iluminación lateral [19].

14
c) Iluminación por campo oscuro (darkfield). La luz es emitida lateralmente
con un ángulo muy pequeño mediante un anillo en todas las direcciones,
rebotando en los defectos del objeto a analizar e incidiendo en la cámara
(Figura 2.15). No es recomendable en superficies con muy poca luz y se suele
utilizar cuando se desea resaltar incrustaciones y códigos alfanuméricos con
poco contraste en metales [19].

Figura 2.15 Iluminación por campo oscuro [19].

d) Iluminación a contra luz (back light). Consiste en iluminar al objeto por


detrás (Figura 2.16); de forma que la fuente luminosa, el objeto y la cámara
formen una línea recta, produce imágenes en blanco y negro. Esta técnica se
adapta muy bien en aplicaciones para localización de piezas y análisis
dimensional, en las cuales la silueta de los objetos es suficiente para su
reconocimiento. El principal inconveniente de esta es la perdida de todos los
detalles, así como la imposibilidad de detectar fisuras en el objeto [21].

15
Figura 2.16 Iluminación a contra luz [19].

e) Iluminación axial difusa. La luz es emitida lateralmente siendo reflejada por


un espejo semitransparente que desvía la luz en la misma dirección que el eje
de la cámara (Figura 2.17), consiguiendo una luz difusa homogénea; es muy
útil para la inspección de superficies planas reflectantes [19].

Figura 2.17 Iluminación axial difusa [19].

16
f) Iluminación difusa tipo domo. La luz es emitida dentro de un cúpula esférica
(Figura 2.18), resultando una luz difusa desde todas direcciones, eliminando
sombras y reflejos, suavizando texturas y minimizando la influencia de rayas,
polvo, relieves y curvaturas que pueda tener el objeto; su principal
inconveniente es que su implementación es costosa [19].

Figura 2.18 Iluminación difusa tipo domo [19].

g) Iluminación por láser. Se utiliza para resaltar o determinar una tercera


dimensión de un objeto; se trata de colocar la fuente de luz láser en un ángulo
conocido con respecto al objeto a iluminar y a la cámara (Figura 2.19), de
forma que viendo la distorsión de la luz pueda interpretarse la profundidad de
los objetos; se utiliza para medir e indicar el trazado en procesos de corte y en
el control de profundidad de objetos; sus desventajas son el costo de su
implementación y el láser no tiene la misma intensidad lumínica a lo largo del
objeto.

17
Figura 2.19 Iluminación por láser [19].

h) Iluminación estructurada. Se sirve de la proyección de puntos, franjas o


rejillas sobre la superficie de trabajo (Figura 2.20). Las ventajas de este tipo de
iluminación son: establece un patrón de luz conocido sobre la superficie de
trabajo y las diferencias con este patrón indican la presencia de un objeto,
simplificándose así el problema de detección de un objeto y analizando la
forma en que el patrón de luz es distorsionado, es posible obtener información
de las características tridimensionales del objeto.

Figura 2.20 Iluminación estructurada [22].

18
2.2.1.2 Cámara

La cámara es un dispositivo que utilizando un juego de lentes y un sensor recibe la luz


reflejada por la escena y la utiliza para generar imágenes; una cámara desempeña la
función de sensor en un sistema de visión artificial, de acuerdo a la aplicación y a las
necesidades se selecciona el tipo de cámara y óptica más adecuado.

El lente en una cámara se utiliza para transmitir la luz al sensor de la cámara


de una forma controlada para poder obtener una imagen enfocada de uno o varios
objetos [23].

Los sensores contenidos en una cámara son componentes sensibles a la luz que
modifican su señal eléctrica en función de la intensidad luminosa que perciben. La
tecnología más habitual en este tipo de sensores es el CCD (Charge Coupled Devices
o Dispositivos de Acoplamiento de Carga), en este tipo de sensores la señal eléctrica
que transmiten los elementos fotosensibles es función de la intensidad luminosa que
reciben, su espectro, y el tiempo de integración (tiempo durante el cual son sensibles
a la luz incidente). Otra tecnología son los sensores CMOS (Complementary Metal
Oxide Semiconductor), estos son de menor tamaño y precio en comparación con los
CCD; este tipo de sensores se adapta mejor al brillo existente en su entorno [24].

A continuación se describen las cámaras más utilizadas en un sistema de visión


artificial:

a) Cámaras lineales. Construyen la imagen línea a línea realizando un barrido


del objeto junto con un desplazamiento longitudinal en el mismo, su utilización
está muy extendida para la inspección de objetos de longitud indeterminada:
tela, papel, vidrio, planchas de metal, etc.
b) Cámaras matriciales. El sensor de esta cámara cubre un área que está formada
por una matriz. Una cámara matricial produce una imagen de un área,
normalmente con una relación de aspecto de 4 a 3 [25].
c) Cámaras monocromáticas (Escala de grises). La mayoría de los casos en que
se utiliza un sistema de visión artificial (dentro del entorno industrial) la
adquisición se realiza mediante una cámara de este tipo, siendo sus principales

19
ventajas el costo y velocidad de cómputo, se suele utilizar en aplicaciones
donde se requiere el reconocimiento de formas y su color no es importante [26].
d) Cámaras de color. Aunque el proceso de las imágenes a color es más
complejo, este tipo de cámaras pueden proporcionar más información que las
cámaras monocromáticas.
e) Cámaras analógicas. La salida de estas cámaras se puede conectar
directamente a cualquier monitor y puede venir acompañada o no por otras
señales de sincronización.
f) Cámaras digitales. Las ventajas de estas cámaras respecto a las analógicas
estriba en su velocidad y calidad de imagen.

2.2.1.3 Sistema de procesamiento

Suele ser una computadora y es el encargado de recibir las imágenes e implementar


las funciones de tratamiento de la imagen de acuerdo al tipo de análisis a realizar, está
compuesto por:

a) Tarjeta de adquisición. Permite transferir la imagen de la cámara a la


memoria de la computadora con el fin de que ésta pueda realizar el
procesamiento adecuado; los aspectos importantes a considerar en la tarjeta de
adquisición son: velocidad de transmisión, formato de los datos, la capacidad
de preproceso de la imagen, la velocidad de transferencia de la imagen hacia
la memoria de la computadora y la capacidad de controlar la cámara en
tiempo real [24].
b) Algoritmos de procesado. Es la parte inteligente del sistema, consiste en
aplicar las transformaciones necesarias y extracciones de información de las
imágenes capturadas, con el fin de obtener los resultados para los que haya sido
diseñado [24].
c) Interface. Después de realizar el procesamiento de la imagen y a través de los
algoritmos es común mostrar los resultados obtenidos de acuerdo a las
necesidades requeridas a un usuario final, por lo que se crea una interfaz para
mostrarlos.

20
2.2.1.4 Actuadores externos

Es el conjunto de elementos que muestran los resultados obtenidos del procesamiento


de la imagen; estos pueden ser: monitores, robots, dispositivos neumáticos e
hidráulicos, autómatas programables, etc.

2.2.2 Procesamiento digital de imágenes

Los sistemas de visión artificial se basan en el procesamiento digital de imágenes, el


cual es el conjunto de técnicas que se aplican sobre imágenes digitales con el fin de
mejorar la calidad o facilitar la búsqueda de información dentro de las mismas, en este
se distinguen tres niveles [27]:

 Visión de bajo nivel: comprende la captación y el preprocesamiento; ejecuta


algoritmos típicamente de filtrado, restauración de la imagen, realce,
extracción de contornos, etc.
 Visión de nivel intermedio: comprende la segmentación, representación y
descripción, con algoritmos típicamente de extracción de características y
etiquetado de los objetos presentes en una imagen.
 Visión de alto nivel: comprende la fase de reconocimiento e interpretación,
asociando un significado y clasificación de los objetos presentes en una imagen
de acuerdo a las características obtenidas del nivel intermedio.

2.2.2.1 Captación o adquisición de imagen

Esta etapa es la más sencilla, puesto que en esta se realiza con una cámara la obtención
de una imagen y su posterior digitalización. Las imágenes digitales son señales
discretas, que suelen tener origen en una señal continua, por ejemplo: una cámara
digital toma imágenes del mundo real que es continuo.

Una imagen digital puede definirse como una matriz bidimensional (x, y), en
la que cada par de coordenadas representa un elemento contenido en la imagen, los
21
elementos que componen a una imagen son llamados píxeles, cada uno de los cuales
tiene un valor (propiedad del punto que se representa) y una posición especifica. El
término píxel (Picture Element/Elemento de Imagen), se trata de la unidad mínima de
información de una imagen, la cual aparece como un punto en la pantalla o en una hoja
impresa; cada píxel se compone de tres registros de color: rojo, verde y azul; mediante
la combinación de estos el píxel adopta un color en particular [28].

Por la forma en que se manejan los datos en un archivo de imagen digital, se


puede hablar de dos tipos principales de imágenes, los cuales son:

 Imágenes Vectoriales. Estas conservan la nitidez de los bordes y no pierden


detalles cuando se modifica su tamaño puesto que son independientes de la
resolución. La resolución de cada uno de sus puntos se recoge en forma de
ecuación matemática que lo relaciona con el resto de los puntos que forman la
imagen; debido a su definición matemática, apenas ocupa espacio, ya que una
fórmula que represente su forma es suficiente para representar todos los puntos
que la componen. Es el tipo adecuado para el diseño de líneas, polígonos,
figuras, etc., y no es soportado de forma directa por los navegadores de internet;
algunos formatos de este tipo de imágenes son: DWG (AutoCAD), SWF
(SolidWorks) y FLA (Flash). Las imágenes vectoriales son ideales para
cartelería, diseño, logotipos, imagen corporativa, etc., es decir en todas
aquellas situaciones en las que una misma imagen debe ser reproducida en
distintos soportes y tamaños. En las Figuras 2.21 y 2.22 se muestran una
imagen vectorial realizada en un software de diseño y un acercamiento
realizado a esta, con esto se observa que la imagen no pierde calidad en sus
bordes y se aprecian mejor los detalles contenidos en la imagen.

22
Figura 2.21 Imagen vectorial [29] Figura 2.22 Acercamiento de imagen vectorial [29].

 Imágenes Ráster o Mapa de Bits. Constan de un número fijo de pixeles y por


tanto dependen de la resolución; utilizan una cuadricula rectangular de
elementos de imagen (píxeles) para representar las imágenes. A cada pixel se
le asigna una ubicación y un valor de color especifico. La ventaja que
representan están en la posibilidad de recoger una amplia gama tonal, por lo
que es el tipo adecuado para representar imágenes captadas de la realidad; su
tamaño es muy grande debido a la información de cada uno de los puntos que
conforman la imagen. Las imágenes ráster son perfectas cuando la gama de
colores cambia sutilmente. En las Figuras 2.23 y 2.24 se puede observar que
contrario a lo que pasa en las imágenes vectoriales, una imagen ráster pierde
calidad al realizarle un acercamiento; los píxeles son evidentes y no se aprecian
claramente las formas contenidas en la imagen; este efecto se conoce con el
nombre de pixelado, el cual se hace más evidente en las líneas curvas y en las
zonas en los que hay cambios bruscos de luminosidad.

Figura 2.23 Imagen ráster [29]. Figura 2.24 Acercamiento de imagen ráster [29].

23
En el procesamiento digital de imágenes se manejan básicamente cuatro tipos
de imágenes, las cuales se describen a continuación:

1. Imágenes RGB (Red-Green-Blue) o Color Verdadero (Figura 2.25).

- Cada píxel tiene un color en particular, dicho color está descrito por una
cantidad de rojo, una cantidad de verde y una cantidad de azul.
- Si cada uno de sus componentes tiene un rango de 0 a 255 esto da un total
de 2553=16 777 216 diferentes colores posibles dentro de una misma
imagen.
- Se le da también el nombre de imágenes de 24 bits ya que es el número
total de bits para representarlas.

Figura 2.25 Imagen RGB [30].

2. Imágenes Indexadas (Figura 2.26).

- La mayoría de las imágenes solo tienen un pequeño


subconjunto de colores de los más de 16 millones de colores posibles.
- Para conveniencia de manipulación y almacenamiento la
imagen tiene un mapa de colores (colour map) asociado,
llamado paleta de colores.
- La paleta de colores es una simple lista de colores utilizados en la imagen.

24
- Cada píxel tiene un valor que no corresponde al color
directamente como en las RBG, sino que corresponde al índice
del color dentro del mapa de colores.
- Es conveniente que si alguna imagen tiene 256 valores o
menos, solo requerirá un byte por cada índice que se almacene.

Figura 2.26 Imagen indexada [30].

3. Imágenes en Escala o Intensidad de Grises (Figura 2.27).

- Cada píxel es una sombra de gris.


- Normalmente van de 0 (negro) a 255 (blanco).
- Este rango indica que cada píxel puede ser representado
por 8 bits o exactamente 1 byte.
- Este es un rango muy normal para manipulación de imágenes.
- Es muy común encontrarlas en imágenes de Rayos X o en
imágenes de texto impreso.

Figura 2.27 Imagen en escala de grises [30].

25
4. Imágenes Binarias (Figura 2.28).

- Cada píxel es blanco o negro.


- Dado que hay solo dos valores posibles 1=blanco y
0= negro, se necesita únicamente un bit por píxel.
- Pueden ser muy eficientes en términos de almacenamiento.
- Son ideales en el caso de texto, formas y planos arquitectónicos.

Figura 2.28 Imagen binaria [30].

Existen diversos formatos en los que se almacena una imagen digital; entre las
más populares tenemos:

a) TIFF (Tagged-Image File Format/Formato de Archivo de Imagen con


Etiquetas). Se trata de un formato muy difundido a causa de su facilidad de
lectura tanto en IBM como Macintosh, admite una compresión de imágenes sin
pérdida de calidad. Su principal desventaja es que las imágenes pueden ser
grandes por lo que no se usan en Internet.
b) BMP (Bit Map/Mapa de Bits). Es el formato de imagen estándar de Windows,
se le puede emplear con propósitos generales, como en la edición de imágenes
y tapiz del escritorio de Windows. No siempre puede ser leído por
computadoras Macintosh y sus archivos tienden a ser grandes por lo que no
son utilizadas en Internet.
c) GIF (Graphics Interchange Format/Formato de Intercambio de Gráficos). Es
el formato utilizado normalmente para mostrar imágenes de color en
documentos de lenguaje marcado como hipertexto (HTML) en Internet y otros
servicios electrónicos, se desarrolló como norma gráfica para su uso en

26
diversas plataformas, lo cual implica que lo reconocen todos los exportadores
gráficos para internet.
d) JPG o JPEG (Joint Photographic Experts Group/Grupo Asociado de Expertos
en Fotografía). Es un formato de archivo comprimible con posibilidades de
escalamiento para producir archivos reducidos; sin embargo de acuerdo con el
grado de compresión la calidad de imagen puede variar un poco a mucho.
e) PNG (Portable Network Graphics/ Gráfico de Red Portable). Desarrollado
como alternativa de patente gratuita a GIF, se utiliza para la compresión sin
pérdidas y visualización en Internet; es similar al JPG en el sentido de que
también permite la exhibición de imágenes de amplio colorido, pero su
compresión no reduce la calidad de imagen.

2.2.2.2 Preprocesamiento

Cuando se adquiere una imagen, por lo general tiene cierta cantidad de ruido debido
ya sea a deficiencias en la iluminación, a la óptica de la cámara, al medio de
transmisión, etc. Generalmente el ruido se manifiesta como píxeles aislados que toman
un nivel de color diferente al de sus vecinos; el ruido puede clasificarse en los
siguientes tipos [28]:

- Gaussiano: Produce pequeñas variaciones en la imagen; generalmente se debe


a diferentes ganancias en la cámara, ruido en los digitalizadores, perturbaciones
en la transmisión.
- Impulsional (sal y pimienta): el valor que toma el píxel no tiene relación con
el valor ideal, sino con el valor del ruido que toma valores muy altos o bajos
(puntos blancos y/o negros) causados por una saturación del sensor o por un
valor mínimo captado, si se ha perdido la señal en ese punto.
- Multiplicativo: La imagen obtenida es el resultado de la multiplicación de dos
señales.

En la Figura 2.29 se muestran los diferentes tipos de ruido afectando a una


imagen.

27
Figura 2.29 Tipos de ruido en una imagen: (a) Original, (b) Ruido Gaussiano, (c) Ruido Multiplicativo y (d)
Ruido Impulsional [28].

Esta aparición de ruido hace necesario un preprocesamiento de la imagen con


el fin de corregirlo; el objetivo del preprocesamiento es mejorar la calidad de la imagen
adquirida y realzar las características de la misma.

Algunas de las técnicas de preprocesamiento de imágenes más habituales son:

a) Conversión del color. Dependiendo de la aplicación del sistema de visión


artificial la imagen se suele convertir a escala de grises, RGB, binaria o
indexada; para resaltar sus características.
b) Transformaciones aritmético-lógicas. Son las más usadas en un sistema de
tratamiento de imágenes, ya que son las que se utilizan para leer y dar valores
a los píxeles de las imágenes; las operaciones básicas son [27]:

- Conjunción. Operación lógica AND entre los bits de dos imágenes; se usa
para borrar píxeles en una imagen.
- Disyunción. Operación lógica OR entre los bits de dos imágenes; se usa
para añadir pixeles a una imagen.
- Negación. Inversión de los bits que forman una imagen; se usa para
obtener el negativo de una imagen.
- Suma. Suma de los valores de los píxeles de dos imágenes.
- Resta. Resta de los valores de los píxeles de dos imágenes.
- Multiplicación. Multiplicación de los valores de los píxeles de una imagen
por los de otra; se usa para añadir textura a una imagen.
- División. División de los valores de los píxeles de una imagen entre los de
otra.

28
En la Figura 2.30 se pueden apreciar los resultados de transformaciones
aritmético-lógicas realizadas sobre las imágenes A y B.

Figura 2.30 Ejemplos de transformaciones aritmético-lógicas [27].

c) Transformaciones geométricas. Modifican el aspecto visual de la imagen


transformando los valores de una imagen, tal y como podría observarse desde
otro punto de vista; algunas de estas transformaciones son:

- Rotación. Giro de los píxeles de una imagen en torno a un origen.


- Traslación. Movimiento de los píxeles de una imagen.
- Escalado. Cambio del tamaño de una imagen.

En la Figura 2.31 se muestra un ejemplo de transformaciones


geométricas realizadas a una imagen a partir de un sistema de coordenadas.

Figura 2.31 Transformaciones geométricas: (a) Imagen original, (b) resultado de la primera traslación,
(c) resultado del giro y (d) resultado final después de la última traslación [27].

d) Transformación del histograma. El histograma de una imagen es una gráfica


en la que se representa la frecuencia de píxeles existentes para cada nivel de
cuantificación determinado: habitualmente en el eje de abscisas se disponen los
diferentes niveles de cuantificación de valores que pueden tomar los píxeles de
la imagen, mientras el eje de las ordenadas refleja el número de píxeles

29
existentes para cada nivel de cuantificación. La transformación del histograma
se usa para: aclarar u oscurecer una imagen pero manteniendo la relación entre
los valores de cada nivel, mejorar el contraste de la imagen, reducir al máximo
el ruido, etc.

En la Figura 2.32 (a) se muestra una imagen en niveles de gris junto con
su histograma, el cual proporciona información sobre el número de píxeles que
hay para cada nivel de intensidad; en imágenes en color RGB se usan tres
histogramas, uno por cada componente de color.

Entre las diferentes transformaciones del histograma encontramos [26]:

- Aumento y reducción de contraste. Se realiza un aumento o disminución


del contraste de la imagen para resaltar o eliminar características deseadas
(Figura 2.32).

Figura 2.32 Aumento y reducción de contraste: (a) Imagen original, (b) Disminución de
contraste y (c) Aumento de contraste [27].

30
- Ecualizado del histograma. Tiene como objetivo obtener un nuevo
histograma a partir del original, con una distribución uniforme de los
diferentes niveles de intensidad (Figura 2.33).

Figura 2.33 Ecualizado del histograma de una imagen: (a) Imagen original y (b) Ecualizado del
histograma [27].

e) Filtrado espacial o frecuencial. Un filtro puede verse como un sistema que


recibe una señal de entrada a la que se le aplican ciertos cambios para obtener
una señal de salida. La realización de un filtrado en la imagen se realiza para
mejorar su calidad, realzar detalles o características, reducir ruido producido al
momento de adquirir la imagen, etc.

El filtrado espacial se realiza directamente sobre cada píxel de la


imagen y el frecuencial detalla con cuanta frecuencia se repiten ciertos patrones
en una imagen.

2.2.2.3 Segmentación

Es el proceso que divide a una imagen en objetos que sean de nuestro interés con
respecto a una o más características (como por ejemplo el brillo o el color) con el fin
de facilitar un posterior análisis.

31
La segmentación debe verse como un proceso que a partir de una imagen,
produce otra en la que cada píxel tiene asociada una etiqueta distintiva del objeto al
que pertenece. Así, una vez segmentada una imagen, se podría formar una lista de
objetos consistentes en las agrupaciones de los píxeles que tengan la misma etiqueta
[11].

El proceso de segmentación de una imagen depende del problema que se desee


resolver; por ejemplo, sobre una imagen de una página de texto se pueden segmentar
las líneas de texto (si el objetivo es localizar la estructura de los párrafos), o las palabras
y los caracteres que las forman o los logotipos y membretes (si se desea clasificar el
documento), etc. Por ello, dentro de una misma imagen pueden realizarse diversas
segmentaciones.

Dentro de la segmentación de imágenes, se usan los siguientes conceptos


básicos [31]:

- Similitud. Los píxeles agrupados del objeto deben ser similares respecto a
algún criterio (nivel de gris, color, borde, textura, etc.).
- Conectividad. Los objetos corresponden a áreas de pixeles con conectividad,
las particiones corresponden con regiones continuas de píxeles.
- Discontinuidad. Los objetos tienen formas geométricas que definen
contornos, estos bordes delimitan unos objetos de otros.
- Textura. Es el conjunto de formas que se aprecia sobre una superficie y que la
dota de cierto grado de regularidad; definida de forma clásica es uno o más
patrones locales que se repiten de manera periódica.
- Contorno. El contorno en una imagen corresponde al mínimo conjunto de
pixeles que separan un objeto del fondo de la imagen.

Los diferentes objetos que aparecen en una imagen pueden ser localizados
atendiendo a aspectos como sus contornos o su textura; algunos de los tipos de
segmentaciones más comunes se describen a continuación:

1. Segmentación basada en umbralización. La umbralización es un proceso que


permite convertir una imagen de niveles de gris o de color en una imagen

32
binaria, de tal forma que los objetos de interés se etiqueten con un valor distinto
al de los píxeles del fondo (Figura 2.34).

Figura 2.34 Ejemplo de segmentación por umbral [27].

2. Segmentación basada en detección de los contornos. Usa la información


proporcionada por las fronteras de los objetos que aparecen en una imagen; al
encontrar las fronteras de los objetos se pueden diferenciar estos del fondo
(2.35).

Figura 2.35 Ejemplo de segmentación por contornos [27].

3. Segmentación basada en propiedades locales de las regiones. Determinan


zonas dentro de una imagen basándose en criterios de similaridad y proximidad
entre los píxeles de la misma (Figura 2.36). Este tipo de segmentación es
adecuada en imágenes con ruido y en donde los contornos son difíciles de
localizar.

Figura 2.36 Ejemplo de segmentación basada en regiones [27].

33
4. Segmentación basada en el color. Dentro de esta segmentación se suele
convertir la imagen original a otro tipo de imagen requerida (RGB, indexada,
intensidad de grises o binaria), de acuerdo a lo que se requiera, para así
identificar diversas regiones dentro de una imagen de acuerdo a su color o
realizar posteriormente algún otro tipo de segmentación (Figura 2.37).

Figura 2.37 Ejemplo de segmentación basada en el color: Imagen a color RGB convertida a Binaria [27].

5. Segmentación basada en la textura. En este enfoque se definen modelos de


texturas para reconocer agrupaciones de estos dentro de la imagen; en la Figura
2.38 se muestra un ejemplo de imagen texturada y de cómo resultaría su
segmentación.

Figura 2.38 Ejemplo de segmentación basada en la textura: (a) Imagen original y (b) segmentación
basada en la textura [27].

6. Segmentación basada en el movimiento. El movimiento puede ser una


potente herramienta para la segmentación de objetos animados sobre fondos

34
estáticos; esta segmentación consiste en el estudio de la imagen resultante de
la resta de dos imágenes consecutivas de una secuencia animada (Figura 2.39).

Figura 2.39 Ejemplo de segmentación basada en el movimiento: entre las imágenes Raw y Lag se ha
producido un movimiento que se ve reflejado en la imagen Diff, que es la resta de las dos anteriores
[27].

Cada uno de estos tipos de segmentación suele resultar insuficiente para


describir los objetos contenidos en una imagen, es por ello que suelen combinarse de
acuerdo a las necesidades requeridas.

2.2.2.3 Representación y descripción

Una vez que los objetos de interés contenidos en una imagen son aislados, el siguiente
paso es la obtención de características convenientes para describir cada objeto. Las
propiedades que deben tener estos descriptores son [21]:

- Ser capaces de hacer una adecuada discriminación, deben proporcionar valores


numéricos diferentes para cada objeto.
- Ser fiables, debe de haber cambios numéricos pequeños para objetos iguales.

35
- Se calculen en un tiempo aceptable, de manera que sean utilizables en
problemas de tiempo real.
- La descripción del objeto tiene que ser lo más completa posible y no presentar
ambigüedades.

Entre los descriptores comúnmente usados en el procesamiento digital de


imágenes tenemos [16]:

1. Descriptor de color. El color es una característica importante cuando se


requiere de la clasificación y descripción de objetos.
2. Descriptor de textura. Se basan en la vecindad, ya que la textura se define
para regiones y no para píxeles individuales, es muy utilizado para el
reconocimiento de objetos.
3. Descriptor de rasgos geométricos de un objeto. Son mediciones que pueden
ser usadas para describir un objeto, se obtienen a partir de los píxeles que
componen la región del objeto o los píxeles obtenidos del contorno del objeto;
dentro de estos descriptores encontramos:

- Área. Es igual a la suma de todos los píxeles correspondientes al objeto


dentro de la imagen.
- Perímetro. Se obtiene al sumar solamente los píxeles del contorno del
objeto.
- Centroide. Es un punto geométrico que se refiere a la parte central del
objeto.
- Factor de compacidad. Se define como el perímetro al cuadrado del objeto
dividido por 4π veces su área; el factor de compacidad será cercano a 1
para objetos circulares, mayor a 1 para objetos cuadrados y para otro tipo
de objetos se obtendrán valores más grandes. La importancia de este rasgo
característico radica en que es invariante a traslaciones, rotaciones y
cambios de escala.

36
2.2.2.4 Reconocimiento e interpretación

La última etapa en el procesamiento digital de imágenes es la que comprende el


reconocimiento e interpretación de forma; en esta etapa se asigna un significado, se
etiqueta o asigna un nombre a los objetos contenidos en la imagen basándose en las
características obtenidas en la etapa de descripción.

2.3 MatLab

El nombre de MatLab es una abreviatura de Matrix Laboratory (Laboratorio


Matricial), desde su aparición en los años 70, ha ido introduciéndose con fuerza en el
ámbito científico y universitario; en la actualidad es una de las principales
herramientas para el cálculo matemático, análisis de datos, simulación y visualización
de resultados. Una ventaja importante que presenta MatLab es el entrono gráfico de
trabajo, la claridad en la presentación de resultados y la versatilidad que presenta para
la creación de funciones [32].

Todas las operaciones que realiza MatLab se basan en una estructura de datos
matriciales; todas las funciones o comandos de MatLab se agrupan en las llamadas
toolbox, y abarcan diferentes campos, como son el análisis y adquisición de datos,
procesamiento de imágenes y de señales, análisis y diseño de sistemas de control,
comunicaciones, simulaciones en tiempo real y también herramientas para finanzas,
estadística, economía o lógica difusa [32].

MatLab utiliza varias ventanas, las principales se mencionan a continuación


[33]:

a) Ventana de comandos (Command Window). La ejecución de comandos o


funciones se realiza en esta ventana y el resultado de una ejecución se muestra
en la misma (Figura 2.40).

37
Figura 2.40 Ventana de comandos.

b) Historia de Comandos (Command History). Registra los comandos que se


escriben en la ventana de comandos; cuando se sale de MatLab o cuando se
escribe el comando clc, la ventana de comandos se limpia; sin embargo la
ventana de historia de comandos conserva una lista de todos los comandos que
se han utilizado (Figura 2.41).

Figura 2.41 Ventana historia de comandos.

c) Área de trabajo (Workspace). Esta ventana muestra las variables que se


definan conforme se ejecutan comandos (Figura 2.42).

38
Figura 2.42 Ventana del área de trabajo

d) Carpeta actual (current folder). Enlista todos los archivos contenidos en la


ubicación de la carpeta actual (Figura 2.43).

Figura 2.43 Ventana de carpeta actual.

MatLab puede almacenar información en variables y no se declaran con un tipo


de dato específico como en otros lenguajes de programación. MatLab trabaja con
números enteros, reales, cadenas de caracteres y esencialmente con vectores y matrices
numéricas rectangulares; los vectores se introducen entre corchetes y los elementos
están separados por espacios o comas, por ejemplo A = [1 2 3]; las matrices se
introducen por filas, los elementos de una misma fila están separados por espacios o
comas, mientras que las filas están separados por un punto y coma, por ejemplo A =
[1 2 3; 4 5 6; 7 8 9]. En MatLab se emplean matrices porque con ellas se puede

39
describir infinidad de cosas de una manera altamente flexible y matemáticamente
eficiente [28].

El toolbox de Procesamiento de Imágenes (Image Processing Toolbox) de


MatLab proporciona un conjunto de funciones para el desarrollo de aplicaciones y
nuevos algoritmos en el campo del procesamiento y análisis de imágenes; algunas de
sus funciones más importantes son [28]:

- Análisis de imágenes y estadística.


- Diseño de filtros y recuperación de imágenes.
- Mejora de imágenes.
- Operaciones morfológicas.
- Definición de mapas de colores y modificación gráfica.
- Operaciones geométricas.
- Transformación de imágenes.

MatLab almacena la mayoría de las imágenes como arreglos bidimensionales


(matrices) en los cuales cada elemento de la matriz corresponde a la intensidad de un
píxel de la imagen. Algunas imágenes, como las imágenes a color (RGB), requieren
de un arreglo tridimensional, donde el primer plano en el espacio tridimensional
representa la intensidad de rojo de los píxeles, el segundo plano representa la
intensidad de verde de los píxeles y el tercer plano la intensidad de azul de los píxeles
(Figura 2.44).

Figura 2.44 Representación de imagen RGB en MatLab [34].

40
El toolbox Image Acquisition 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. Utilizando el comando imaqhwinfo
de este toolbox se obtiene la información del adaptador de video instalado, versión de
Matlab, Toolbox (nombre y versión).

Con el comando imaqhwinfo(‘adaptador de video’) se obtiene la información


relacionada con el adaptador de video instalado en la PC, generalmente es winvideo; y
utilizando el comando imaqhwinfo(‘adaptador de video’, DeviceID) se muestra la
información (nombre, formatos soportados, etc.) del dispositivo conectado (cámara de
video) a la PC, donde DeviceID es el ID del dispositivo a utilizar, obtenido al emplear
el primer comando mencionado, si sólo se cuenta con un dispositivo conectado el
DeviceID será 1.

Para realizar una captación de video primero se crea un objeto de entrada de


video:

>>video=videoinput(‘adaptador de video’, DeviceID, ’Format’);

Si no se especifica “Format” se asume el formato por defecto; para realizar la


visualización del video a capturar se ejecuta el comando:

>>preview(video)

Para capturar una imagen se ejecuta el comando:

>>imagen=getsnapshot(‘video’);

El toolbox de procesamiento de imágenes maneja cuatro tipos básicos de


imágenes: indexadas, intensidad de grises, binarias y RGB. Para la lectura de una
imagen desde un archivo se utiliza el comando imread, y para mostrarla se utiliza el
comando imshow; a continuación se muestra un ejemplo para leer y mostrar una
imagen (Figura 2.45):

>> I=imread('C:\Users\User\Pictures\Photos\goku.png');

41
>>imshow(I)

Figura 2.45 Imagen leída y mostrada en MatLab.

Para realizar ciertas operaciones con una imagen es necesario convertirla a otro
tipo para que se facilite su procesamiento; los principales comandos usados en MatLab
para la conversión entre tipos de imágenes son:

- rgb2ind. Crea una imagen indexada a partir de una imagen RGB.


- gray2ind. Crea una imagen indexada a partir de una imagen de intensidad de
gris.
- im2bw. Crea una imagen binaria a partir de una imagen de intensidad de gris,
imagen indexada o RGB basado en un umbral de luminancia.
- ind2rgb. Crea una imagen RGB a partir de una imagen indexada.
- rgb2gray. Crea una imagen de intensidad de gris a partir de una imagen RGB.

A continuación se muestra un ejemplo para realizar la conversión de una


imagen en MatLab a otros tipos (Figura 2.46):
42
>> I=imread('C:\Users\User\Pictures\Photos\PIU Fiesta 2.jpg');
>>I_gris=rgb2gray(I);
>>umbral=graythresh(I_gris);
>>I_bin=im2bw(I);
>>subplot(2,2,1), imshow(I), title('Imagen Original');
>>subplot(2,2,2), imshow(I_gris), title('Imagen en Intensidad de Gris');
>>subplot(2,2,3), imshow(I_bin), title('Imagen Binaria');

Figura 2.46 Conversión de imagen RGB a intensidad de gris y binaria.

Dentro del entorno de trabajo de MatLab se pueden crear scripts y funciones,


programadas por el propio usuario, a través de los ficheros “.m”. Un scripts es una
secuencia de comandos que se pueden ejecutar cuando sea necesario y que se pueden
guardar en un archivo para no tener que escribirlos de nuevo. Las funciones son un
bloque de código estructurado que se ejecutan cuando son invocadas dentro de un
script y permiten añadir a MatLab funciones adicionales expandiendo así su capacidad.
Para crear una función en MatLab se utiliza la siguiente estructura y sintaxis:

43
function [Variables de retorno]=nombre-función (lista de argumentos)
Cuerpo de la función.
end

En la primera línea se especifica el nombre de la función, cuáles y cuantos


argumentos de entrada tiene, y cuáles y cuantos valores devuelve; el cuerpo de la
función contiene las sentencias necesarias para calcular los valores que la función va
a devolver. Puede haber funciones sin valor de retorno y también sin argumentos, si
no hay valores de retorno se omiten los corchetes y el signo igual, si solo hay un valor
de retorno no es necesario poner corchetes, y si no hay argumentos no hace falta poner
paréntesis.

2.4 Arduino

Arduino es una plataforma de electrónica abierta para la creación de prototipos basada


en software y hardware flexibles y fáciles de usar (Figura 2.47). Se creó para artistas,
diseñadores, aficionados y cualquiera interesado en crear entornos u objetos
interactivos. Arduino puede tomar información del entorno a través de sus pines de
entrada de toda una gama de sensores y puede afectar aquello que le rodea controlando
luces, motores y otros actuadores. El microcontrolador en la placa Arduino se
programa mediante el lenguaje de programación Arduino y el entorno de desarrollo
Arduino; los proyectos hechos con Arduino pueden ejecutarse sin necesidad de estar
conectado a un ordenador [35].

44
Figura 2.47 Tarjeta Arduino UNO [36].

Arduino nació en el año 2005 en el Instituto de Diseño Interactivo de Ivrea


(Italia), centro académico donde los estudiantes se dedicaban a experimentar con la
interacción entre humanos y diferentes dispositivos (muchos de ellos basados en
microcontroladores) para conseguir generar espacios únicos, especialmente artísticos.
Arduino apareció por la necesidad de contar con un dispositivo para utilizar en las
aulas que fuera de bajo costo, que funcionase bajo cualquier sistema operativo y que
contase con documentación adaptada a gente que quisiera empezar de cero. La idea
original fue, pues, fabricar la placa para uso interno de la escuela. No obstante, el
Instituto se vio obligado a cerrar sus puertas precisamente en 2005. Ante la perspectiva
de perder en el olvido todo el desarrollo del proyecto Arduino que se había ido llevando
a cabo durante aquel tiempo, se decidió liberarlo y abrirlo a “la comunidad” para que
todo el mundo tuviera la posibilidad de participar en la evolución del proyecto,
proponer mejoras, sugerencias y mantenerlo “vivo”. Y así ha sido: la colaboración de
muchísima gente ha hecho que Arduino poco a poco haya llegado a ser lo que es
actualmente: un proyecto de hardware y software libre de ámbito mundial. El principal
responsable de la idea y diseño de Arduino, y la cabeza visible del proyecto es el
llamado “Arduino Team”, formado por Massimo Banzi (profesor en aquella época del
Instituto Ivrea), David Cuartielles (profesor de la Escuela de Artes y Comunicación de
la Universidad de Mälmo, Suecia), David Mellis (por aquel entonces estudiante en
Ivrea y actualmente miembro del grupo de investigación High-Low Tech del MIT
Media Lab), Tom Igoe (profesor de la Escuela de Arte Tisch de Nueva York), y

45
Gianluca Martino (responsable de la empresa fabricante de los prototipos de las placas)
[37].

A continuación se describen algunos de los pines de la tarjeta Arduino:

- Digitales. Se pueden utilizar como entrada o salida, trabajan con señales de


tensión, funcionan a 5V y pueden suministrar hasta 40nA. Cuando llegan 5V o
más se interpreta como 1 (HIGH) y cuando llegan a 0V se interpreta como 0
(LOW).
- Analógicos. Tienen una resolución de 10 bits, retornando valores desde 0 a
1023, su uso principal es para la lectura de sensores analógicos.
- RX y TX. Se usan para transmisiones serie de señales TTL.
- PWM. Arduino dispone de pines de salida destinados a la generación de
señales PWM (modulación por ancho de pulso).
- SPI. Permiten llevar a cabo comunicaciones SPI.
- I2C. Permite establecer comunicaciones a través de un bus I2C (interconexión
de sistemas embebidos).

La tarjeta Arduino puede alimentarse directamente a través del cable USB que
realiza la comunicación de la tarjeta con la PC o mediante una fuente de alimentación
externa, los límites de alimentación están entre los 5 y los 12V.

Para programar la tarjeta Arduino es necesario descargarse de la página web de


Arduino el entorno de desarrollo (IDE) (Figura 2.48), el cual está disponible en
versiones para MAC, Windows y LINUX; además de tener el entorno de desarrollo es
necesario instalar los drivers incluidos al descargarlo. Lo primero que se tiene que
hacer para comenzar a trabajar en el entorno de desarrollo es configurar la
comunicación entre la tarjeta Arduino y la PC, para ello se debe abrir el menú “Tools”
y la opción “Serial Port”, en esta opción se deberá seleccionar el puerto serie al que
esté conectado la tarjeta.

46
Figura 2.48 Entorno de desarrollo de Arduino.

La estructura básica de un programa de Arduino es simple y divide la ejecución


en dos partes (Figura 2.49) [38]:

- Setup(). Constituye la preparación del programa, incluye el modo en que se


utilizaran los pines de la tarjeta y se trata de la primera función que se ejecuta
en el programa.
- Loop(). Incluye el código a ser ejecutado continuamente, leyendo las entradas
de la placa, salidas, etc.

Figura 2.49 Estructura básica de un programa de Arduino.

47
Las funciones principales utilizadas en la programación de la tarjeta Arduino
se describen a continuación [37]:

- pinMode(pin, mode). Se utiliza para configurar un pin para comportarse como


INPUT (entrada) u OUTPUT (salida).
- digitalRead(pin). Lee el valor desde un pin digital, devuelve un valor HIGH
(alto) o LOW (bajo).
- digitalWrite(pin, valor). Introduce un nivel bajo o alto en el pin digital.
- analogRead(pin). Lee el valor de un pin analógico específico con una
resolución de 10 bits, el valor resultante es un entero de 0 a 1023.
- analogWrite(pin, valor). Introduce un valor a un pin analógico.
- delay(ms). Realiza una pausa en el programa de acuerdo a la cantidad de tiempo
en milisegundos especificada.
- millis(). Devuelve la cantidad de milisegundos que lleva la placa Arduino
ejecutando el programa actual.
- Serial.begin(velocidad). Abre un puerto serie y especifica la velocidad de
transmisión (la velocidad típica es de 9600), se muestra en el Serial Monitor
del IDE de Arduino el contenido del puerto serie (mensajes, valores de
variables, etc.).
- Serialprintln(dato). Imprime datos al puerto serie seguido por un retorno de
línea automático.
- Serial.read(). Lee o captura un carácter desde el puerto serie.
- Serial.available(). Devuelve el número de caracteres disponibles para leer
desde el puerto serie.

2.5 Comunicación entre MatLab y Arduino

Para conectar la tarjeta Arduino con MatLab se pueden seguir los siguientes pasos:

1. Descargue el archivo “ArduinoIO.zip” de la página


http://www.mathworks.com/matlabcentral/fileexchange/27843-arduino-io-
package--slides-and-examples.

48
2. Descomprima el archivo en la carpeta deseada en el equipo, preferiblemente
en la carpeta Matlab, que está en “Mis Documentos”; de esta forma, los M-
files, quedan disponibles inmediatamente, en el directorio del entorno de
Matlab.
3. Desde el IDE Arduino, de acuerdo a lo que se necesite, abra alguno de los
archivos contenidos dentro de la carpeta “adiosrv”, que a su vez está dentro de
la carpeta “pde”, una de las que se descomprimió.
4. Cargue en la tarjeta, el programa que necesite, el cual contiene el código
necesario para que la tarjeta Arduino se comunique con Matlab.
5. Una vez cargado el programa en la tarjeta Arduino, es recomendable cerrar el
IDE ARDUINO, para que Matlab pueda acceder al puerto serial que se abre
cuando se conecta la tarjeta.
6. Abra MatLab y en la ventana “Current Directory” abra la carpeta que se
descomprimió, ahí debe estar el M-file “install_arduino”; ejecútelo para que se
instalen las funciones necesarias en MatLab para realizar la comunicación con
la tarjeta Arduino.

Para interactuar con la tarjeta Arduino, desde el entorno de Matlab;


primero se debe crear un objeto para acceder a la información del puerto de
comunicación a la que está conectada la tarjeta; esto se hace con el siguiente
comando: a = arduino(‘COM3’), entre paréntesis figura el puerto serial al que
se conectó la Arduino, en este ejemplo es “COM3”, pero puede ser cualquier
otro. Al ejecutar el comando anterior en la ventana de comandos de MatLab,
se inicia una conexión y aparecerá en pantalla un texto informativo sobre la
configuración de entradas, salidas y estado actual de los pines de la tarjeta
Arduino (Figura 2.50).

49
Figura 2.50 Comunicación MatLab-Arduino.

Los pines de la tarjeta Arduino que permiten conectar el sistema a dispositivos


externos, pueden configurarse como entradas o como salidas y a su vez, en forma
digital o análoga. El procedimiento para configurar los pines como entradas o como
salidas es “pinMode”. A continuación se muestran algunos ejemplos:

- a.pinMode(13, ‘OUTPUT’). Este comando, configura el pin 13 de la tarjeta


Arduino, como salida digital.
- a.pinMode(10, ‘INPUT’). Configura el pin 10, como entrada digital.
- a.pinMode(11). Muestra el estado, de entrada o salida del pin 11
- a.pinMode. Muestra el listado del estado de cada uno de los pines.

Si un pin ha sido configurado como entrada, el comando para leerlo es:


a.digitalRead(10), que permite leer el estado alto “1” o bajo “0” del pin 10.

Si un pin ha sido configurado como salida, para colocar un estado alto “1” o
bajo “0” en dicha salida, se usa el comando: a.digitalWrite(13, 1) o a.digitalWrite(13,
0).

Las entradas análogas, son pines de la tarjeta Arduino, que pueden recibir
voltajes en un rango de 0 a 5 voltios; útiles cuando se requiere un sensor que represente
el valor de una variable análoga, como por ejemplo: la temperatura. Suministran un

50
valor entero entre 0 y 1023, proporcional al valor de voltaje de la entrada análoga. El
comando para leer es: a.analogRead(5), el cual muestra el valor presente en la entrada
análoga 5. Para asignar un valor análogo a un pin de salida, se sigue el siguiente
formato: a.analogWrite(3, 200), el primer argumento de la función, es el pin análogo
y el segundo argumento es un valor proporcional al voltaje de salida presente en ese
pin.

2.6 Servomotor

Un servomotor es un motor que puede poner su eje en una determinada posición a


través de una señal eléctrica de control, de esta manera modificando el valor de la
señal, el servomotor se puede posicionar en cualquier ángulo en un rango de 0° a 45°,
0° a 90°, 0° a 180°, 0° a 210° (dependiendo del tipo y modelo). Los servomotores son
sumamente útiles en robotica y en aplicaciones en donde se requiere mucha fuerza con
precisión en su funcionamiento. Los componentes internos de un servomotor se
describen a continuación (Figura 2.51) [39]:

- Motor. Es el elemento que le brinda movilidad al servomotor.


- Engranajes reductores. Se encargan de convertir gran parte de la velocidad
de giro del motor en torque.
- Circuito de control. Es el encargado del control de la posición del eje del
motor, recibe los pulsos de entrada y ubica el eje en su nueva posición.
- Potenciómetro (resistencia variable). Está conectada al eje del motor, permite
al circuito de control supervisar el ángulo actual del motor, si el ángulo es el
correcto el servomotor está apagado y si no es el correcto el servomotor gira
hasta llegar al ángulo correcto.

51
Figura 2.51 Componentes internos de un servomotor [39].

Para el control de los servomotores se utiliza la modulación por anchura de


pulso PWM (Pulse Width Modulation), esta consiste en generar una onda cuadrada en
la que varía el tiempo en el que el pulso está a nivel alto, el ángulo del servomotor está
determinado por la duración del pulso que se aplica al circuito de control.

Como se observa en la Figura 2.52, la duración del pulso indica o dictamina el


ángulo del eje del servomotor (mostrado como un círculo verde con flecha), los
tiempos 1.5 ms (milisegundo) y 1.75 ms de anchura del pulso, dejan el eje del motor
en los extremos (0° y 180°), el valor 1.5 ms indicaría la posición central o neutral (90°)
[40].

Figura 2.52 Duración del pulso y ángulo del eje de un servomotor [40].

52
Capítulo III. Marco Metodológico

La realización del trabajo se llevó a cabo mediante diseño experimental, debido a las
diversas variables que intervienen en el sistema para cumplir con su objetivo principal.
El desarrollo del proyecto se divide en las siguientes partes:

1. Desarrollo de algoritmo para el reconocimiento de forma y color en imágenes


almacenadas en la PC.
2. Diseño y elaboración del brazo robótico.
3. Desarrollo de Interfaz Gráfica de Usuario en MatLab para la manipulación del
brazo robótico y el reconocimiento de forma o color a través de una webcam.

3.1 Desarrollo de algoritmo para el reconocimiento de forma y color en imágenes


almacenadas en la PC

Como primer paso se realizó en MatLab una función llamada “ColorRGB” (Anexo
B), con la cual se detecta si el objeto presente en las imágenes de prueba utilizadas
(Anexo A) es de color Rojo, Verde o Azul; esta función recibe como entrada una
imagen a color y como salida nos da el color predominante detectado en el objeto
presente en la imagen.

Después de realizar la función de reconocimiento de color se procedió al


desarrollo de una función llamada “Propiedades” (Anexo C), la cual recibe como
entrada una imagen a color y como salida nos proporciona las características del objeto
presentes en la imagen (área en píxeles, perímetro en píxeles y factor de compacidad),
también como salida nos da la imagen convertida a intensidad de gris y binaria.

Tomando en cuenta las propiedades obtenidas de los objetos contenidos en las


imágenes, se desarrolló una función llamada “DeteccionForma” (Anexo D) para
reconocer la forma del objeto en base a su factor de compacidad; esta función recibe
como entrada una imagen y como salida nos da el nombre de la forma del objeto

53
presente en la imagen (círculo, cuadrado, estrella, rombo o triangulo), su área en
pixeles, el perímetro en pixeles y las coordenadas del centroide.

Como siguiente paso se elaboró un script llamado “DeteccionFunciones”


(Anexo E) que nos permitiera seleccionar alguna de las imágenes de prueba para la
identificación de la forma y el color del objeto presente en la imagen utilizando las
funciones ya elaboradas. Este script nos permite seleccionar si lo que se desea es
reconocer color, forma o ambas (Figura 3.1); después de haber elegido el tipo de
reconocimiento se selecciona la imagen que se desea procesar, para que posteriormente
se muestre la imagen y se vayan enumerando los objetos presentes en la misma (Figura
3.2), dándose al mismo tiempo mediante sonido el reconocimiento de acuerdo al tipo
de reconocimiento seleccionado, por último en un cuadro de diálogo se muestra el
conteo de los objetos de acuerdo al tipo de reconocimiento elegido (Figura 3.3).

Figura 3.1 Selección del tipo de reconocimiento.

54
Figura 3.2 Enumeración de los objetos presentes en la imagen.

Figura 3.3 Conteo de objetos de acuerdo al tipo de reconocimiento seleccionado.

55
3.2 Diseño y elaboración del brazo robótico

El brazo robótico que se elaboro fue un SCARA (Selective Compliant Articulated


Robot Arm/Brazo robot articulado de respuesta selectiva) con dos grados de libertad
(articulaciones); este tipo de robot se comporta de forma parecida al brazo humano,
permitiendo ubicar el extremo de este en cualquier ubicación pero siempre sobre el
plano en el que trabaja, se suele utilizar en procesos de ensamblaje y clasificación.

El diseño del brazo robot se realizó en SolidWorks, en la Figura 3.4 se puede observar
el diseño elaborado.

Figura 3.4 Diseño del brazo robótico.

Al tener el diseño se procedió a la construcción del brazo robot, el cual se


muestra terminado en la Figura 3.5.

56
Figura 3.5 Brazo robótico terminado.

Para el movimiento de las articulaciones del robot se utilizaron servomotores;


en la Tabla 3.1 se muestran las especificaciones de los servomotores utilizados.

Tabla 3.1 Especificaciones de servomotores

Modelo: SRT4K3A
Torque: 3.8Kg a 4.8V, 4.3Kg a &V
Velocidad: 0.21s/60° a 4.8V, 0.17s/60° a 6V
Voltaje: 4.8V a 6V

En la Figura 3.6 se muestran las conexiones realizadas de los servomotores con


la tarjeta Arduino; el control de la posición de estos se realizó mediante la
comunicación entre MatLab y Arduino.

57
Figura 3.6 Conexión de servomotores.

Al terminar la elaboración del brazo robot y haber desarrollado las conexiones


necesarias, la cámara se colocó en el extremo final del brazo robot (Figura 3.7).

Figura 3.7 Brazo robótico con cámara.

Las características de la WebCam utilizada se muestran en la Tabla 3.2.

58
Tabla 3.2 Características de WebCam
Sensor de imagen: CMOS CIF
Resolución: Captura de foto: 0.3 megapíxeles
Captura de video: 0.1 megapíxeles
Campo de visión: 45°-60° diagonalmente
Gama de enfoque: 30cm~
Interfaz: USB ver. 1.1

3.3 Desarrollo de Interfaz Gráfica de Usuario en MatLab para la manipulación


del brazo robótico y el reconocimiento de forma o color a través de una webcam.

Como última parte en el desarrollo del proyecto se elaboró una Interfaz Gráfica de
Usuario (GUI) en MatLab para manipular el brazo robot y realizar el reconocimiento
de forma o color utilizando una webcam (Anexo F).

En esta interfaz se utilizaron las funciones desarrolladas “ColorRGB” y


“DeteccionForma”; para que se realizara un adecuado reconocimiento de las formas
contenidas en las imagen adquiridas a través de la webcam se modificó la función
“DeteccionForma” de acuerdo a las propiedades de las figuras de prueba (Anexo G)
obtenidas mediante la función “Propiedades,.

En la Figura 3.8 se muestra de forma general el funcionamiento de la interfaz


gráfica desarrollada.

59
Figura 3.8 Funcionamiento de la interfaz gráfica.

Al inicializarse la interfaz gráfica, se comienza a realizar la comunicación entre


MatLab y Arduino, si ocurre algún error con el inicio de la comunicación se muestra
un cuadro de diálogo solicitando se compruebe la conexión de la tarjeta Arduino
(Figura 3.9) y se cancela el inicio de la interfaz.

Figura 3.9 Mensaje de error al no realizarse la comunicación MatLab-Arduino.

Al no tenerse ningún error con respecto a la comunicación con Arduino, la


interfaz se iniciara, teniéndose como únicas opciones los botones “Configurar
Cámara” y “Salir” (Figura 3.10).

60
Figura 3.10 Opciones iniciales de la interfaz gráfica.

Al presionar el botón de “Configurar Cámara” se muestra un cuadro de


diálogo (Figura 3.11) para seleccionar el adaptador de video instalado en la PC
(comúnmente se utiliza winvideo) de la cámara que se desee utilizar, para
posteriormente seleccionar el ID de la cámara (Figura 3.12) y el formato que se desea
utilizar (Figura 3.13).

Figura 3.11 Selección del adaptador de video.

61
Figura 3.12 Selección del ID de la cámara.

Figura 3.13 Selección del formato.

Si ocurre algún error en la configuración de la cámara se mostrará un cuadro


de diálogo solicitando se configure correctamente la cámara (Figura 3.14).

Figura 3.14 Mensaje de error al no configurar correctamente la cámara.

62
Al haber finalizado correctamente la configuración de la cámara, el botón
“Visualizar Video” estará habilitado y se deshabilitará el botón de “Configurar
Cámara” (Figura 3.15).

Figura 3.15 Botón “Visualizar Video” habilitado.

Al presionar el botón “Visualizar Video”, este se deshabilitará; al mismo


tiempo se mostrará el video captado por la cámara seleccionada, se habilitarán las
opciones para realizar la manipulación de las articulación del brazo robot y se podrá
seleccionar el tipo de reconocimiento que se desee realizar (Figura 3.16).

63
Figura 3.16 Opciones de control del brazo robot y de reconocimiento habilitadas.

Para el control del brazo robot se utilizaron dos barras de desplazamiento, con
las cuales cada articulación se puede mover de 0° a 180°. Al seleccionar alguna de las
opciones de reconocimiento las otras se deshabilitan y se habilitan los botones de
“Cambiar Opción” y “Reconocer” (Figura 3.17).

Figura 3.17 Selección de tipo de reconocimiento.

64
Al presionar el botón “Reconocer” se muestran los resultados obtenidos de
acuerdo a la opción de reconocimiento seleccionada; al mismo tiempo sin importar el
tipo de reconocimiento elegido se mostraran el área, perímetro y centroide del objeto
presente en la imagen (Figura 3.18).

Figura 3.18 Resultados mostrados en la interfaz gráfica.

Al presionar el botón “Cambiar Opción” todas las opciones de reconocimiento


se habilitaran (Figura 3.19), para así poder cambiar el tipo de reconocimiento
anteriormente seleccionado.

65
Figura 3.19 Cambio de tipo de reconocimiento.

La interfaz gráfica se finaliza al presionar el botón “Salir”; al presionar este


botón, se muestra un cuadro de diálogo para confirmar si se desea o no salir de la
interfaz (Figura 3.20); al seleccionar afirmativamente, se limpia la ventana de
comandos, se borran las variables existentes y se finaliza la comunicación entre
MatLab y Arduino; en caso contrario, al seleccionar que no se desea salir, se continua
en la interfaz gráfica.

Figura 3.20 Confirmación de terminar la interfaz gráfica.

66
Capítulo IV. Análisis de Resultados

Con las propiedades obtenidas de las imágenes de prueba y de las figuras de prueba se
realizaban las modificaciones necesarias en la función “DeteccionForma”, para que
el reconocimiento de las formas se realizara adecuadamente; la propiedad que se
utilizó para el reconocimiento de la forma del objeto contenido en una imagen
almacenada o captada por la webcam fue el Factor de Compacidad.

4.1 Propiedades de los objetos presentes en las imágenes de prueba

En la Tabla 4.1 se muestran las propiedades obtenidas de los objetos contenidos dentro
de las imágenes de prueba mediante la función “Propiedades”.

Tabla 4.1 Propiedades de los objetos contenidos dentro las imágenes de prueba.

Figura Color Área Perímetro Factor de Compacidad


Azul 40407 750 1,1078
Círculo Rojo 40415 749 1,1046
Verde 40409 752 1,1136
Azul 52210 910 1,2622
Cuadrado Rojo 52210 910 1,2622
Verde 52210 910 1,2622
Azul 16736 920 4,0245
Estrella Rojo 16736 918 4,0070
Verde 16733 920 4,0252
Azul 17392 578 1,5286
Rombo Rojo 17503 580 1,5294
Verde 17385 578 1,5292
Azul 26195 776 1,8296
Triángulo Rojo 26192 776 1,8296
Verde 26192 776 1,8296

67
4.2 Propiedades obtenidas de las figuras de prueba

En la Tabla 4.2 se muestran las propiedades obtenidas de las figuras de prueba


utilizadas; para obtener estas propiedades, la imagen captada por la webcam se procesó
mediante la función “Propiedades”, se establecieron rangos de acuerdo a los datos
obtenidos en las diversas pruebas realizadas.

Tabla 4.2 Propiedades de las figuras de prueba.

Figura Color Área Perímetro Factor de Compacidad


Círculo Rojo 40187-47194 780-846 1.16-1.30
Cuadrado Rojo 47810-54024 891-959 1.31-1.40
Estrella Verde 80622-88444 1536-1587 2.17-2.39
Rombo Verde 36428-44437 817-871 1.41-1.51
Triángulo Azul 38195-41699 972-1010 1.93-2.0

Al realizar diversas pruebas del sistema desarrollado se observó que la


iluminación presente en el entorno afecta el reconocimiento de la forma y color de los
objetos; este problema se solucionó posteriormente implementando un sistema de
iluminación led, obteniéndose mejores resultados.

Como parte final en el proyecto, el brazo robótico se integró con una banda
transportadora para realizar el reconocimiento de forma o color de los objetos
transportados en ella.

Figura 4.1 Brazo robótico integrado a una banda transportadora.

68
Conclusiones

 Se desarrolló una función en MatLab para el reconocimiento de los colores


rojo, verde y azul.
 Se desarrolló una función en MatLab para determinar las propiedades (área,
perímetro y factor de compacidad) de un objeto contenido en una imagen.
 Se desarrolló una función en MatLab para el reconocimiento de 5 figuras
(círculo, cuadrado, estrella, rombo y triángulo) en base a su factor de
compacidad.
 Se realizó la comunicación entre MatLab y Arduino para la manipulación del
brazo robótico.
 Se elaboró una interfaz gráfica de usuario (GUI) en MatLab para realizar la
manipulación del brazo robótico y el reconocimiento de formas o colores a
través de una webcam.

69
Recomendaciones

 El sistema desarrollado en este proyecto solo realiza el reconocimiento de tres


colores (Rojo, Verde y Azul), este reconocimiento se puede ampliar al utilizar
otro modelo de color.
 Al elegir la cámara a utilizar se debe de tener cuidado de la resolución a la que
esta capture la imagen, ya que cuanto mayor resolución tenga la imagen, el
tiempo de procesamiento de la imagen en la computadora se verá
incrementado.
 El reconocimiento de formas se puede realizar también empleando algoritmos
de detección de bordes.
 Para tener un adecuado reconocimiento de color y forma se debe de tener una
adecuada iluminación.

70
Referencias

[1] Reyes Cortés, Fernando (2011), Robótica, Control de Robots Manipuladores,


Alfaomega, México, D.F.

[2] Fuller, J.L. (1999), Robotics: Introduction, Programming, and Proyect, Prentice
Hall, Nueva Jersey.

[3] Dorf, R.C. (1988), International Encyclopedia of Robotics, John Wiley & Sons,
Nueva York,

[4] Kumar Saha, Subir (2010), Introducción a la robótica, Mc Graw Hill, México,
D.F.

[5] A. Barrientos, L. F., Peñín, C., Balaguer, R. Aracil (1997), Fundamentos


de robótica, Mc Graw Hill, Madrid, España.

[6] Ruiz de Garibay Pascual, Robótica: Estado del Arte, Recuperado el 12 de agosto
de 2014, de: https://www.academia.edu/913608/Robotica_Estado_del_arte.

[7] S. Mosher, Ralph, Handyman to Hardiman, Recuperado el 12 de agosto de 2014,


de: http://cyberneticzoo.com/wp-content/uploads/2010/04/Mosher-Handyman-to-
Hardiman-1967.pdf.

[8] Montero Gómez, Miguel Eduardo (2012), Sistemas de Visión, Recuperado el 13 de


agosto de 2014, de: http://es.slideshare.net/MiguelMontero1/visin-artificial-
13286354.

[9] Girod Fortuño, Anton (2008), Sistema de localización relativa basada en visión
artificial, Universitat Rovira I Virgili, Recuperado el 15 de agosto de 2014, de:
http://deeea.urv.cat/public/PROPOSTES/pub/pdf/1295pub.pdf.

71
[10] Cárdenas Vera, Martín Fernando, Llerena Pizarro, Omar Rosendo (2012),
Automatización de un Sistema de Centrado de Componentes Utilizando Visión
Artificial, Universidad Politécnica Salesiana Sede Cuenca, Ecuador, Recuperado el 18
de agosto de 2014, de: http://dspace.ups.edu.ec/bitstream/123456789/1109/14/UPS-
CT002210.pdf.

[11] Veléz Serrano, José Francisco, Moreno Díaz, Ana Belén, Sánchez Calle, Ángel,
Sánchez Marín, José Luis Esteban (2003), Visión por Computador, Recuperado el 18
de agosto de 2014, de: http://www.escet.urjc.es/~visionc/VisionPorComputador.pdf.

[12] Fotonostra, Partes del ojo humano, Consultado el 20 de agosto de 2014, en:
http://www.fotonostra.com/digital/partesojo.htm.

[13] La visión, Consultado el 20 de agosto de 2014, en:


http://www.braincampaign.org/Common/Docs/Files/2786/spchap6.pdf.

[14] Maduell i García, Eloi, Visión artificial, Universitat Oberta de Cataluya,


Recuperado el 22 de agosto de 2014, de: https://es.scribd.com/doc/233704526/Vision-
Artificial-Eloi-Maduelli.

[15] Campos, Miguel Ángel (2012), Metamateriales y nanotecnología: el camino


hacia la invisibilidad, Recuperado el 24 de agosto de 2014, de:
http://www.libertaddigital.com/ciencia-tecnologia/ciencia/2012-11-6/metamateriales-
y-nanotecnologia-el-camino-hacia-la-invisibilidad-1276473522/.

[16] García Santillán, Elías (2008), Detección y clasificación de objetos dentro de un


salón de clases empleando técnicas de procesamiento digital de imágenes,
Universidad Autónoma Metropolitana, Recuperado el 1 de septiembre, de:
http://newton.azc.uam.mx/mcc/01_esp/11_tesis/tesis/terminada/080513_garcia_santil
lan_elias.pdf.

[17] Espacios de color, Recuperado el 2 de septiembre de 2014, de:


http://bibing.us.es/proyectos/abreproy/11875/fichero/Proyecto+Fin+de+Carrera%252
F3.Espacios+de+color.pdf.

72
[18] Modelo HSV, Recuperado el 2 de septiembre de 2014, de:
http://cindy2906.blogspot.mx/2013/02/modelo-hsv.html

[19] Aplicación práctica de la visión artificial en el control de procesos industriales,


Recuperado el 3 de septiembre de 2014, de:
http://www.infoplc.net/files/documentacion/vision_artificial/infoPLC_net_Conocimi
entos_vISIONARTIFICIAL.pdf.

[20] Sistemas de visión artificial, Recuperado el 3 de septiembre de 2014, de:


http://formacion.faico.org/Proyectos/ROBINDUSTRIA/SistemasDeVisionArtificial.
htm.

[21] Ortega Marroquín, Pedro Ernesto, Pocasangre León, Emerson Francisco, Valle
Figueroa, Fernando Antonio (2004), Universidad Don Bosco, Sistema de inspección
basado en visión artificial aplicado a un proceso industrial, Recuperado el 4 de
septiembre de 2014, de:
http://rd.udb.edu.sv:8080/jspui/bitstream/123456789/270/1/034512_tesis.pdf.

[22] Benítez P., José C., Procesamiento de imágenes y visión artificial, Universidad
Tecnológica del Perú, Recuperado el 5 de septiembre de 2014, de:
http://es.slideshare.net/jcbp_peru/utp-pdiyvasap2-iluminacion-y-modos-de-color-
35136789.

[23] Visión Artificial, Recuperado el 5 de septiembre, de:


http://www.etitudela.com/celula/downloads/visionartificial.pdf.

[24] Trabocchi, Osvaldo, Sanfilippo, Fabián (2005), Aspectos de un Sistema de Visión


Artificial, Recuperado el 5 de septiembre de 2014, de:
http://iaci.unq.edu.ar/materias/vision/archivos/apuntes/Aspectos%20de%20un%20Pr
oyecto%20de%20Visi%C3%B3n%20Artificial.pdf.

[25] Cámaras, Recuperado el 6 de septiembre de 2014, de:


http://pserv.udg.edu/Portal/Uploads/4103862/CAMARAS_Infaimon.pdf

73
[26] González Marcos, Ana, Martínez de Pisón Ascacíbar, Francisco Javier, Pernía
Espinoza, Alpha Verónica, Alba Elías, Fernando, Castejón Limas, Manuel, Ordieres
Meré, Joaquín, Vergara González, Eliseo (2006), Técnicas y algoritmos básicos de
Vision Artificial, Universidad de la Rioja, España.

[27] García Fernández, Francisco Javier (2009), Reconocimiento de objetos en una


cocina con una webcam, Universidad Carlos III de Madrid, España.

[28] García Santillán, Iván Danilo (2008), Visión Artificial y Procesamiento Digital
de Imágenes usando MatLab, Pontifica Universidad Católica del Ecuador Sede Ibarra,
Ecuador, Recuperado el 8 de septiembre de 2014, de:
https://es.scribd.com/doc/226655280/Vision-Artificial-y-Procesamiento-Digital-de-
Imagenes-Usando-Matlab

[29] Imagen digital: Conceptos básicos, Recuperado el 8 de septiembre de 2014, de:


http://platea.pntic.mec.es/~lgonzale/tic/imagen/conceptos.html.

[30] Flores Pulido, Leticia, Tipos de imágenes digitales, Recuperado el 8 de


septiembre de 2014, de: http://aicitel.files.wordpress.com/2011/08/clase3_pdi.pdf.

[31] Vargas Baeza, Víctor (2010), Sistema de Visión Artificial para el Control de
Calidad en Piezas Cromadas, Instituto Politécnico Nacional, México, D.F.,
Recuperado el 9 de septiembre de 2014, de:
http://tesis.ipn.mx/bitstream/handle/123456789/7250/68.pdf?sequence=1.

[32] Pinto Bermúdez, Enrique, Matía Espada, Fernando (2010), Fundamentos de


Control con MatLab, Pearson, Madrid, España.

[33] Moore, Holly (2007), MatLab para Ingenieros, Pearson, México.

[34] Procesamiento digital de imágenes con MatLab, Consultado el 13 de septiembre


de 2014, en: http://es.slideshare.net/lonely113/procesamiento-digital-de-imgenes-con-
matlab

74
[35] Arduino, Consultado el 13 de septiembre de 2014, en:
http://www.arduino.cc/es/pmwiki.php?n=.

[36] Arduino UNO R3, Consultado el 14 de septiembre de 2014, en:


http://5hertz.com/index.php?main_page=product_info&products_id=390

[37] Torrente Artero, Óscar (2013), Arduino, Curso práctico de formación,


Alfaomega, México.

[38] Pomares Baeza, Jorge (2009), Manual de Arduino, Universidad de Alicante


Recuperado el 16 de septiembre de 2013, de:
http://rua.ua.es/dspace/bitstream/10045/11833/1/arduino.pdf.

[39] Servomotor, Recuperado el 18 de septiembre de 2014, de:


http://es.slideshare.net/Martinfeg/servomotor.

[40] López, German, Margni, Santiago (2003), Motores y Sensores en Robótica,


Universidad de la República Oriental del Uruguay, Recuperado el 18 de septiembre de
2014, de: http://www.fing.edu.uy/inco/grupos/mina/pGrado/construccion2003/
Documentos/Motores%20y%20Sensores.doc.

75
Anexos

Anexo A: Imágenes de prueba

Figura A.1 Círculo azul. Figura A.2 Círculo rojo.

Figura A.3 Círculo verde. Figura A.4 Cuadrado azul.

Figura A.5 Cuadrado rojo. Figura A.6 Cuadrado verde.

76
Figura A.7 Estrella azul. Figura A.8 Estrella roja.

Figura A.9 Estrella verde. Figura A.10 Rombo azul.

Figura A.11 Rombo rojo. Figura A.12 Rombo verde.

77
Figura A.13 Triángulo azul. Figura A.14 Triángulo rojo.

Figura A.15 Triángulo verde.

Figura A.16 Algunas imágenes de prueba colocadas en una sola.

78
Anexo B: Función “ColorRGB”

function ColorDetectado=ColorRGB(Imagen)
%Esta Función devuelve como resultado el color RGB de una imagen.

%%Se determina la banda de color de la sección recortada y se


%%almacena en 3 arreglos para cada componente
BandaRoja = Imagen(:, :, 1);
BandaVerde = Imagen(:, :, 2);
BandaAzul = Imagen(:, :, 3);

%%Se realiza un umbral para cada componente para posteriormente


%%compararlos
Rojo=graythresh(BandaRoja);
Verde=graythresh(BandaVerde);
Azul=graythresh(BandaAzul);

%%Se realiza una comparación para determinar el color de la


%%figura que se encuentra en la imagen
Color='Color desconocido...';
if (Rojo > Verde)
a=Rojo;
if a > Azul
Color='Rojo';
end
end

if(Verde > Rojo)


a=Verde;
if(Verde > Azul)
Color='Verde';
end
end

if (Azul > Rojo)


a=Azul;
if (a > Verde)
Color='Azul';
end
end
ColorDetectado=Color;
end

79
Anexo C: “Función Propiedades”

function [Area,Perimetro,Compacidad,imagengris,imagenbinaria]=Propiedades(imagen)
%Esta Función devuelve como resultado la conversión de una Imagen Original
%en Escala de Gris y Binaria; también proporciona el Área, Perímetro y
%Compacidad de objetos presentes en la imagen con un área mayor a 10000

%%La imagen se convierte primero a escala de grises y después a binaria


imagengris=rgb2gray(imagen);
umbral=graythresh(imagengris);
imagenbinaria1=~im2bw(imagengris,umbral);
imagenbinaria=bwareaopen(imagenbinaria1,3500);
[L,Ne]=bwlabel(imagenbinaria);

%%Determinación de las propiedades de cada elemento de la imagen binaria


propiedades=regionprops(L,'Centroid','Area','Perimeter');
clc;
%%Detección de las propiedades de cada elemento de la figura
for m=1:length(propiedades)

%%Se almacenan en variables las propiedades área y perímetro del


%%elemento "m" en la imagen binaria
Perimetro=round(propiedades(m).Perimeter)
Area=round(propiedades(m).Area)

%%Calculo de la Compacidad
Compacidad=(Perimetro^2)/(4*pi*Area)
end
end

80
Anexo D: Función “DeteccionForma”

function [FormaDetectada,Area,Perimetro,Centroide]=DeteccionForma(Imagen)

%Esta Función devuelve como resultado la forma que se encuentra en una


%imagen (Circulo, Cuadrado, Estrella, Rombo o Triangulo)

%%La imagen se convierte primero a escala de grises y después a binaria


imagengris=rgb2gray(Imagen);
umbral=graythresh(imagengris);
imagenbinaria1=~im2bw(imagengris,umbral);
%%Se eliminan las los objetos con área menor a 20000
imagenbinaria=bwareaopen(imagenbinaria1,20000);
%%Etiquetado de los elementos existentes en la imagen binaria
[L,Ne]=bwlabel(imagenbinaria);

%%Determinación de las propiedades de cada elemento de la imagen binaria


propiedades=regionprops(L,'Area','Perimeter','BoundingBox','Centroid');

%%Detección de las propiedades de cada elemento de la figura

for m=1:length(propiedades)
%%Se almacenan en variables las propiedades área y perímetro del
%%elemento "m" en la imagen binaria
Perimetro=round(propiedades(m).Perimeter);
Area=round(propiedades(m).Area);
Centroide=propiedades(m).Centroid;
%%Calculo de la Compacidad
Compacidad=(Perimetro^2)/(4*pi*Area);

%%A partir del Factor de Compacidad caracterizado de cada figura se


%%determina mediante una comparación que figura es
Forma='Desconocida';
if (Compacidad>1.09) && (Compacidad<1.19)
Forma='Un Círculo';
end
if (Compacidad>1.20) && (Compacidad<1.42)
Forma='Un Cuadrado';
end
if (Compacidad>1.41) && (Compacidad<1.50)
Forma='Un Rombo';
end
if (Compacidad>1.79) && (Compacidad<2.19)
Forma='Un Triángulo';
end
if (Compacidad>2.2) && (Compacidad<2.39)
Forma='Una Estrella';
end
end
FormaDetectada=Forma;
end

81
Anexo E: Script “DeteccionFunciones”

%%Se limpia la ventana de comandos, se cierran todas las ventanas y


%%se borran todas las variables existentes
clc; clear all; close all;

%%Variables para contar número de figuras total, por color y forma


CirculoRojo=0; CirculoAzul=0; CirculoVerde=0;
CuadradoRojo=0; CuadradoAzul=0; CuadradoVerde=0;
EstrellaRoja=0; EstrellaAzul=0; EstrellaVerde=0;
RomboRojo=0; RomboAzul=0; RomboVerde=0;
TrianguloRojo=0; TrianguloAzul=0; TrianguloVerde=0;

%%Se muestran las diversas opciones para procesar la imagen


Opcion = menu('Seleccione una opción','1. Detección de forma', '2. Detección de
color', '3. Detección de forma y color');

%%Si se ha seleccionado alguna opción el programa se ejecuta


if Opcion > 0
Seleccion = Opcion;

m1=msgbox('En el siguiente cuadro de dialogo seleccione la imagen


a procesar...', 'Reconocimiento');
waitfor(m1);
[nombre,direccion]=uigetfile('*.jpg');

%%Se almacena el archivo seleccionado en una variable


imagen = imread([direccion,nombre]);

%%Se muestra en una figura la imagen original


imshow(imagen), title('Imagen Seleccionada');

%%La imagen se convierte primero a escala de grises y después a


%%binaria
imagengris=rgb2gray(imagen);
umbral=graythresh(imagengris);
imagenbinaria=~im2bw(imagengris,umbral);

%%Etiquetado de los elementos existentes en la imagen binaria


[L,Ne]=bwlabel(imagenbinaria);

%%Determinación de las propiedades de cada elemento de la imagen


%%binaria
Propiedades=regionprops(L,'Area','Perimeter','Centroid',
'BoundingBox');

%%Detección de las propiedades de cada elemento de la figura


for m=1:length(propiedades)
%%Mediante la propiedad BoundingBox y la imagen binaria se
%%determina la sección a recortar en la imagen original para
%%determinar el color y forma
seccion=propiedades(m).BoundingBox;
recorte=imcrop(imagen,seccion);
imagengrisrecorte=rgb2gray(recorte);
umbralrecorte=graythresh(imagengrisrecorte);
imagenbinariarecorte=~im2bw(imagengrisrecorte,umbralrecorte);

%%Determinación de las coordenadas de la centroide del


%%elemento "m" en la imagen original binaria
x=propiedades(m).Centroid(1);
y=propiedades(m).Centroid(2);

%%Se enumera cada elemento de la imagen original binaria y se


%%va mostrando en la ventana donde se observa la imagen
%%%original
text(x,y,num2str(m),'EdgeColor','w');
pause(1)

%%Mediante la función "ColorRGB" se determina el color de la


%%sección recortada
Color=ColorRGB(recorte);

%%Mediante la función "DeteccionForma" se determina la forma


%%que hay en la sección recortada

82
Figura=DeteccionForma(recorte);

%%Conteo de figuras según forma y color


if strcmp(Figura,'Es un Circulo')==1;
if strcmp(Color,'Rojo')==1;
CirculoRojo=CirculoRojo+1;
end
if strcmp(Color,'Azul')==1;
CirculoAzul=CirculoAzul+1;
end
if strcmp(Color,'Verde')==1;
CirculoVerde=CirculoVerde+1;
end
end

if strcmp(Figura,'Es un Cuadrado')==1;
if strcmp(Color,'Rojo')==1;
CuadradoRojo=CuadradoRojo+1;
end
if strcmp(Color,'Azul')==1;
CuadradoAzul=CuadradoAzul+1;
end
if strcmp(Color,'Verde')==1;
CuadradoVerde=CuadradoVerde+1;
end
end

if strcmp(Figura,'Es una Estrella')==1;


if strcmp(Color,'Rojo')==1;
EstrellaRoja=EstrellaRoja+1;
end
if strcmp(Color,'Azul')==1;
EstrellaAzul=EstrellaAzul+1;
end
if strcmp(Color,'Verde')==1;
EstrellaVerde=EstrellaVerde+1;
end
end

if strcmp(Figura,'Es un Rombo')==1;
if strcmp(Color,'Rojo')==1;
RomboRojo=RomboRojo+1;
end
if strcmp(Color,'Azul')==1;
RomboAzul=RomboAzul+1;
end
if strcmp(Color,'Verde')==1;
RomboVerde=RomboVerde+1;
end
end

if strcmp(Figura,'Es un Triangulo')==1;
if strcmp(Color,'Rojo')==1;
TrianguloRojo=TrianguloRojo+1;
end
if strcmp(Color,'Azul')==1;
TrianguloAzul=TrianguloAzul+1;
end
if strcmp(Color,'Verde')==1;
TrianguloVerde=TrianguloVerde+1;
end
end

%%Total de figuras por forma


TotalCirculos=CirculoRojo+CirculoAzul+CirculoVerde;
TotalCuadrados=CuadradoRojo+CuadradoAzul+CuadradoVerde;
TotalEstrellas=EstrellaRoja+EstrellaAzul+EstrellaVerde;
TotalRombos=RomboRojo+RomboAzul+RomboVerde;
TotalTriangulos=TrianguloRojo+TrianguloAzul+TrianguloVerde;

%%Total de figuras por color


TotalRojas=CirculoRojo+CuadradoRojo+EstrellaRoja+RomboRojo+TrianguloRojo;
TotalAzules=CirculoAzul+CuadradoAzul+EstrellaAzul+RomboAzul+TrianguloAzul;

TotalVerdes=CirculoVerde+CuadradoVerde+EstrellaVerde+RomboVerde+TrianguloVerde;

%%Se muestran los resultados mediante la función "tts", con

83
%%la cual MatLab nos dice cada propiedad, para esto se debe
%%tener instalado el toolbox text2speed
switch (Seleccion)
case 1
tts('La figura');
tts(num2str(m));
%tts('son');
tts(Figura);
%tts('El perímetro es');
%tts(num2str(Perimetro));
%tts('El area es');
%tts(num2str(Area));
case 2
tts('La figura');
tts(num2str(m));
%tts('son');
tts('Es de color');
tts(Color);
%tts('El perímetro es');
%tts(num2str(Perimetro));
%tts('El area es');
%tts(num2str(Area));
case 3
tts('La figura');
tts(num2str(m));
%tts('son');
tts(Figura);
tts('Es de color');
tts(Color);
%tts('El perímetro es');
%tts(num2str(Perimetro));
%tts('El area es');
%tts(num2str(Area));
end
end

%%Se muestran en un mensaje el número de figuras de acuerdo a su


%%color y forma
switch (Seleccion)
case 1
m2=msgbox({'Número de figuras por forma'
[' Círculos: ',num2str(TotalCirculos)]
[' Cuadrados: ',num2str(TotalCuadrados)]
[' Estrellas: ',num2str(TotalEstrellas)]
[' Rombos: ',num2str(TotalRombos)]
[' Triángulos:
',num2str(TotalTriangulos)]},'Resultados');
waitfor(m2);
close all;
case 2
m2=msgbox({'Número de figuras por color'
[' Rojas: ',num2str(TotalRojas)]
[' Azules: ',num2str(TotalAzules)]
[' Verdes: ',num2str(TotalVerdes)]},'Resultados');
waitfor(m2);
close all;
case 3
m2=msgbox({'--FIGURAS ROJAS:'
[' Círculos: ',num2str(CirculoRojo)]
[' Cuadrados: ',num2str(CuadradoRojo)]
[' Estrellas: ',num2str(EstrellaRoja)]
[' Rombos: ',num2str(RomboRojo)]
[' Triángulos: ',num2str(TrianguloRojo)]
'--FIGURAS AZULES:'
[' Círculos: ',num2str(CirculoAzul)]
[' Cuadrados: ',num2str(CuadradoAzul)]
[' Estrellas: ',num2str(EstrellaAzul)]
[' Rombos: ',num2str(RomboAzul)]
[' Triángulos: ',num2str(TrianguloAzul)]
'--FIGURAS VERDES:'
[' Círculos: ',num2str(CirculoVerde)]
[' Cuadrados: ',num2str(CuadradoVerde)]
[' Estrellas: ',num2str(EstrellaVerde)]
[' Rombos: ' ,num2str(RomboVerde)]
[' Triángulos:
',num2str(TrianguloVerde)]},'Resultados');
waitfor(m2);

84
close all;
end
%%Si no se selecciona alguna opción el programa manda un mensaje de %%error y termina
else
msgbox('Debe seleccionar una opción','Error');
close all;
end

85
Anexo F: Interfaz Gráfica de Usuario “ColoryForma”

function varargout = ColoryForma(varargin)


% COLORYFORMA MATLAB code for ColoryForma.fig
% COLORYFORMA, by itself, creates a new COLORYFORMA or raises the existing
% singleton*.
%
% H = COLORYFORMA returns the handle to a new COLORYFORMA or the handle to
% the existing singleton*.
%
% COLORYFORMA('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in COLORYFORMA.M with the given input arguments.
%
% COLORYFORMA('Property','Value',...) creates a new COLORYFORMA or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before ColoryForma_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to ColoryForma_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 ColoryForma

% Last Modified by GUIDE v2.5 06-Nov-2014 16:16:55

% Begin initialization code - DO NOT EDIT


gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @ColoryForma_OpeningFcn, ...
'gui_OutputFcn', @ColoryForma_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end

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

% --- Executes just before ColoryForma is made visible.


function ColoryForma_OpeningFcn(hObject, ~, 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 ColoryForma (see VARARGIN)
% Choose default command line output for ColoryForma
handles.output = hObject;

global a;
try
a = arduino('COM3'); %Conexion al Puerto serial del Arduino
a.servoAttach(9); %Pin usado para conectar el Servo de la Articulacion 1
a.servoAttach(10); %Pin usado para conectar el Servo de la Articulacion 2
imagen=imread('itsh.jpg'); %Se muestra el Logo del ITSH en un Axes
axes(handles.AxesLogo)
imshow(imagen)
catch e
warndlg('Compruebe la conexion del Microcontrolador Arduino...', 'Error');
close all;
end

% Update handles structure


guidata(hObject, handles);

86
% UIWAIT makes ColoryForma wait for user response (see UIRESUME)
% uiwait(handles.FiguraPrincipal);

% --- Outputs from this function are returned to the command line.
function varargout = ColoryForma_OutputFcn(~, ~, 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 BotonConfigurar.


function BotonConfigurar_Callback(hObject, eventdata, handles)
% hObject handle to BotonConfigurar (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global IA DeviceID Format;

IAHI=imaqhwinfo;
IA=(IAHI.InstalledAdaptors);
D=menu('Seleccione el Adaptador de video a utilizar...',IA);
if isempty(IA)||D==0
msgbox('Configure correctamente la Cámara...', 'Error');
return
end
IA=char(IA);
IA=IA(D,:);
IA(IA==' ')=[];
x=imaqhwinfo(IA);
try
DeviceID=menu('Seleccione ID de la Cámara...',x.DeviceIDs);
F=x.DeviceInfo(DeviceID).SupportedFormats;
nF=menu('Seleccione el FORMATO...',F);
Format=F{nF};
set(handles.BotonConfigurar,'enable','off');
catch e
warndlg('Configure correctamente la Cámara...', 'Error');
return
end
set(handles.BotonVisualizar, 'enable', 'on');

% --- Executes on button press in BotonVisualizar.


function BotonVisualizar_Callback(hObject, ~, handles)
% hObject handle to BotonVisualizar (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global IA DeviceID Format VidObj;
try
VidObj=videoinput(IA, DeviceID, Format);
set(VidObj,'ReturnedColorSpace','rgb');
handles.VidObj=VidObj;
vidRes=get(handles.VidObj, 'VideoResolution');
nBands=get(handles.VidObj, 'NumberOfBands');
set(handles.AxesVideo, 'Visible', 'on');
axes(handles.AxesVideo)
hImage=image(zeros(vidRes(2), vidRes(1),nBands));
preview(handles.VidObj, hImage);
catch E
msgbox({'Configure correctamente la Cámara...',' ',E.message},'Información')
end
guidata(hObject, handles);
set(handles.BotonVisualizar,'enable', 'off');
set(handles.SliderArticulacion1,'enable','on');
set(handles.SliderArticulacion2,'enable','on');
set(handles.Color,'enable','on');
set(handles.Forma,'enable','on');
set(handles.FormayColor,'enable','on');

% --- Executes on button press in BotonSalir.


function BotonSalir_Callback(~, ~, ~)
% hObject handle to BotonSalir (see GCBO)

87
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global a;
ans=questdlg('¿Desea salir del programa?','Salir','Si','No','No');
if strcmp(ans,'No')
return;
end
delete (a);
clear,clc,close all;

% --- Executes on slider movement.


function SliderArticulacion2_Callback(hObject, eventdata, handles)
% hObject handle to SliderArticulacion2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global a;
handles.SliderArticulacion2=get(hObject,'Value'); %Carga en handles.slider1 el valor
delSlider
handles.SliderArticulacion2=round(1*handles.SliderArticulacion2);
vel=handles.SliderArticulacion2;
a.servoWrite(10,vel);
% 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 SliderArticulacion2_CreateFcn(hObject, eventdata, handles)
% hObject handle to SliderArticulacion2 (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

% --- Executes on slider movement.


function SliderArticulacion1_Callback(hObject, eventdata, handles)
% hObject handle to SliderArticulacion1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global a;
handles.SliderArticulacion1=get(hObject,'Value'); %Carga en handles.slider1 el valor
delSlider
handles.SliderArticulacion1=round(1*handles.SliderArticulacion1);
vel=handles.SliderArticulacion1;
a.servoWrite(9,vel);
% 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 SliderArticulacion1_CreateFcn(hObject, eventdata, handles)
% hObject handle to SliderArticulacion1 (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

% --- Executes on button press in BotonOpcion.


function BotonOpcion_Callback(hObject, eventdata, handles)
% hObject handle to BotonOpcion (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global Opcion;
set(handles.PanelCaracteristicas, 'Visible', 'off');
switch Opcion
case 1
set(handles.Forma, 'enable', 'on');
set(handles.FormayColor, 'enable', 'on');
set(handles.text8,'Visible','off');

88
set(handles.TextColor,'String',' ');
set(handles.text14,'Visible','off');
set(handles.TextArea,'Visible','off');
set(handles.TextArea,'String',' ');
set(handles.text16,'Visible','off');
set(handles.TextPerimetro,'Visible','off');
set(handles.TextPerimetro,'String',' ');
set(handles.text18,'Visible','off');
set(handles.text22,'Visible','off');
set(handles.text23,'Visible','off');
set(handles.TextCentroide,'Visible','off');
set(handles.TextCentroide,'String',' ');
case 2
set(handles.Color, 'enable', 'on');
set(handles.FormayColor, 'enable', 'on');
set(handles.text6,'Visible','off');
set(handles.TextForma,'String',' ');
set(handles.text14,'Visible','off');
set(handles.TextArea,'Visible','off');
set(handles.TextArea,'String',' ');
set(handles.text16,'Visible','off');
set(handles.TextPerimetro,'Visible','off');
set(handles.TextPerimetro,'String',' ');
set(handles.text18,'Visible','off');
set(handles.text22,'Visible','off');
set(handles.text23,'Visible','off');
set(handles.TextCentroide,'Visible','off');
set(handles.TextCentroide,'String',' ');
case 3
set(handles.Color, 'enable', 'on');
set(handles.Forma, 'enable', 'on');
set(handles.text6,'Visible','off');
set(handles.TextForma,'Visible','off');
set(handles.TextColor, 'Visible','off');
set(handles.text8,'Visible','off');
set(handles.TextForma,'String',' ');
set(handles.TextColor,'String',' ');
set(handles.text14,'Visible','off');
set(handles.TextArea,'Visible','off');
set(handles.TextArea,'String',' ');
set(handles.text16,'Visible','off');
set(handles.TextPerimetro,'Visible','off');
set(handles.TextPerimetro,'String',' ');
set(handles.text18,'Visible','off');
set(handles.text22,'Visible','off');
set(handles.text23,'Visible','off');
set(handles.TextCentroide,'Visible','off');
set(handles.TextCentroide,'String',' ');
end

% --- Executes on button press in BotonReconocer.


function BotonReconocer_Callback(hObject, eventdata, handles)
% hObject handle to BotonReconocer (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global Opcion VidObj;
ImagenOriginal=getsnapshot(VidObj);
set(handles.PanelCaracteristicas, 'Visible', 'on');
Color=ColorRGB(ImagenOriginal);
[Forma Area Perimetro Centroide]=DeteccionForma(ImagenOriginal);
switch Opcion
case 1
tts('El color es');
tts(Color);
set(handles.text8,'Visible','on');
set(handles.TextColor,'Visible','on');
set(handles.TextColor,'String',Color);
set(handles.text14,'Visible','on');
set(handles.TextArea,'Visible','on');
set(handles.TextArea,'String',Area);
set(handles.text16,'Visible','on');
set(handles.TextPerimetro,'Visible','on');
set(handles.TextPerimetro,'String',Perimetro);
set(handles.text18,'Visible','on');
set(handles.TextCentroide,'Visible','on');
set(handles.text22,'Visible','on');
set(handles.text23,'Visible','on');

89
set(handles.TextCentroide,'String',Centroide);
case 2
tts('La figura es');
tts(Forma);
set(handles.text6,'Visible','on');
set(handles.TextForma,'Visible','on');
set(handles.TextForma,'String',Forma);
set(handles.text14,'Visible','on');
set(handles.TextArea,'Visible','on');
set(handles.TextArea,'String',Area);
set(handles.text16,'Visible','on');
set(handles.TextPerimetro,'Visible','on');
set(handles.TextPerimetro,'String',Perimetro);
set(handles.text18,'Visible','on');
set(handles.TextCentroide,'Visible','on');
set(handles.text22,'Visible','on');
set(handles.text23,'Visible','on');
set(handles.TextCentroide,'String',Centroide);
case 3
tts('La figura es')
tts(Forma);
tts('Su color es')
tts(Color);
tts(handles.TextColor);
set(handles.text6,'Visible','on');
set(handles.TextForma,'Visible','on');
set(handles.TextColor,'Visible','on');
set(handles.text8,'Visible','on');
set(handles.TextForma,'String',Forma);
set(handles.TextColor,'String',Color);
set(handles.text14,'Visible','on');
set(handles.TextArea,'Visible','on');
set(handles.TextArea,'String',Area);
set(handles.text16,'Visible','on');
set(handles.TextPerimetro,'Visible','on');
set(handles.TextPerimetro,'String',Perimetro);
set(handles.text18,'Visible','on');
set(handles.text22,'Visible','on');
set(handles.text23,'Visible','on');
set(handles.TextCentroide,'Visible','on');
set(handles.TextCentroide,'String',Centroide);
end

% --- Executes on slider movement.


function slider3_Callback(hObject, eventdata, handles)
% hObject handle to SliderArticulacion1 (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 slider3_CreateFcn(hObject, eventdata, handles)
% hObject handle to SliderArticulacion1 (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

% --- Executes on slider movement.


function slider4_Callback(hObject, eventdata, handles)
% hObject handle to SliderArticulacion2 (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.

90
function slider4_CreateFcn(hObject, eventdata, handles)
% hObject handle to SliderArticulacion2 (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

% --- Executes when selected object is changed in uipanel3.


function uipanel3_SelectionChangeFcn(hObject, eventdata, handles)
% hObject handle to the selected object in uipanel3
% eventdata structure with the following fields (see UIBUTTONGROUP)
% EventName: string 'SelectionChanged' (read only)
% OldValue: handle of the previously selected object or empty if none was selected
% NewValue: handle of the currently selected object
% handles structure with handles and user data (see GUIDATA)
global Opcion;
set(handles.BotonOpcion, 'enable', 'on');
set(handles.BotonReconocer, 'enable','on');
switch get(eventdata.NewValue,'Tag') % Get Tag of selected object.
case 'Color'
Opcion=1;
set(handles.Forma, 'enable', 'off');
set(handles.FormayColor, 'enable', 'off');
case 'Forma'
Opcion=2;
set(handles.Color, 'enable', 'off');
set(handles.FormayColor, 'enable', 'off');
case 'FormayColor'
Opcion=3;
set(handles.Color, 'enable', 'off');
set(handles.Forma, 'enable', 'off');
end

91
Anexo G: Figuras de prueba

Figura G.1 Círculo rojo.

Figura G.2 Cuadrado rojo.

Figura G.3 Estrella verde.

92
Figura G.4 Rombo verde.

Figura G.5 Triángulo azul.

93
Anexo H: Interfaz Gráfica de Usuarios en MatLab

La Interfaz Gráfica de Usuario, conocida también como GUI (Graphical User


Interface) es un entorno de programación visual en el que se utiliza un conjunto de
imágenes y objetos gráficos para representar la información y acciones disponibles en
la interfaz. Una interfaz gráfica consta de una o más ventanas que contienen controles,
llamados componentes, que permiten a un usuario realizar acciones o tareas en forma
interactiva (Figura H.1).

Figura H.1 Ejemplo de interfaz gráfica.

Para iniciar la creación de una interfaz gráfica en MatLab se puede hacer de


dos maneras:

a) Ejecutando el comando “guide” en la ventana de comandos (Figura H.2).

Figura H.2 Comando guide.

b) Haciendo click en el icono New y posteriormente seleccionando la opción


Graphical User Interface (Figure H.3).

94
Figura H.3 Selección de nueva interfaz gráfica.

Después de iniciar la creación de una interfaz gráfica se mostrara un cuadro


diálogo (Figura H.4) en el cual se puede seleccionar abrir o crear una nueva interfaz
gráfica.

Figura H.4 Cuadro de diálogo al iniciar la creación de una interfaz gráfica.

En el cuadro de diálogo se selecciona la opción “Blank GUI (Default)”, al


realizarlo se nos abrirá la ventana mostrada en la Figura H.5, en esta ventana se creara
la interfaz gráfica colocando los componentes deseados de acuerdo a lo que se desea
realizar.

95
Figura H.5 Ventana para crear una interfaz gráfica.

En la ventana para la creación de la interfaz gráfica se tienen diversas opciones,


algunas de estas se muestran en la Figura H.6.

Figura H.6 Opciones de la ventana para crear una interfaz gráfica.

Los componentes (Figura H.7) que se utilizan en una interfaz gráfica nos sirven
para que el usuario final realice determinadas acciones o se le muestre información.

96
Figura H.7 Componentes para una interfaz gráfica.

Cada componente posee propiedades (color, valor, posición, string, etc.), las
cuales permiten establecen las características del componente, cuando se da doble click
sobre un componente se abre la ventana “Property Inspector” (Figura H.8) que nos
permite tener un listado de las propiedades que tiene cada componente así como poder
modificar algunas propiedades.

Figura H.8 Ventana Property Inspector.

Al hacer click derecho sobre algún componente aparecen diversas opciones,


una de estas es “View CallBack” (Figura H.9), la cual es una de las opciones más
importantes; al seleccionarla se abre el archivo “.m” (Figura H.10) que está asociado
a la interfaz gráfica y nos posiciona en la parte del programa que corresponde a la

97
subrutina que se ejecutará cuando se realice una determinada acción sobre el
componente que se haya seleccionado.

Figura H.9 Opción View Callback.

Figura H.10 Archivo “.m”.

98
Una interfaz gráfica consta de dos archivos: ”.m” y ”.fig”; el primero es el que
contiene el código correspondiente a cada componente que haya en la interfaz gráfica,
y el segundo contiene los componentes gráficos. Cada vez que se agregue un nuevo
componente en la interfaz gráfica se genera automáticamente código en el archivo
“.m”.

Todos los valores de las propiedades de los componentes y los valores de las
variables del programa se almacenan en una estructura, los cuales son accedidos
mediante un único y mismo identificador para todos, este identificador es “handles”;
por ejemplo si dentro de una subrutina una operación dio como resultado una variable
“diego”, para poder utilizarla desde el programa principal u otra subrutina debemos
guardarla con las instrucciones que se muestran en la Figura H.11.

Figura H.11 Guardar valor de una variable.

Para la asignación u obtención de valores de los componentes se realiza


mediante las sentencias “get” y “set”, por ejemplo en la Figura H.12 se muestra el
código para que una variable tenga el valor de un componente; y en la Figura H.13 se
muestra como se asigna el valor de una variable a un componente.

Figura H.12 Asignar valor de un componente a una variable.

Figura H.13 Asignar valor de una variable a un componente.

A continuación se ejemplificara la creación de una interfaz gráfica que en la


que se sumaran dos números introducidos por el usuario, los pasos para crearla se
describen brevemente a continuación:

1. Primero se selecciona la opción para crear una interfaz gráfica, seleccionando


Blank GUI (Default), como se muestra en la Figura H.14.

99
Figura H.14 Opción Blank GUI (Default).

2. A continuación se mostrara una ventana con el área en la que colocaremos los


diversos componentes que se utilizaran, en esta colocaremos los componentes
mostrados en la Figura H.15.

Figura H.15 Componentes a utilizar.

3. A continuación en cada componente se hace doble click para modificar sus


propiedades, iniciando con el “Push Button”, se configura como se muestra en
la Figura H.16.

100
Figura H.16 Configuración del Push Button.

Se editan los demás componentes, hasta llegar a tener una presentación


semejante a la mostrada en la Figura H.17.

Figura H.17 Presentación de la interfaz gráfica.

4. Al terminar de configurar cada componente, guardaremos el archivo; al


hacerlos se creara automáticamente un archivo “.m” (Figura H.18).

Figura H.18 Archivo “.m” creado al guardar.

101
5. Para comenzar a desarrollar el programa se debe de crear la función
“Callback“ de los componentes que responderán a una acción que realice el
usuario; esta función se crea al dar click derecho sobre el componente y
seleccionar la opción (Figura H.19).

Figura H.19 Opcion para crear la función Callback.

El código que se creara al crear la función “Callback” en el “Push


Button” y en un “Edit Text” se muestra en las Figura H.20 y H.21.

Figura H.20 Función Callback de un Push Button.

Figura H.21 Función Callback de un Edit Text.

El componente “Static Text”, no posee función “Callback”, pero sí una


dirección asociada, que se utiliza para mostrar información, esta dirección
asociada es el nombre del componente, este nombre lo encontramos en la
propiedad “Tag” (Figura H.22).

Figura H.22 Propiedad “Tag” de un componente.

102
6. Después de crear la función “Callback” se comienza a escribir el código para
que la interfaz gráfica que se desarrolla haga lo que deseamos de acuerdo a lo
que haga el usuario. Primeramente se escribe el código del primer “Edit Text”
como se muestra en la Figura H.23

Figura H.23 Código del primer Edit Text.

El segundo “Edit Text” tendrá un código parecido al del primero


(Figura H.24).

Figura H.24 Código del segundo Edit Text.

Hasta el momento, al tener escrito el código de los “Edit Text”, tenemos


los dos números que se sumaran almacenados en los identificadores
“handles.edit1” y “handles.edit2”, como se desea que el resultado de la suma
se muestre al presionar el “Push Button”, la suma de los dos números y la
muestra de resultados se programa dentro de su función “Callback”
correspondiente, el código se muestra en la Figura H.25.

Figura H.25 Código del Push Button.

7. Por ultimo al tener escrito el código de todos los componentes, se procede a


guardar y ejecutar la interfaz gráfica para comprobar que realice la suma de los

103
números adecuadamente, esto se realiza seleccionando el botón mostrado en la
Figura H.26.

Figura H.26 Botón para ejecutar la interfaz gráfica.

En la Figura H.27 se muestra la ejecución de la interfaz gráfica y se


puede observar que se realiza adecuadamente la suma de los números.

Figura H.27 Interfaz gráfica de la suma de números.

104

También podría gustarte