2009-07-31 31 views
8

Tengo una imagen, tomada de una cámara web en vivo, y quiero ser capaz de detectar un objeto específico en la imagen y extraer esa parte para hacer un procesamiento posterior.Detectar un objeto en una imagen de cámara en C#

Específicamente, la imagen sería de un tablero de juego, digamos a los fines de esta pregunta que es un tablero de Sudoku. Aquí hay un sample image.

Mi enfoque inicial fue buscar áreas contrastantes y resolverlas a partir de ahí, pero parece que terminé con muchos bordes potenciales (muchos erróneos) y sin pistas reales sobre cómo saber cuáles son los ¡los que realmente quiero!

¿Existen algoritmos, librerías, muestras de código o incluso ideas brillantes por ahí, sobre cómo encontrar y extraer la parte relevante de la imagen?

Respuesta

8

utilice la biblioteca de procesamiento de imágenes AForge.Net gratuita para esto. hay un montón de cosas geniales para jugar.

+6

El hecho de que alguien te dé un martillo no significa que puedas construir una casa. Tener herramientas es útil, pero debes saber qué vas a hacer con la herramienta. –

3

Necesita realizar operaciones de filtros y máscaras en la imagen.

Creo que no hay formas simples de para obtener un objeto de la imagen, debe usar algoritmos de detección de bordes, recorte y establecer los criterios para objetos/imágenes válidos.

También puede usar el umbral de imagen para detectar objetos. Aquí está article and algorithm de Stanford Uni.

Es posible que desee consultar la siguiente biblioteca de procesamiento de imágenes.

  1. Filters API para C, C++, C#, Visual Basic .NET, Delphi, Python
  2. http://www.catenary.com/
  3. CIMG más rica que la biblioteca anterior sin embargo, está escrito en C++
1

Una de las (Supongo que muchos posibles) enfoques:

  1. Encuentra un filtro que "obtiene/calc ula "líneas rectas (bordes, etc.) de una imagen determinada.

  2. Ahora tiene la colección (conjunto) de todas las líneas (xStart, yStart & xEnd, yEnd). Puede calcular fácilmente todas las longitudes de línea a partir de las coordenadas.

  3. Ahora, teniendo en cuenta que siempre se puede (!) Esperar "un cuadrado más grande/rectángulo" dentro de la imagen, sería bastante fácil encontrar y calcular la región deseada-sudoku-rectángulo y recortarla de la imagen para hacer un procesamiento adicional.

EDITAR: Solucionar/programar ese tipo de problemas es siempre desafiante PERO realmente interesante al mismo tiempo :).

0

Puede intentar primero encontrar las intersecciones en negrita y usarlas como marcas de registro.

Este sería un buen comienzo porque:

  • son bastante uniformemente en forma de
  • Usted sabe cuántos hay
  • usted sabe dónde (más o menos) que deben estar en relación con los demás
  • variaciones de escala pueden tolerar

Así

:
  1. Aplicar un filtro de borde
  2. Escanear una máscara * de lo que el ideal + debería parecerse a través de la imagen, la grabación de todo lo que es un buen partido
  3. Seleccione el conjunto que coincide con sus expectativas mejores, según ubicación relativa entre sí
  4. Ahora también sabe dónde deben estar los números, para que pueda extraerlos fácilmente.

* Una solución más sofisticada sería usar una red neuronal en lugar de una máscara para reconocer las intersecciones. Esto podría valer la pena ya que es probable que vayas a usar uno para el OCR de los números.

+0

+1 por idea, -1 por sugerir un NN –

+0

Las imágenes son ruidosas, y las redes neuronales manejan bien los datos ruidosos. Es por eso que se usan en OCR. Dicho esto, prefiero tu sugerencia de detector Harris ... ¿tal vez como una entrada a una NN? ;-) – pufferfish

3

Esta es la característica de Coding4Fun blog entry que puede ser útil. Esto también significa una segunda votación para la biblioteca AForge, ya que el autor la usa en el ejemplo.

1

Comenzaría usando un detector de esquina (el detector Harris funciona bien) para encontrar las intersecciones y las esquinas de la cuadrícula de sudoku.

Entonces usaría esos puntos para hacer una rectificación de imagen para transformar la imagen y hacer que la cuadrícula sea lo más rectangular posible. Ahora no debería tener problemas para encontrar cada cuadrado para hacer OCR.

La rectificación de la imagen no es simple y conlleva bastantes cálculos matemáticos.

estar preparado para hacer un poco de lectura :)

Si las imágenes de los tableros de juego son ya cerca rectangular por supuesto puede omitir la parte de rectificación y utilizar directamente los puntos de esquina para encontrar sus plazas para OCR.

Mucha gente ha sugerido utilizar redes neuronales. Estoy bastante seguro de que lanzar una red neuronal sobre este problema es totalmente innecesario. Los NN son (a veces) buenos si necesita clasificar objetos donde la definición del objeto es vaga. "Encontrar coches en la imagen" es un problema que podría tener un uso para una red neuronal ya que los automóviles pueden verse muy diferentes pero tienen algunas características iguales. Por lo tanto, con suficientes datos, puede entrenar a su NN para detectar automóviles. En este problema, tiene algo que es muy regular y siempre se ve casi igual, por lo que un NN no hará que nada sea más fácil o mejor.

+0

+1 para "Prepárate para leer un poco :)" – Niki

0

Sin rechazar ninguna de las otras ideas, el paso 1 realmente debería ser la detección de la rotación de la imagen. Puede hacer esto determinando el gradiente local en cada punto y creando un histograma del mismo. Esto tendrá 4 componentes principales en desplazamientos de 90 grados.Idealmente, estos serían 0, 90, 180 y 270, pero si no lo son, debería rotar su imagen. P.ej. en la imagen de muestra debe comenzar con una rotación de aproximadamente 8 grados CW.

1

Uso colorfiltering aforge

Hay muchas método de filtrado previsto C#, principalmente prefiero filtros aforge, para este fin tienen unos filtros, son

* ColorFiltering 
* ChannelFiltering 
* HSLFiltering 
* YCbCrFiltering 
* EuclideanColorFiltering 

See here

0

Debe buscar en google CamShift o Blob tracking o Filtros de partículas. Todos son útiles para su problema. Y la mayoría de ellos se envían con OpenCV y su envoltorio de C# AForge.NET. Encontrarás algunas demos agradables en Youtube que muestran cómo funcionan.

Buena suerte

Cuestiones relacionadas