¿Cómo reconocer el mosaico hexagonal en el juego de mesa?

16

Me gustaría reconocer los límites de un mosaico hexagonal en una fotografía, como en la imagen a continuación:

ingrese la descripción de la imagen aquí

Me parece que un enfoque estándar en una cuadrícula cuadrada es detectar primero las esquinas (por ejemplo, canny) y luego extraer las líneas más largas a través de una transformación Hough o algo similar.

Esto no parece una solución óptima con mosaico hexagonal, porque la longitud de las líneas externas es más corta y es difícil separarlas de otras líneas.

¿Hay algún algoritmo para abordar este problema? Sería particularmente bueno tener una solución en opencv, pero también estoy interesado en ideas generales.

actualizar:

Con python y opencv pude recibir este resultado: contornos

Aquí está mi código:

import cv2
import numpy as np

imgOrig = "test1";
img = cv2.imread(imgOrig+".jpg");  
lap = cv2.Laplacian(img, cv2.IPL_DEPTH_32F, ksize = 3)  
imgray = cv2.cvtColor(lap,cv2.COLOR_BGR2GRAY)  
ret,thresh = cv2.threshold(imgray,127,255,0)
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
size = img.shape
m = np.zeros(size, dtype=np.uint8)
for i, cnt in enumerate(contours):
    if cv2.contourArea(cnt) >= 1:
        color = (255,255,255)
        cv2.drawContours(m, cnt, -1, color, -1)
cv2.imwrite(str(imgOrig)+"contours.jpg", m);

La imagen laplaciana de la imagen se ve así: laplaciano

Trataré de optimizar los parámetros de este enfoque y luego trataré de interpolar los límites de las cuatro secciones.

snalx
fuente
55
El procesamiento de la señal se une a los juegos de euro; ¡Mis sentidos geek tiemblan!
nispio
1
Si siempre está usando el mismo tamaño de tabla y siempre tendrá aproximadamente la misma vista de la tabla en la imagen, entonces podrá resolver el problema simplemente reconociendo el contorno de la tabla para determinar el tamaño y el registro. La colocación y el tamaño de los mosaicos es constante con respecto a los bordes del tablero, por lo que una vez que sepa dónde están todos sus bordes, debería poder inferir con precisión las posiciones de los mosaicos internos.
nispio
Gracias por su sugerencia, @nispio. El tamaño del tablero es el mismo todo el tiempo, mientras que la vista del tablero puede cambiar bastante. El color del fondo también es diferente en otras imágenes, lo que conduce a un contraste mucho menor. Si el fondo es de color beige, por ejemplo, la posición del contorno es difícil de determinar.
snalx
1
Si no obtiene otras respuestas, creo que es una buena idea publicar sus ediciones como respuesta a su propia pregunta. ¡Sin embargo, no estoy seguro de cómo interactúa eso con la recompensa!
lmjohns3
1
@snalx: Si publica sus hallazgos como respuesta, le otorgaré la recompensa. Sin embargo, debe hacerse en las próximas 12 horas.
enero

Respuestas:

6

1er enfoque:

Use los métodos de entrenamiento con haart de opencv de acuerdo con este tutorial http://note.sonots.com/SciSoftware/haartraining.html ; esto debería dar los mejores resultados, pero hasta ahora no he trabajado con el entrenamiento con haart.

Segundo enfoque:

Sugeriría utilizar métodos de "seguimiento sin marcadores" de las fichas individuales del tablero. También puede implementar esto usando OpenCV.

Preparación

  1. Para este propósito, necesitará algunas fotos de cada tipo de mosaico. Tome una foto de todos los tipos de mosaico (cada uno como una imagen), con un fondo homogéneo de mosaico de vista de arriba hacia abajo en el medio de la imagen.

  2. Luego use algún detector de características (OpenCV tiene múltiples algoritmos para esto, pero SIFT / SURF son algoritmos no libres; sugeriría usar "RÁPIDO") para encontrar puntos distintivos en las imágenes.

  3. Use un descriptor de características para describir la característica que se encuentra en la imagen (use, por ejemplo, "BREVE").

Detección

Ahora puede detectar los mosaicos en una imagen aplicando los mismos algoritmos de detector / descriptor de características a esta imagen. Cuando haya adquirido las características / descriptores, puede aplicar el FlannBasedMatcher para encontrar los mosaicos.

Aquí hay un ejemplo de código / tutorial de OpenCV: http://docs.opencv.org/doc/tutorials/features2d/feature_homography/feature_homography.html#feature-homography

Notas

El Método Matcher le dará solo una coincidencia y posiblemente tendrá problemas si se encuentra más de una ficha de ese tipo en el tablero. Podría solucionar ese problema enmascarando solo algunas partes de la imagen de entrada. Sugiero hacer esto usando las coordenadas de píxeles de las características detectadas. Si, de alguna manera, detecta primero el contorno y el tamaño de los mosaicos, puede estimar aproximadamente las posiciones y el tamaño de los mosaicos en la imagen. Filtre su lista de características detectadas (por ejemplo, solo características dentro del radio de x píxeles desde el punto medio esperado del mosaico) antes de hacer coincidir y luego use la coincidencia más fuerte. Como resultado, se le dará la posición exacta del mosaico en la imagen (incluida su orientación). Si es demasiado complicado detectar el contorno del mapa, puede dejar que el usuario "apunte" a los mosaicos de las esquinas para marcar el contorno manualmente ...

Enfoque alternativo

También puede usar este método para encontrar cualquiera de los mosaicos por su contorno. Dibuje una imagen de muestra "esquemática" en escala de grises de un mosaico (hexágono) sin ninguna imagen en él. Tenga en cuenta que las regiones "oscuras" y "claras" en esta imagen deben ser correctas en el esquema, no solo algunas "líneas". Probablemente necesites experimentar con esto. Puede intentar promediar varias fotografías de diferentes mosaicos para generar una imagen "promedio" de un mosaico. Asegúrese de que las esquinas estén en la misma posición (mueva / escale las imágenes en consecuencia) y agudice la imagen cuando haya terminado (las esquinas / bordes claros deben estar visibles) y ajuste un poco el contraste, si es necesario.

SDwarfs
fuente
Gracias por su sugerencia @StefanK. Estoy un poco preocupado si el primer y segundo enfoque aún funcionan si las piezas de juego (casas) se encuentran en las fichas. Su enfoque alternativo parece prometedor, lo intentaré (tal vez después de un poco de preprocesamiento).
snalx
La detección de las líneas externas parece ser posible en la mayoría de los casos. Recientemente intenté eso con Hough transfom en imágenes similares al resultado final en mi pregunta. Actualizaré mi pregunta cuando encuentre una solución estable.
snalx
Las casas y otras piezas del juego en las fichas no deberían ser un problema. Esto hace que se cubran algunas "características", pero algunas de ellas aún se detectarán. Al menos 4 deben ser detectables. Puede probar las demostraciones de detección de funciones de opencv y ver cuántas funciones se detectan en cada mosaico ...
SDwarfs
3

Describiré mi enfoque actual, que es una combinación de reglas de juego de explotación, procesamiento de imágenes y detección de características.

Reglas relevantes del juego

Realización

Al principio uso la transformación Hough para extraer la posición del tablero de juego. La imagen de origen se parece a la imagen final en cuestión, pero con líneas más gruesas y filtré los límites más pequeños. Solo uso detectar líneas muy largas (orden de magnitud: alrededor del 60 por ciento del ancho / alto de la imagen) y un umbral muy pequeño para la coincidencia de líneas. También miro las líneas en el 40 por ciento externo de la imagen y tomo la mediana de las líneas detectadas en la parte superior, inferior, izquierda y derecha. El resultado se muestra en la imagen a continuación: Transformación de Hough

Solo necesito una aproximación aproximada, por lo que está bien. De ahora en adelante solo examino la imagen dentro de las líneas de Hough, más un poco de espacio adicional debido a la incertidumbre de la transformación de Hough.

Luego uso la detección de características, como lo propone Stefan K. en su respuesta, para detectar las características en la imagen que los jugadores no pueden tomar, es decir, castillos, mosaicos de ubicación y montañas. Utilizo el algoritmo ORB en opencv-python para hacer eso y BruteForce-Hamming-Matcher (todavía no pude ejecutar FlannBased Matcher). ORB es escala y rotación invariante. Para detectar múltiples ocurrencias de las mismas características (por ejemplo, castillos), dividí la imagen en partes, que se superponen. Esto funciona bien, ya que la resolución de imagen larga es lo suficientemente grande y la imagen se toma directamente desde arriba (todavía necesita algunas pruebas). También es un poco lento. La detección del mosaico de ubicación (taberna) se muestra como un ejemplo en la imagen a continuación detección de características del castillo

En este momento trato de encontrar la homographyTransform para extraer la posición exacta y la orientación de las características detectadas.

Espero poder reconstruir la cuadrícula a partir de esta información (posición de montañas, castillo, mosaicos de ubicación y, en la mayoría de los casos, agua). Los experimentos con corrientes parecen prometedores, aunque es necesario realizar muchos ajustes precisos y una preparación adecuada de las imágenes de características.

snalx
fuente
He hecho algo similar con Catan, pero en lugar de la homografía estoy usando el valor de color medio para cualquier mosaico dado. Identifique el mosaico como un contorno polivinílico de 6 caras con preprocesamiento para ayudar a aislar los bordes, luego convierta ese ROI en una máscara, luego aplique la máscara con bit a bit_y sobre la imagen de origen. Luego puede obtener el color medio, que puede ser suficiente para identificar la mayoría de los mosaicos, y luego puede hacer una coincidencia de patrón adicional. Acabo de comenzar esto: youtube.com/watch?v=0ezfyWkio6c
Rex Hardin