Me gustaría reconocer los límites de un mosaico hexagonal en una fotografía, como en la imagen a continuación:
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:
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í:
Trataré de optimizar los parámetros de este enfoque y luego trataré de interpolar los límites de las cuatro secciones.
Respuestas:
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
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.
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.
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.
fuente
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:
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
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.
fuente