Link al Póster
Mostrando entradas con la etiqueta Visión Computacional. Mostrar todas las entradas
Mostrando entradas con la etiqueta Visión Computacional. Mostrar todas las entradas
martes, 28 de mayo de 2013
jueves, 16 de mayo de 2013
Detección de movimiento
Generador de animaciones
El generador en python usando Blender y toma como parámetros el numero de objetos y los tipos (esfera, cubo), y después se elige de manera random hacia donde moverse, teniendo 6 opciones:
Código:
Detección de movimiento
Método de diferencia
Se utilizo el método de diferencia que funciona de la siguiente manera:
if (pix_act[i,j] - pix_ant[i,j]) > 50
Si se cumple con esta condición entonces se dice que hubo un movimiento y el pixel se pinta de negro y los demás de blanco.
Para saber hacia que lado se mueven las figuras se hizo BFS a todo lo que se encuentra en la imagen y se guardaron en una lista cada elemento que pertenece a un objeto de esta manera para saber si se movió simplemente se hacia una comparación entre los objetos del nuevo frame y si esta cercano al objeto del frame pasado entonces se sabe que se movió y se realizan restas simplemente para poder deducir hacia que lado se movió.
Ejemplo:
Este es el código:
El generador en python usando Blender y toma como parámetros el numero de objetos y los tipos (esfera, cubo), y después se elige de manera random hacia donde moverse, teniendo 6 opciones:
- arriba (eje y)
- abajo (eje y)
- derecha (eje x)
- izquierda (eje x)
- enfrente (eje z)
- atrás (eje z)
En el siguiente vídeo podemos ver el movimiento en las tres objetos tiene LUZ para poder ver claramente los movimientos en el eje Z, pero para procesarlos le quité estos efectos para poder identificarlos mejor:
![]() |
| Movimiento en los 3 ejes |
Los siguientes ya no tienen luz:
![]() |
| Movimiento en 2 ejes |
![]() |
| Movimiento en los 3 ejes |
Detección de movimiento
Método de diferencia
Se utilizo el método de diferencia que funciona de la siguiente manera:
if (pix_act[i,j] - pix_ant[i,j]) > 50
Si se cumple con esta condición entonces se dice que hubo un movimiento y el pixel se pinta de negro y los demás de blanco.
Para saber hacia que lado se mueven las figuras se hizo BFS a todo lo que se encuentra en la imagen y se guardaron en una lista cada elemento que pertenece a un objeto de esta manera para saber si se movió simplemente se hacia una comparación entre los objetos del nuevo frame y si esta cercano al objeto del frame pasado entonces se sabe que se movió y se realizan restas simplemente para poder deducir hacia que lado se movió.
Ejemplo:
![]() |
| Animación original |
![]() |
| Diferencia |
![]() |
| Indicando la dirección |
Este es el código:
martes, 14 de mayo de 2013
Visión computacional vs MEMS
Presentación
Propósito y Justificación
Diseño del software
El programa se divide en varias funciones importantes que son:
Así se obtienen los contornos:

Ahora se tiene una imágen que detecta muchas líneas en la figura:
Descripción textual
Librerías utilizadas
Como lenguaje de programación se utilizó python, con las librerías OpenCV ya que contiene muchos módulos que realizan los algoritmos de manera rápida y optima, y tiene funciones que ayudan a manejar los vídeos, ya que yo en mi caso es lo que utilizo.
Desempeño
El vídeo contiene 30 frames por lo que lo ideal sería que se alcanzaran a procesar en tiempo real y no haya ningún tipo de atraso ni se brinquen frames, esta es la gráfica que muestra el desempeño:
Y el tiempo transcurrido en total es de 64 segundos, siendo que el vídeo original tiene una duración de 1 minuto y 33 segundos.
Se procesan aproximadamente 43 frames por segundo.
Trabajo a futuro
En una etapa posterior el proyecto se enfocaría en efectuar mediciones de las coordenadas inerciales de drones y vehículos terrestres.
Como resultado se pretende obtener un comparativo del uso de sistemas de visión vs sensores (infrarojos, ultrasonido, MEMS), ilustrando sus puntos fuertes y desventajas.
Una vez comprobado que la visión computacional si funciona es posible instalar alguna cámara fija enfrente del robot para poder estar calculando sus ángulos.
Se podría comenzar a desarrollar un sistema web que realice las mediciones en tiempo real en un servidor para estar mandando las imágenes por internet y poder controlar desde lejos los movimientos de los brazos del robot.
Conclusiones
Propósito y Justificación
Como primer objetivo el proyecto consiste en realizar medidas angulares a través de visión computacional, como una alternativa al uso de MEMS.
A partir de una medición a distancia (visual), se espera evitar los problemas de ruido que se tienen al realizar las mediciones con un dispositivo sobre la plataforma.
Como resultado se pretende obtener un comparativo del uso de sistemas de visión vs sensores (infrarrojos, ultrasonido, MEMS), ilustrando sus puntos fuertes y desventajas.
Una técnica alternativa al uso de MEMS para realizar medidas angulares de los brazos de un robot o posicionamiento general.
La técnica se basa en el uso de visión computacional para detectar el movimiento del robot.
Se pretende tener una comparación de las medidas que se obtuvieron con los sensores contra las que se obtienen con las imágenes que la cámara capta.
Diseño del software
El programa se divide en varias funciones importantes que son:
- Procesamiento: la función se encarga de leer cada frame y de mandar llamar las funciones necesarias para procesarlas.
- Detección de líneas: Primero se pasa la imagen a escala de grises, después de eso se hace difusa la imagen y se binariza para poder eliminar el ruido, enseguida se buscan los bordes y por último se aplica la función para encontrar las líneas.
- Eliminar basura: encuentra solamente la línea que se ocupa dejando afuera cualquier otro ruido que pudiera afectar en las mediciones
- Leer xls, esto se hace para poder comparar los datos proporcionados por los MEMS y graficarlos juntos con los obtenidos.
Aquí el proceso:
Primero el frame a escala de grises:
Ahora se aplica el filtro blur y se binariza:
Así se obtienen los contornos:

Se hace un filtro que elimina las líneas por tamaños y posiciones inadecuadas:
Ahora si se detecta correctamente las líneas en los frames. Entonces se procede a calcular en angulo en radianes para cada una de ellas, para después poder compararlo con los datos que ya se tenían.
Viendo el proyecto un poco más del lado del programador y de la visión computacional lo que en realidad hace el programa es la detección de líneas formateando aquellas que no cumplen con las características del brazo del robot.
El siguiente es un diagrama que puede enseñarnos de manera mas gráfica el funcionamiento de las entradas, salidas y el proceso del software:
Se obtiene cada frame del vídeo y cada una de ellas pasa por el proceso descrito en el cuadro verde, utilizando la librería de opencv, primero se pasa a escala de grises, después a blur, enseguida se binariza, se encuentran los contornos, las líneas y se elimina la basura es decir todas aquellas líneas encontradas que no cumplen con las características del brazo del robot ya sea pendiente, largo, posición etc.
Los resultados son una lista de los ángulos en radianes que se midieron teniendo las líneas así como una gráfica ilustrando eso mismo y el vídeo con el dibujo de la línea.
Librerías utilizadas
Como lenguaje de programación se utilizó python, con las librerías OpenCV ya que contiene muchos módulos que realizan los algoritmos de manera rápida y optima, y tiene funciones que ayudan a manejar los vídeos, ya que yo en mi caso es lo que utilizo.
- OpenCV,
- Blur (hacer la imágen difusa)
- Edge detection (obtener los contornos)
- HoughLinesP (las líneas en la imagen)
- Para las gráficas lo que se uso fue matplotlib que ayuda a gráficar desde python así como facilita las gráficas en tiempo real.
- Numpy, se utiliza para ayudar a matplotlib a hacer las gráficas con los valores de los ejes más ordenados o generados con menos líneas de código.
Desempeño
El vídeo contiene 30 frames por lo que lo ideal sería que se alcanzaran a procesar en tiempo real y no haya ningún tipo de atraso ni se brinquen frames, esta es la gráfica que muestra el desempeño:
Y el tiempo transcurrido en total es de 64 segundos, siendo que el vídeo original tiene una duración de 1 minuto y 33 segundos.
Se procesan aproximadamente 43 frames por segundo.
Trabajo a futuro
En una etapa posterior el proyecto se enfocaría en efectuar mediciones de las coordenadas inerciales de drones y vehículos terrestres.
Como resultado se pretende obtener un comparativo del uso de sistemas de visión vs sensores (infrarojos, ultrasonido, MEMS), ilustrando sus puntos fuertes y desventajas.
Una vez comprobado que la visión computacional si funciona es posible instalar alguna cámara fija enfrente del robot para poder estar calculando sus ángulos.
Se podría comenzar a desarrollar un sistema web que realice las mediciones en tiempo real en un servidor para estar mandando las imágenes por internet y poder controlar desde lejos los movimientos de los brazos del robot.
Conclusiones
En la gráfica podemos ver resultados satisfactorios del uso de la visión computacional ya que arroja resultados casi idénticos a los que se tienen registrados por los MEMS, entonces es totalmente factible utilizar esta técnica por lo menos para medir el ángulo de los brazos de un robot en 2 dimensiones. Teniendo estos resultados se puede seguir adelante con el propósito que se tiene que es poder hacer mediciones de coordenadas de los drones, etc.
>>REPOSITORIO
Referencias
Rahman, Abid. (June 2012). Countours. OpenCV Python Tutorials. Recuperado en Mayo de 2013 desde: http://opencvpython.blogspot.mx/2012/06/hi-this-article-is-tutorial-which-try.html
Referencias
Rahman, Abid. (June 2012). Countours. OpenCV Python Tutorials. Recuperado en Mayo de 2013 desde: http://opencvpython.blogspot.mx/2012/06/hi-this-article-is-tutorial-which-try.html
jueves, 9 de mayo de 2013
Detección de esquinas
Parte básica: detectar las esquinas con el método de diferencia de filtro mediano.
Para esta primera parte lo que realice fue primero la imagen original la pase a escala de grises, después de eso, hice una copia de esa imagen y le aplique el filtro de la mediana, en seguida reste las dos imágenes la del filtro de la mediana menos la gris original lo que da como resultado bordes marcados de color gris obscuro y las esquinas de un tono un poco más claras, por lo que apliqué después el umbral para obtener solo las esquinas. Aquí están los resultados:
Prueba #1
Código de diferencia:
Parte avanzada:
Teniendo las esquinas, podemos sacar un “wire-frame” al borde.
Uniendo las esquinas con segmentos de líneas rectas (u otras curvas estimadas desde las partes de borde cubiertas).
Recorriéndolos en un orden que sigue el borde (que habría que detectarse aparte con las técnicas ya conocidas) para saber en qué orden conectar las esquinas.
Lo que se hace es primeramente hacer BFS en las partes que son detectadas como esquinas para tener listas que contienen los pixeles de cada esquina, después se hace de la imagen original también un recorrido BFS para poder saber que esquina corresponde a cada imagen.
El BFS tiene que saber regresar todos los puntos del borde pero no como lo hacemos siempre, necesitamos que lo recorra en una sola dirección es por eso que se pone como una especie de tope a cada figura al inicio del recorrido BFS y así aseguramos que siempre vaya en una dirección y no se confundan las esquinas.
Yo dibuje un circulo de 6 de diámetro y con esto aseguro tapar una parte del borde y así el recorrido se va por una sola dirección, se puede dibujar una línea también o lo que sea.
Con el tope se ve así:
Lo que se hace ahora es recorrer todos los puntos del borde en el orden ya dicho, y se busca alguna coincidencia con los puntos que ya teníamos guardados previamente de las esquinas, y cuando coincidan se guarda el punto en una lista a la que llamé vértices, y cuando termina el recorrido de cada figura se empiezan a dibujar las líneas:
Resultados:
Repositorio
Para esta primera parte lo que realice fue primero la imagen original la pase a escala de grises, después de eso, hice una copia de esa imagen y le aplique el filtro de la mediana, en seguida reste las dos imágenes la del filtro de la mediana menos la gris original lo que da como resultado bordes marcados de color gris obscuro y las esquinas de un tono un poco más claras, por lo que apliqué después el umbral para obtener solo las esquinas. Aquí están los resultados:
Prueba #1
![]() |
| Imagen original |
![]() |
| Imagen filtro mediana |
![]() |
| Resultado de la diferencia |
![]() |
| Binarizada |
Prueba #2
![]() |
| Imagen original |
![]() |
| Imagen con filtro mediana |
![]() |
| Resultado de la diferencia |
![]() |
| Binarizada |
Parte avanzada:
Teniendo las esquinas, podemos sacar un “wire-frame” al borde.
Uniendo las esquinas con segmentos de líneas rectas (u otras curvas estimadas desde las partes de borde cubiertas).
Recorriéndolos en un orden que sigue el borde (que habría que detectarse aparte con las técnicas ya conocidas) para saber en qué orden conectar las esquinas.
Lo que se hace es primeramente hacer BFS en las partes que son detectadas como esquinas para tener listas que contienen los pixeles de cada esquina, después se hace de la imagen original también un recorrido BFS para poder saber que esquina corresponde a cada imagen.
El BFS tiene que saber regresar todos los puntos del borde pero no como lo hacemos siempre, necesitamos que lo recorra en una sola dirección es por eso que se pone como una especie de tope a cada figura al inicio del recorrido BFS y así aseguramos que siempre vaya en una dirección y no se confundan las esquinas.
Yo dibuje un circulo de 6 de diámetro y con esto aseguro tapar una parte del borde y así el recorrido se va por una sola dirección, se puede dibujar una línea también o lo que sea.
Con el tope se ve así:
![]() |
| Corte del borde con una línea negra delgada |
![]() |
| Corte del borde con un circulo de 6 de diámetro. |
BFS modificado:
Lo que se hace ahora es recorrer todos los puntos del borde en el orden ya dicho, y se busca alguna coincidencia con los puntos que ya teníamos guardados previamente de las esquinas, y cuando coincidan se guarda el punto en una lista a la que llamé vértices, y cuando termina el recorrido de cada figura se empiezan a dibujar las líneas:
Resultados:
![]() |
| Esquinas conectadas |
![]() |
| Esquinas conectadas |
Referencias
Repositorio
jueves, 2 de mayo de 2013
Detección de polígonos
- El primer paso fue sacar sacar los bordes de los objetos con el filtro laplaciano
- Después se binariza:
- Se hace un recorrido BFS por cada contorno de la figura y se guarda figura por figura.
- Ahora se saca el gradiente de cada pixel de contorno con la formula siguiente para no hacerlo de toda la imagen y no se tarde tanto:
- Después que se tienen todos los angulo se comienzan a agrupar los que tienen ángulos iguales para obtener las líneas que son continuas:
Sin embargo mi filtro no detecta muy bien los angulos de algunas lineas continuas hay un problema, que no puede detectar todas las lineas.
Este es el código completo:
Para la detección de los elipses los centros los detecte tomando votos como otras veces, pero hay algunos errores en los centros, pero creo que va por buen camino para poder clasificarlos:
jueves, 25 de abril de 2013
Preprocesamiento - Detección de agujeros
Prueban con algunas imágenes que contienen unos pocos objetos que no se empalman entre ellos y que tienen agujeros.
Usen fotografías tomadas por ustedes mismos.
Las fotografías que yo usaré son:
Dibujen encima de cada imagen una recta para cada pico del histograma lateral; independientemente para horizontal & vertical.
Imágenes mias:
Código:
Refrencias
Visión computacional - Elisa Schaeffer
Usen fotografías tomadas por ustedes mismos.
Las fotografías que yo usaré son:
Dibujen encima de cada imagen una recta para cada pico del histograma lateral; independientemente para horizontal & vertical.
Imágenes mias:
![]() |
| en esta imagen vemos que se dibujan varias líneas debido a que los agujeros no están alineados |
Imagen de internet 1:
Imagen de internet 2:
Imagen de internet 3:
Código:
Refrencias
Visión computacional - Elisa Schaeffer
Suscribirse a:
Entradas (Atom)





















































