Gostaria de reconhecer os limites de uma telha hexagonal em uma fotografia, como na imagem abaixo:
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:
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:
Vou tentar otimizar os parâmetros dessa abordagem e depois tentar interpolar os limites das quatro seções.
Respostas:
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
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.
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.
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.
fonte
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:
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
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.
fonte