2011-12-29 35 views
5

Estoy tratando de encontrar una biblioteca de visión fácil de usar para C++. Aquí está mi situación: Tengo una cámara de interfaz con el ordenador (por simplicidad, sin embargo, sólo podemos suponer que existen los archivos de imagen en el ordenador) y esto es lo que las imágenes serán idealmente ser:¿La biblioteca de visión C++ OpenCV es adecuada para este caso de segmentación de imágenes?

enter image description here

La idea es que tres objetos apilados verticalmente tengan colores altamente contrastantes. Necesito determinar la ubicación de los objetos, por lo que la biblioteca de visión tendrá que encontrar los bordes de los objetos o determinar su centro de masas.

Nunca antes había usado un sistema de visión, así que he estado investigando y parece que OpenCV es bastante popular. ¿Sería fácil de usar para mi aplicación, o existe otra biblioteca que podría usarse para determinar las posiciones de los objetos fácilmente?

Gracias por su consejo!

Respuesta

4

Para esta imagen en particular, no es necesario trabajar en el espacio a todo color, sino que puede trabajar en la intensidad solos (la parte "V" del HSV - "valor", es decir, la intensidad).

enter image description here

Ya sea que utilice el espacio Valor o espacio de Hue, como se ha mencionado Penélope, dependerá de las imágenes naturales elabora para sus objetos reales. Para el caso general, es posible que necesite usar una combinación de matiz y valor (intensidad) para segmentar las imágenes correctamente. En lugar de trabajar en el espacio vectorial de hue-value, es más sencillo trabajar en los planos de imagen H y V por separado y luego combinar los resultados. (La segmentación en espacios de vectores 3D es ciertamente posible, pero probablemente sería innecesariamente complicado para este proyecto).

El algoritmo de cuenca en OpenCV podría ser una buena opción para sus necesidades. http://www.seas.upenn.edu/~bensapp/opencvdocs/ref/opencvref_cv.htm

Una palabra de advertencia sobre el método de Otsu: está bien para separar dos modos cuando un histograma de valores de intensidad (o valores de tono) es una distribución bimodal, pero para imágenes naturales que no es común tener verdaderas distribuciones bimodales. Si los objetos de fondo y/o en primer plano varían en intensidad y/o matiz de un lado a otro de un objeto, entonces Otsu puede tener un bajo rendimiento.

Otsu ciertamente puede extenderse para múltiples modos, como se explica en Digital Image Processing por Gonzalez and Woods y otros libros de texto introductorios sobre el tema. Sin embargo, un gradiente de fondo causará problemas incluso si usa Otsu para separar un par de modos a la vez.

También querrá asegurarse de que si la lente de su cámara se acerca o aleja, aún encontrará los mismos umbrales de binarización. La técnica básica de Otsu usa todos los píxeles en el histograma de la imagen. Eso significa que podría codificar todos los píxeles de la imagen para producir ruido puro con el mismo histograma de imagen que su imagen original, y el método de Otsu generaría el mismo umbral.

Un truco común es confiar en los píxeles cerca de los bordes. En su ejemplo, podemos considerar una imagen como una región con bordes afilados, esquinas agudas y (con suerte) valores HSV uniformes. Los píxeles de muestreo cerca de los bordes se pueden realizar de varias formas, incluidas las siguientes:

  1. Encuentra puntos de borde fuertes (usando Canny o alguna técnica más simple). A lo largo de la dirección del gradiente de borde, y en las distancias +/- D desde el punto de borde, muestree los niveles de gris del primer plano (relativo) y el fondo (relativo). La distancia D debería ser mucho más pequeña que el tamaño de los objetos en cuestión.
  2. Encuentra puntos de ventaja fuertes. Use los niveles de gris en los puntos de borde mismos como estimaciones del umbral deseado probable. En su ejemplo, tendrá dos picos fuertes: uno en el borde entre object1 y object2, y el otro en el borde entre object2 y object3.

Dado que sus objetos tienen esquinas, puede usarlos para ayudar a identificar los límites de objeto y/o los píxeles de borde adecuados para el muestreo.

Si tiene objetos nominalmente rectangulares, también puede usar un borde Hough o algoritmo de borde RANSAC para identificar líneas en la imagen, encontrar intersecciones en las esquinas, etc.

Dicho todo esto, para casi cualquier imagen natural que involucra objetos apilados uno encima del otro se va a ejecutar en varias complicaciones:

  • Sombras
  • color y la intensidad gradientes a través de un objeto nominalmente de color consistente
  • bordes de diferente nitidez si los objetos son unas distancias variables del sistema óptico

Si sabe con certeza cuántos objetos s están presentes, puede probar una técnica K Means. http://aishack.in/tutorials/knearest-neighbors-in-opencv/

para tareas más complejas de segmentación, como cuando no se conoce el número de objetos, puede utilizar el Mean Shift técnica, aunque recomiendo probar las técnicas más simples primero.

El primer paso y la solución más fácil es utilizar una iluminación adecuada. Para reducir los reflejos y las sombras, use iluminación difusa. Para muchas aplicaciones, la iluminación más cercana a la idealmente difusa es la iluminación de "día nublado": http://www.microscan.com/en-us/products/nerlite-machine-vision-lighting/cdi-illuminators.aspx

Más simplemente, podría probar una o más luces de "rebote" como las que se usan en la fotografía de estudio. http://www.photography.com/articles/taking-photos/bounce-lighting/

7

OpenCV es definitivamente una biblioteca de visión fácil de usar. Lo he usado en bastantes proyectos de visión por computadora y para mí es bastante intuitivo de usar.

Supongo que los colores del objeto son desconocidos (si no, here's es un buen tutorial sobre cómo encontrar un color específico en OpenCV).

He aquí una idea aproximada para resolver su problema (estoy pensando en la línea de lo que las operaciones son fáciles de implementar en OpenCV):

  • convertir la imagen en VHS espacio de color - los colores deben tener muy diferentes valores de tono en este espacio si tienen alto contraste, a fin de utilizar sólo la imagen Hue

  • umbral de la imagen utilizando el método de Otsu (umbral será determinado automáticamente)

  • si p detecta el objeto del medio (p. hay 2 componentes conectados en un fondo) la segmentación está hecha. Puede usar findContours o incluso Hough transform para líneas si los objetos tienen forma cuadrada.

  • si selecciona solo el objeto externo, puede encontrar sus contornos de la misma manera, configure la Región de interés (parte de la imagen en la que está trabajando) para que esté dentro de los contornos y limite el interior parte de la imagen de nuevo para encontrar el borde entre los otros dos objetos. Al final, simplemente superponga los contornos que se encuentran en una imagen separada.

  • El caso más complicado es si umbrales para que solo encuentre el objeto más interno. a primera vista, no se puede diferenciar eso del caso anterior, pero el segundo umbral (interno) no dará ningún resultado relevante. En ese caso, puede elegir un Hue justo fuera del área de umbral encontrado (Tono del segundo objeto), y establecer el Tono del objeto más interno (recién encontrado) a eso. Ahora, vuelve a obtener una imagen de 2 Hue, que puede modificar y encontrar contornos entre los dos objetos externos. Al final, al igual que en el caso anterior, superponga los contornos encontrados.

+0

"los colores deben tener valores de Hue muy diferentes en este espacio" Truco útil, lo recordaré. – SigTerm

Cuestiones relacionadas