Como reconhecer azulejos hexagonais no jogo de tabuleiro?


16

Gostaria de reconhecer os limites de uma telha hexagonal em uma fotografia, como na imagem abaixo:

insira a descrição da imagem aqui

Parece-me que uma abordagem padrão em uma grade quadrada é primeiro detectar cantos (por exemplo, canny) e depois extrair as linhas mais longas por meio de uma transformada de Hough ou algo semelhante.

Isso não parece a solução ideal com o revestimento hexagonal, porque o comprimento das linhas externas é mais curto e é difícil separá-las de outras linhas.

Existe algum algoritmo para resolver esse problema? Seria particularmente bom ter uma solução em opencv, mas também estou interessado em idéias gerais.

atualizar:

Com python e opencv, eu pude receber este resultado: contornos

Aqui está o meu 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);

Laplaciano da imagem se parece com: laplaciano

Vou tentar otimizar os parâmetros dessa abordagem e depois tentar interpolar os limites das quatro seções.


5
O processamento de sinais atende aos jogos do euro; meus sentidos nerds estão formigando!
Nispio

1
Se você estiver sempre usando o mesmo tamanho de quadro e sempre tiver aproximadamente a mesma visualização do quadro na imagem, poderá resolver o problema simplesmente reconhecendo o contorno do quadro para determinar o tamanho e o registro. A colocação e o dimensionamento dos ladrilhos são constantes em relação às bordas da placa. Assim, quando você souber onde estão todas as bordas, poderá inferir com precisão as posições dos ladrilhos internos.
Nispio

Obrigado pela sua sugestão, @nispio. O tamanho do quadro é o mesmo o tempo todo, enquanto a visão do quadro pode mudar bastante. A cor do fundo também é diferente em outras fotos, o que leva a um contraste muito menor. Se o fundo for bege, por exemplo, é difícil determinar a posição do contorno.
snalx

1
Se você não estiver obtendo outras respostas, acho uma boa ideia postar suas edições como resposta à sua própria pergunta. Não tenho certeza de como isso interage com a recompensa!
Lmjohns3

1
@ snalx: Se você postar suas descobertas como resposta, eu concederei a recompensa a você. Precisa ser feito nas próximas 12 horas, no entanto.
janeiro

Respostas:


6

1ª Abordagem:

Use os métodos de treinamento do opencv de acordo com este tutorial http://note.sonots.com/SciSoftware/haartraining.html - isso deve fornecer os melhores resultados, mas eu não trabalhei com o treinamento de treinamentos até agora ...

2ª Abordagem:

Eu sugeriria o uso de métodos de "rastreamento sem marcador" dos blocos individuais do tabuleiro. Você também pode implementar isso usando o OpenCV.

Preparação

  1. Para esse efeito, você precisará de algumas fotos de cada tipo de bloco. Tire uma foto de todos os tipos de blocos (cada um como uma figura), com um fundo homogêneo do bloco de cima para baixo no meio da figura.

  2. Em seguida, use algum detector de recursos (o OpenCV possui vários algoritmos para isso, mas SIFT / SURF são algoritmos não livres; eu sugiro usar "RÁPIDO") para encontrar pontos distintos nas imagens.

  3. Use um descritor de recurso para descrever o recurso encontrado na imagem (use, por exemplo, "BREVE").

Detecção

Agora você pode detectar os blocos em uma imagem aplicando os mesmos algoritmos de detector / descritor de recursos a esta imagem. Quando você adquiriu os recursos / descritores, pode aplicar o FlannBasedMatcher para encontrar os blocos.

Aqui está um exemplo de código / tutorial do OpenCV: http://docs.opencv.org/doc/tutorials/features2d/feature_homography/feature_homography.html#feature-homography

Notas

O método Matcher fornecerá apenas uma partida e, possivelmente, terá problemas se houver mais de um bloco desse tipo encontrado no tabuleiro. Você pode solucionar esse problema mascarando apenas algumas partes da imagem de entrada. Sugiro fazer isso usando as coordenadas de pixel dos recursos detectados. Se você - de alguma forma - detectar primeiro o contorno e o tamanho dos ladrilhos, poderá estimar aproximadamente as posições e o tamanho dos ladrilhos na imagem. Filtre sua lista de recursos detectados (por exemplo, somente recursos dentro do raio x-pixel a partir do ponto médio esperado do bloco) antes da correspondência e, em seguida, use a correspondência mais forte. Como resultado, você receberá a posição exata do bloco na imagem (incluindo sua orientação). Se for muito complicado detectar o contorno do mapa, você pode deixar o usuário "apontar" nos blocos de canto para marcar o contorno manualmente ...

Abordagem alternativa

Você também pode usar esse método para encontrar apenas um dos blocos pelo contorno. Faça um exemplo de imagem "esquemática" em escala de cinza de um bloco (hexágono) sem nenhuma imagem nele. Observe que as regiões "escuras" e "claras" nesta imagem precisam estar corretas no esquema, não apenas em algumas "linhas". Você provavelmente precisará experimentar isso. Você pode tentar calcular a média de várias fotografias de blocos diferentes para gerar uma imagem "média" de um bloco. Certifique-se de que os cantos estejam na mesma posição (mova / dimensione as imagens adequadamente) e afie a imagem quando terminar (cantos / bordas claras devem estar visíveis) e ajuste um pouco o contraste, se necessário.


Obrigado pela sua sugestão @StefanK. Estou um pouco preocupado se a primeira e a segunda abordagem ainda funcionam se as peças de jogos (casas) estiverem sobre os ladrilhos. Sua abordagem alternativa parece promissora, vou tentar isso (talvez depois de um pouco de pré-processamento).
snalx

A detecção das linhas externas parece ser possível na maioria dos casos. Recentemente, tentei isso com Hough transfom em imagens semelhantes ao resultado final da minha pergunta. Vou atualizar minha pergunta quando encontrar uma solução estável.
precisa saber é

Casas e outras peças de jogo nos ladrilhos não devem ser um problema. Isso faz com que alguns "recursos" sejam cobertos, mas alguns deles ainda serão detectados. Pelo menos 4 precisam ser detectáveis. Você pode experimentar as demos de detecção de recurso de opencv e olhar para quantos recursos são detectados em cada azulejo ...
SDwarfs

3

Descreverei minha abordagem atual, que é uma combinação de exploração de regras de jogos, processamento de imagens e detecção de recursos.

Regras relevantes do jogo

Realização

No começo, uso a transformação Hough para extrair a posição do tabuleiro de jogo. A imagem de origem é semelhante à imagem final em questão, mas com linhas mais espessas e filtramos os limites menores. Eu uso apenas detectar linhas muito longas (ordem de magnitude: cerca de 60% da largura / altura da imagem) e um limite muito pequeno para a correspondência de linhas. Eu também apenas olho as linhas nos 40% externos da imagem e pego a mediana das linhas detectadas nas partes superior, inferior, esquerda e direita. O resultado é mostrado na imagem abaixo: Transformação Hough

Eu só preciso de uma aproximação aproximada, então está tudo bem. A partir de agora, apenas examino a imagem dentro das Linhas de Hough, além de algum espaço extra devido à incerteza da transformação de Hough.

Então eu uso a detecção de recursos, como proposto por Stefan K. em sua resposta, para detectar os recursos na imagem que não podem ser captados pelos jogadores, como castelos, localizações e montanhas. Eu uso o algoritmo ORB no opencv-python para fazer isso e o BruteForce-Hamming-Matcher (ainda não consegui fazer o FlannBased matcher rodar). ORB é escala e rotação invariantes. Para detectar várias ocorrências dos mesmos recursos (por exemplo, castelos), divido a imagem em partes que se sobrepõem. Isso funciona bem, desde que a resolução da imagem seja grande o suficiente e a foto seja tirada diretamente da parte superior (ainda precisa de alguns testes). Também é meio lento. A detecção do bloco de localização (taberna) é mostrada como um exemplo na imagem abaixo detecção de recursos do castelo

No momento, tento encontrar o homographyTransform para extrair a posição exata e a orientação dos recursos detectados.

Espero poder reconstruir a grade com essas informações (posição das montanhas, castelo, localizações e, na maioria dos casos, água). Os experimentos em correntes parecem promissores, embora muita sintonia e preparação adequada das imagens sejam necessárias.


Fiz algo semelhante com Catan, mas em vez de hoomografia estou usando o valor médio da cor para qualquer peça. Identifique o bloco como um contorno poli de 6 faces com pré-processamento para ajudar a isolar as bordas, depois converta esse ROI em uma máscara e aplique a máscara com bit a bit_e sobre a imagem de origem. Você pode obter cores médias, o que pode ser suficiente para identificar a maioria dos ladrilhos, e fazer a correspondência de padrões adicionais. Eu apenas comecei isso: youtube.com/watch?v=0ezfyWkio6c
Rex Hardin
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.