2010-01-14 23 views
12

Estoy tratando de usar OpenCV para "analizar" capturas de pantalla del juego para iPhone Blocked. Las capturas de pantalla se recortan a tener este aspecto:Encontrar la ubicación de rectángulos en una imagen con OpenCV

Blocked screenshot

supongo que por ahora sólo estoy tratando de encontrar las coordenadas de cada uno de los 4 puntos que componen cada rectángulo. Vi el archivo de muestra squares.c que viene con OpenCV, pero cuando ejecuto ese algoritmo en esta imagen, aparece 72 rectángulos, incluidas las áreas rectangulares de espacios en blanco que obviamente no quiero contar como uno de mis rectángulos. ¿Cuál es una mejor forma de abordar esto? Intenté hacer algunas investigaciones de Google, pero para todos los resultados de búsqueda, hay muy poca información utilizable relevante.

+1

Solo tire los rectángulos que son del color incorrecto. –

Respuesta

13

El problema similar ya ha sido discutido: How to recognize rectangles in this image?

En cuanto a sus datos, rectángulos que está tratando de encontrar son los únicos objetos negros. De modo que puede intentar hacer una binarización de umbral: los píxeles negros son aquellos que tienen TODOS los tres valores RGB menores que 40 (lo he encontrado empíricamente). Esta sencilla operación hace que su imagen se vea así:

binarized picture http://img691.imageshack.us/img691/975/rectk.png

Después de que se podría aplicar la transformada de Hough para encontrar líneas (que se analizan en el tema que me he referido), o se puede hacer que sea más fácil. Calcule las proyecciones integrales de los píxeles negros a los ejes X e Y. (La proyección a X es un vector de x_i - números de píxeles negros, de modo que tiene la primera coordenada igual a x_i). Entonces, obtienes valores xey posibles como los picos de las proyecciones. Luego examine todos los segmentos posibles restringidos por x e y encontrados (si hay muchos píxeles negros entre (x_i, y_j) y (x_i, y_k), probablemente haya una línea probablemente). ¡Finalmente, componga segmentos de línea en rectángulos!

+0

Voy a elegir esta como la respuesta, porque fue extremadamente útil y es una forma interesante de abordar el problema. Pero como necesito diferenciar entre los rectángulos gris y azul, necesitaría realizar un análisis de color de todos modos, incluso si utilicé su método, así que decidí basarme en mi método original. – dancavallaro

0

Pruebe uno de los muchos detectores de esquina como el detector de esquina harris. también en general es una buena idea intentar eso con múltiples resoluciones: así que haga algún preprocesamiento de diferentes aumentos. Parece que quieres un tipo de cuadrado dominado por el color, entonces puedes suprimir los otros colores, primero usando algo como cvsplit ..... y luego ajustando el color ... así que solo queda esa región ... sigue eso con una operación de recorte ... Creo que también podría funcionar ...

+0

La detección de la esquina de Harris sería totalmente inútil ya que todas las esquinas ya se conocen, el juego está en una cuadrícula perfecta. –

2

Dado que su problema son los rectángulos pequeños, comenzaría por eliminarlos. Dado que esas líneas son mucho más delgadas que los bordes de los rectángulos, comenzaría aplicando morphological operations en la imagen.

El uso de un elemento estructural que tiene este aspecto:

element = [ 1 1 
      1 1 ] 

debería eliminar las líneas que se encuentran a menos de dos píxeles de ancho. Después de eliminar las líneas pequeñas, es probable que el algoritmo de búsqueda de rectángulo de OpenCV haga el resto del trabajo por usted. La erosión se puede hacer en OpenCV por la función cvErode

3

Los bloques se ven como mapas de bits - ¿por qué no utilizar la concordancia simple plantilla con diferentes plantillas para cada tamaño de bloque/color/orientación?

5

Terminé simplemente construyendo sobre mi método original y haciendo lo que Robert sugirió en su comentario sobre mi pregunta. Después de obtener mi lista de rectángulos, corro y calculo el color promedio sobre cada rectángulo.Compruebo si los componentes rojo, verde y azul del color promedio están cada uno dentro del 10% de los colores del rectángulo gris y azul, y si guardan el rectángulo, si no lo están, lo descarto. Este proceso me da algo como esto:

screenshot

partir de esto, es trivial para obtener la información que necesito (orientación, punto de partida, y la longitud de cada rectángulo, teniendo en cuenta la ventana de juego como una cuadrícula de 6x6).

Cuestiones relacionadas