Vous êtes sur la page 1sur 10

Miguel Delgado 609838 8/Mayo/2007 Jorge Villaseor 784770 Robtica 2 Efrn Ziga 608375 Dr.

Jos Lus Gordillo ______________________________________________________________________

Reporte Final
Pre-procesamiento de la Imagen Recoleccin de Histogramas Conversin a escala de grises Binarizacion por umbral Binarizacin definitiva Identificacin Segmentacin Caracterizacin Clasificacin Hu Colores Planeacin de Trayectoria Expansin de Obstculos Regulares Irregulares Ponderacin del campo de trabajo Calculo de la Trayectoria Optimizacin de la Trayectoria Seguimiento de la Trayectoria Calibracin del Robot y el rea de trabajo Comunicacin con el Robot Alcanzar el siguiente punto Proceso Automtico Consideraciones de Eficiencia

Pre-procesamiento de la Imagen
El pre-procesamiento de la imagen consiste en reducir la informacin en la misma, de modo que pueda ser interpretada por medio de una computadora. Para que esto fuera posible y diera los mejores resultados combinamos dos tcnicas de binarizacin, que fueron por umbral y por histogramas. Recoleccin de Histogramas La recoleccin de los histogramas no fue hecha solamente por intensidades como se hace normalmente, sino que se tomo un histograma para cada componente RGB de la imagen. Para lograr esto se definieron tres arreglos de enteros en memoria de tamao de 256 cada uno, correspondiendo cada espacio a una intensidad de cada componente; se realiz un recorrido completo de la imagen obteniendo los componentes RGB de cada pxel e incrementando en cada ocasin el espacio correspondiente en los arreglos a la intensidad de cada color encontrada en cada pxel. Se utilizaron lmites dentro de cada componente para determinar los rangos en los que se deba binarizar, siendo la interseccin de los tres lmites la que se tomara para uso. Esta tcnica se utiliz para recolectar los limites de las componentes RGB dentro de las cuales se poda encontrar cada objeto que nos interesara, pero esta tcnica no sera suficiente pues no seria posible limitar estrictamente cada objeto sin obtener algunos pocos pxeles o a veces trozos de otros objetos, por lo cual esta tcnica necesitara ser complementada con la binarizacin por umbral. Conversin a escala de grises El paso a escala de grises de la imagen es esencial para realizar una binarizacin por umbral, as que primero es necesario realizar este paso. Para esto la imagen se recorre completamente tambin, calculando en cada pxel la intensidad de gris que le corresponde mediante f(r,g,b) = 0.6*r + 0.3*g + 0.1*b, y asignando dicho valor a las tres componentes. Binarizacion por umbral Esta tcnica consiste en calcular la intensidad de gris que correspondera a cada pxel, pero definiendo previamente un umbral a partir del cual se saturara el color: si la intensidad fuera mayor al umbral saturar a blanco, y si fuera menor o igual saturar a negro. Esta tcnica se utiliza buscando un umbral con el cual se muestren todos los objetos que se identificarn, no pudiendo distinguir uno de otro, pero si distinguindolos de la informacin que no es til del rea de trabajo. Binarizacin definitiva La tcnica utilizada finalmente para binarizar la imagen es la combinacin de las descritas previamente. Una vez definidos los limites de los histogramas para cada objeto y el umbral de binarizacin para descartar la informacin que no es til (mediante experimentos previos), se llena una LUT que traduce colores de 24 bits igualmente en colores de 24 bits, para lo cual se llena en un principio con blanco, despus se le definen los espacios que correspondern al color negro, y despus se llena dentro de los limites de colores definidos para cada objeto con un color ya antes decidido para dicho objeto; dado que los colores que pensamos en identificar eran rojo, azul, verde y negro, estos serian los colores utilizados dentro de la LUT. Esta LUT es llenada al arrancar el programa para evitar la degradacin del procesamiento. Finalmente se recorre la imagen, traduciendo cada pxel a su color correspondiente en la LUT, obteniendo de

esta forma objetos con mltiples colores en ella, pero con una clara mayora en la concentracin de alguno de ellos.

Identificacin
La identificacin de cada objeto es necesaria para que los elementos de la imagen tomen significado y el programa sea capaz de utilizarlos, pues cada elemento dentro de la imagen tiene un significado o un uso. Segmentacin La segmentacin es el primer paso necesario para la identificacin, ya que antes de poder saber que es cada objeto en la imagen, es necesario saber que grupo de pxeles corresponden a un mismo grupo. Hemos hecho estructuras y clases que sern tiles para realizar esta tarea: -Clase Bunch: Contiene una lista de puntos para el rea del objeto, otra lista de puntos para el permetro y un apuntador a un objeto de la clase Thing. -Clase Thing: Contiene una lista de objetos de la clase Bunch, adems de contadores que acumularn el rea y el permetro del objeto y para cada color posible despus de la binarizacin. -Estructura PivotPixel: Contiene cinco enteros que son los ndices que apuntarn a cinco pxeles de la estructura dentro de un buffer lineal, formando una cruz vertical en la imagen. Para realizar esto utilizaremos la estructura en forma de cruz, con la cual se verificar si su pxel central no es blanco, caso en el cual verificar los pxeles norte y oeste: si el pxel norte tampoco es blanco, entonces el pxel central corresponder al grupo de pxeles (Bunch) al que pertenece el pxel norte. Si adems el pxel izquierdo no es blanco, ste y su grupo de pxeles correspondern al grupo al que pertenece el pxel central. Si solamente el pxel central no es blanco, este creara su propio grupo de pxeles. Se verifica adems, si el pxel central no es blanco, que ninguno de los dems pxeles de la estructura lo sean tampoco; si al menos uno de los pxeles de esta estructura es blanco entonces el pxel central es parte del permetro, y se agrega como tal a la lista correspondiente en el. Para hacer todas las verificaciones necesarias se utiliza una matriz de apuntadores a Bunch que es del mismo tamao que la imagen, correspondiendo el (x,y) un apuntador al Bunch al que pertenece ese pxel, asi que para verificar a que objeto pertenece el pxel seleccionado basta con seguir ese apuntador hacia su Bunch, y de ah hacia su Thing. Para evitar conteos dobles tambin se verifica: cuando el pxel oeste no es blanco, se verifica si pertenece a un objeto diferente al del pxel norte, y solamente se hace el cambio si as fuera. Cuando se crea un Bunch nuevo, se incrementa el contador de rea y el de permetro; cuando se cambia un Bunch de un Thing a otro se suman sus contadores los contadores del nuevo Thing, y se cambian los apuntadores de modo de el Bunch actual apunta al nuevo Thing, y dicho Thing agrega al Bunch actual a su lista. En cada pxel que no es blanco se incrementa el contador del color correspondiente a dicho pxel.

Junto con todo el proceso previo se lleva una lista de Things, a la que se agrega cada Thing que se acabe de crear, y sacando de ella cada uno cuyos Bunches se integraran a uno nuevo. Al final en la lista se tienen los apuntadores a todos los objetos que hay en la imagen. Despus de realizar la segmentacin es posible hacer una discriminacin por rea, donde solamente se eliminan de la lista los objetos cuya rea sea menor a la que se defina como parmetro en el mtodo. Caracterizacin Continuando con el proceso de identificacin, la caracterizacin es el proceso donde se miden caractersticas de la imagen para poder distinguir un objeto de otro. Se hicieron mediciones sobre los momentos de torsin de cada objeto, calculando as los momentos estadsticos ordinarios, despus los centralizados, los normalizados y finalmente los momentos de Hu hasta su segundo orden para cada uno. Tambin se realiz una caracterizacin sobre colores, llevndose a cabo previamente durante la segmentacin por medio de los contadores de colores para evitar hacer un segundo recorrido de la imagen. Clasificacin Como ultimo paso para la identificacin se encuentra la clasificacin, paso en el cual se etiqueta al objeto para distinguirlo de los otros y definirle caractersticas especificas que servirn para su uso. -Hu: Se ha utilizado la identificacin por momentos de Hu, obteniendo una estadstica de todos los momentos de Hu de segundo orden que pudieran generar los objetos esparcidos por toda el rea de trabajo, variando asi su iluminacin, posicin, giro y a deformacin que pudiera causar la lente en sus diferentes colocaciones. Se obtuvo una media y varianza para cada momento de Hu para cada objeto, pero esto no genero informacin suficiente para la distincin de los objetos que se utilizaron debido a la baja calidad de las fotos que eran tomadas. -Colores: En substitucin de los momentos de Hu se utiliz la discriminacin por colores: aprovechando el etiquetado previo en la binarizacin y el conteo que se hizo de la concentracin de cada color en los objetos, la clasificacin se vuelve un proceso sencillo en el que solamente se asigna al objeto la clase que le corresponda por el color que sea mas recurrente, es decir, cuyo contador sea mayor que los dems. Aqu identificamos los objetos separndolos en 4 clases: los obstculos, el punto inicial, el punto final, y la orientacin (que es el punto hacia el cual ve la espalda del robot). Planeacin de Trayectoria La planeacin de la trayectoria es un procesamiento que se realiza sobre una imagen a blanco y negro solamente, donde los obstculos se expanden y el robot se reduce a un punto siendo este el espacio de configuracin (C-Space). Primero se hace la expansin de los obstculos, despus la ponderacin del campo y finalmente se calcula la trayectoria.

El algoritmo elegido para planear la trayectoria fue NF1, algoritmo de tipo gota de aceite en el que cada pxel tiene un valor mayor mientras se va alejando del punto marcado como llegada. Expansin de Obstculos Se expanden solamente los objetos previamente identificados como obstculos, pero hay dos diferentes tcnicas para expanderlos, difiriendo si son regulares (con sus vrtices definidos claramente en memoria como puntos con coordenadas) o si fuesen irregulares (un conjunto de puntos sin vrtices definidos, tal ves sin una forma regular). -Regulares: Para expandir los polgonos regulares, primero es requisito que sus vrtices hayan sido capturados en sentido contrario a las manecillas del reloj, para asi poder calcular un vector Normal que apuntara siempre hacia fuera del objeto. Una vez calculado dicho vector se calculan dos puntos por cada arista del polgono, separados una distancia igual al radio del robot en direccin del vector Normal, despus de cierran dichos puntos con sus correspondientes no expandidos en cada arista, pintando rectngulos con ellos, y dibujando crculos de radio igual al del robot en cada vrtice, produciendo asi un obstculo expandido. -Irregulares: Con los polgonos irregulares se presenta el problema de que no se sabe que puntos sern utilizados como vrtices, y llevara un procesamiento computacional excesivo el tomar cada punto del permetro como vrtice, asi que utilizamos la suma de Minkoski para ello, aunque una versin simplificada: en la suma de Minkoski, se hace una operacin lgica sobre la imagen utilizando dos matrices, recorriendo la matriz A con la matriz B, montando su centro en cada punto de la matriz A, y haciendo la operacin Lgica OR, o unin, de cada pxel de la matriz B con su correspondiente de la matriz A en la posicin que se encuentre. Esto es mayormente intil, dado que la mayora de los puntos quedaran pintados dentro del mismo objeto, asi que decidimos hacer la operacin utilizando en lugar de la matriz A, una trayectoria Z que incluye a todos los pxeles del permetro de A, aunque esto aun tiene procesamiento innecesario, dado que implica dibujar una figura en su misma posicin desfasada un solo pxel, asi que decidimos hacer la suma de Minkoski de una figura hueca sobre una trayectoria Z, lo cual resultara finalmente en un obstculo expandido con unos pocos huecos entro de si, pero irrelevantes para el proceso siguiente que es la ponderacin del campo de trabajo. El objeto hueco que se utiliza es un contorno de crculo que se genera a partir del algoritmo de Bresenham para crculos. Ponderacin del campo de trabajo Para ponderar el campo de trabajo utilizamos el algoritmo mencionado previamente, NF1, en el cual se toma un punto como punto de llegada, y dicho punto se coloca en una lista FIFO, despus el proceso es simple: se saca un punto de la lista, se mete en la lista los puntos que estn a su alrededor en el orden de Norte, Oeste, Sur y Este, siempre que no estn marcados o no sean parte de un obstculo (es decir negros), y se les marca con un contador, que es igual al contador del punto que salio de la lista incrementado en uno. El proceso se repite hasta que no haya ms puntos que sacar. Dado que este es un proceso transparente para el usuario, se decidi hacerlo visible por medio de colores. Cada pxel marcado en el campo tomara el color definido en una LUT, donde los colores se comportan comenzando con el color Rojo saturado, luego crece el Verde hasta saturar, despus baja el Rojo hasta llegar a cero y comienza a crecer el Azul hasta saturar, despus baja el Verde hasta llegar a cero y crece el Rojo

hasta saturar, el Azul baja hasta llegar a cero y el proceso se repite. De esta manera se ve variar una gama de colores mientras se aleja del punto de llegada. Calculo de la Trayectoria El calculo de la trayectoria es sencillo con este algoritmo, dado que la ponderacin del campo ya cubre todos los casos posibles de rutas en rea de trabajo, solamente hay que capturar el punto de inicio, buscar cual pxel a su alrededor es el menor, buscndolo en el orden de Norte, Oeste, Sur, Este, y dicho punto se agrega a una lista. Para este nuevo punto se vuelve a buscar el menor y el proceso se repite hasta alcanzar el punto de llegada. Al final se tiene una lista de puntos que conforman la trayectoria. Optimizacin de la Trayectoria Dado que el proceso anterior arroja como resultado una trayectoria muy poblada de vrtices, seguirla con el robot llevara muchos giros, arranques y frenos, lo cual hara un seguimiento lento y degenerativo para el robot, por lo que se decidi optimizar dicha trayectoria. El procedimiento con el que se optimiza es buscar para cada punto el ultimo punto que le es posible ver el lnea recta, para lo cual se utiliza el algoritmo de Bresenham para lneas rectas, con el cual se busca que no se golpee ningn obstculo al ir de un punto a otro, comenzando por el punto de inicio y buscando cada punto en la trayectoria, pero de nueva forma, esto es muy tardado pues la trayectoria implica muchos puntos, asi que utilizamos la tcnica de divisiones sucesivas para hacerlo mas eficiente. Se lanza una lnea del punto inicial al final, si golpea obstculo el ndice de la lista se parte a la mitad, y se tira una lnea a dicho punto, si no golpea nada, se tira una lnea a la mitad entre ese punto y el final, y asi se va partiendo sucesivamente la lista en mitades para encontrar la menor cantidad de puntos necesarios para hacer la trayectoria. Esto convierte la optimizacin en un algoritmo de O(log2n), con lo cual para una ruta de 1024 puntos, la optimizacin llevara aproximadamente 10 tiradas de lneas. Seguimiento de la Trayectoria Aqu el robot ya toma movimiento. Dado que el robot se comunica por medio de un API en telnet, se necesito una capa de abstraccin que manejara toda la comunicacin de los sockets. Las instrucciones que recibe el robot son solamente de avanzar cierta distancia y de girar cierta cantidad de grados, asi que estos clculos se hacen a partir de los puntos que se encuentran en la lista. Calibracin del Robot y el rea de trabajo Para que el robot tuviera un mnimo margen de error hubo la necesidad de calibrar primero el robot para que funcionara bien con el programa. Tenamos el caso en el que pedamos que avanzara un metro y avanzaba un poco menos, o que girara 180 grados y giraba 10 grados mas, asi que la calibracin la hicimos con un factor de correccin. Para calibrar la distancia hicimos avanzar al robot 6 metros y medimos su avance real, para obtener asi un factor de correccin que realmente era discriminable (menor a 1%), y despus lo hacamos girar 4 vueltas (1440) y giraba alrededor de 45

grados de mas, lo cual arrojo un error de alrededor de 12%, correccin que se aplica dentro de la capa de abstraccin de la comunicacin con el robot, el Driver, para que siempre que uno le pida al Driver que el robot gire 45, realmente gire 45 y no se necesite hacer la correccin manualmente. Las mediciones se hicieron sobre movimientos muy grandes para evitar que un error en la medicin tuviera un impacto importante en el clculo del factor. La calibracin del rea de trabajo fue mas sencilla, pues solamente hubo que medir el rea de trabajo en ancho y alto y asignar un valor de cms/pxel para x y para y. Comunicacin con el Robot La comunicacin con el robot era por medio de texto plano mediante sockets, para lo cual fue necesario utilizar threads. El hecho de que el API del robot estuviera en telnet, nos permiti colocar la laptop sobre el robot y hacer todo el procesamiento en otra computadora aparte, dando las instrucciones por red inalmbrica. Alcanzar el siguiente punto Para alcanzar el punto es necesario utilizar en cada vrtice de la trayectoria el punto en el que se encuentra, el punto inmediato anterior en el que estuvo, y el punto al que se dirige. Con el punto actual y el anterior se calcula el ngulo en el que se encuentra el robot, con el punto actual y el siguiente se calcula la distancia y el ngulo que hay entre el robot y el siguiente punto, y con esto el ngulo que debe girar para alinearse hacia el, adems de corregir si el ngulo fuera mayor a 180. Para esto se deja al programa en un thread que vigila por telnet esperando a que el robot conteste que ya alcanzo el punto, lanzando asi un evento que toma el siguiente punto y mueve al robot, repitiendo esto para cada punto. Proceso Automtico Para realizar automticamente el proceso solamente se siguen en orden los pasos que ya estaban desarrollados para este momento. Primero se toma una imagen del campo, se binariza, segmenta, caracteriza y clasifica y se dibujan los obstculos expandidos, esto a una frecuencia de 4 Hz. Mientras que no se pida el comienzo, se pueden mover los obstculos y prcticamente en tiempo real se mostraran los cambios en el programa con los obstculos expandidos, esto para poder acomodar los obstculos evitando obstruir el camino sin tener que esperar a que el programa diga que no hay camino. Una vez que se pide el comienzo se realiza el mismo proceso anterior, pero esta vez incluye la ponderacin del campo y el calculo y optimizacin de la trayectoria, se muestra esta imagen y se comienza el movimiento del robot. Tras esto se toma nuevamente una foto, se vuelve a binarizar, segmentar y caracterizar, para obtener el centroide del robot e irlo vigilando durante el trayecto. Cada vez que se hace esto se calcula que el ngulo entre el centroide del robot y el punto siguiente no sea mayor a cuatro grados (pues es el ngulo mnimo que puede girar), de ser asi se detiene al robot, se agrega el punto donde se encuentra actualmente a la lista de puntos de la trayectoria y se continua la ejecucin. Este monitoreo se hace igualmente a 4 Hz.

Consideraciones de Eficiencia Para que el proceso general pudiera monitorear en tiempo real tuvimos que considerar la eficiencia del programa, buscando que la ejecucin pudiera realizarse en el menor tiempo posible. Para esto buscamos los principales puntos donde el programa estuvo retrasando la ejecucin, lo cual llevo varias pruebas e investigacin sobre la forma de trabajo del lenguaje en si. El primero, y segn consideramos, el mas importante, es el recorrido de la imagen: la imagen se recorre muy fcilmente utilizando el API de C#, pues tiene mtodos, clases y estructuras que hacen todo por si mismo, pero aqu hay un punto de retraso muy significativo. Un Bitmap es un objeto, y como tal se encuentra en el Heap de la computadora y no en el stack, y debido a que el Garbage Collector continuamente reorganiza este espacio de memoria el acceder a un byte individual requiere que primero se fije en memoria, proceso que consume mucho procesamiento si se hace continuamente, proceso que C# tiene que hacer cada vez que se pide un pxel de manera individual. Para evitar todo este retraso utilizamos un mtodo de la clase Bitmap, que es LockBits(); este mtodo permite fijar en memoria todo el bitmap de una sola vez, y le permite adems ser recorrido con apuntadores, asi que aprovechamos el uso de los bitmaps de 24 bits de color para utilizar pxeles de 3 bytes (r,g,b), para lo cual utilizamos una estructura que por si misma ya ocupa esos tres bytes. Esto redujo significativamente el tiempo de procesamiento de las imgenes. El segundo el orden y en importancia es el uso de los atributos Width y Height propios de la clase Bitmap. El acceso a estos atributos hacia muy pesado el procesamiento, aunque en ningn lugar hemos encontrado por que es asi. La solucin que capturar estos atributos en la creacin del objeto y utilizados desde variables locales cada vez. La tercer consideracin fue el uso de las listas de C#. Dado que las listas implicaban un uso muy alto en cuanto a entradas y salidas de informacin durante la ejecucin del algoritmo NF1, se hacan llamadas continuas al Garbage Collector, por lo que decidimos hacer nuestra propia clase Lista, que inclua dos arreglos, uno para X y uno para Y, en donde haba un apuntador para el tope de la lista y uno para la cola los cuales crecan circularmente, con solamente los mtodos de Push y Pop. Estos arreglos deban crearse cuidadosamente pues si se creaban mas pequeos de lo que se deba el programa poda fallar en ejecucin, pero el tamao optimo para la lista es simplemente el permetro de la imagen, pues en el peor de los casos seria el permetro completo el que se agregara a la lista. La cuarta consideracin que tomamos fue eliminar todas las impresiones a consola, especialmente las que estuvieran dentro de los ciclos, ya que sin darnos cuenta esto nos reduca en gran medida la capacidad de procesamiento. Estas pocas pero importantes consideraciones de eficiencia llevaron a que el programa tuviera una ejecucin final, incluyendo tanto la toma de la fotografa, como la binarizacion, la segmentacin, caracterizacin (incluyendo Hu) y la clasificacin, asi como todo el calculo de la trayectoria, se llevara a cabo en un promedio de 150ms, teniendo a veces algunos picos de hasta 200ms, por lo que se decidi que todo el proceso ejecutara a 4 Hz (cada 250ms) para evitar complicaciones.

Fig. 1.- Aqu se muestran algunos obstculos y el robot binarizados, la barra de la derecha cambia el umbral de binarizacion.

Fig. 2.- En la figura, a la izquierda los histogramas correspondientes a los componentes R, G y B de la imagen. Debajo de la imagen original, la binarizacion correspondiente a los umbrales seleccionados en los histogramas. A la derecha se muestra una tabla que despliega informacin sobre los objetos reconocidos.

Fig. 3.- Se muestran en la imagen la identificacin del robot (en rojo y verde), el punto final deseado (en azul) y los obstculos (en violeta, con su correspondiente expansin).

Fig. 4.- Del lado izquierdo, la imagen original donde se muestra la trayectoria que sigue el robot (en verde), un crculo amarillo rodea el centroide del robot y el centroide del punto final (en azul). Del lado derecho, en morado y ensanchados, los obstculos. Una lnea roja muestra la primera trayectoria trazada, haciendo vueltas de 90 solamente. En verde, mltiples lneas marcan los intentos de lograr alcanzar el punto inicial por la via mas corta. Finalmente, en amarillo, la lnea muestra la trayectoria mas corta encontrada para los puntos inicial y final dados. El cambio de colores en el fondo de la imagen, ilustra como cambian los valores en cada pxel, comenzando en rojo en el punto final, conforme el algoritmo gota de agua recorre la matriz. Estos valores son los usados para trazar la trayectoria. El rectngulo etiquetado Error muestra la diferencia en la orientacin del robot a lo largo del recorrido.

Vous aimerez peut-être aussi