Come riconoscere la piastrellatura esagonale nel gioco da tavolo?


16

Vorrei riconoscere i confini di una piastrellatura esagonale in una fotografia, come nell'immagine qui sotto:

inserisci qui la descrizione dell'immagine

Mi sembra che un approccio standard su una griglia quadrata sia innanzitutto quello di rilevare gli angoli (ad esempio astuto) e quindi estrarre le linee più lunghe tramite una trasformazione di Hough o qualcosa di simile.

Questa non sembra una soluzione ottimale con la piastrellatura esagonale, perché la lunghezza delle linee esterne è più corta ed è difficile separarle dalle altre linee.

Esiste un algoritmo per risolvere questo problema? Sarebbe particolarmente bello avere una soluzione in Opencv, ma sono anche interessato a idee generali.

aggiornare:

Con Python e Opencv sono stato in grado di ricevere questo risultato: contorni

Ecco il mio codice:

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);

Il laplaciano dell'immagine si presenta come: laplaciano

Proverò a optare per i parametri di questo approccio e poi proverò a interpolare i confini delle quattro sezioni.


5
L'elaborazione del segnale incontra l'euro-gaming; i miei sensi geek formicolano!
nispio,

1
Se si utilizza sempre la stessa scheda di dimensioni e si avrà sempre all'incirca la stessa vista della scheda nell'immagine, si potrebbe essere in grado di risolvere il problema semplicemente riconoscendo il contorno della scheda per determinare il dimensionamento e la registrazione. Il posizionamento e il dimensionamento delle piastrelle sono costanti rispetto ai bordi della tavola, quindi una volta che sai dove sono tutti i bordi, dovresti essere in grado di inferire con precisione le posizioni delle piastrelle interne.
nispio,

Grazie per il tuo suggerimento, @nispio. Le dimensioni della scheda sono sempre le stesse, mentre la visualizzazione della scheda potrebbe cambiare un po '. Il colore dello sfondo è diverso anche in altre immagini, il che porta ad un contrasto molto più basso. Se lo sfondo è beige, ad esempio, la posizione del contorno è difficile da determinare.
Snalx,

1
Se non ricevi altre risposte, penso che sia una buona idea pubblicare le tue modifiche come risposta alla tua domanda. Non sono sicuro di come ciò interagisca con la generosità!
lmjohns3,

1
@snalx: se pubblichi i risultati come risposta, ti assegnerò la generosità. Tuttavia, deve essere fatto nelle prossime 12 ore.
gennaio

Risposte:


6

1o approccio:

Usa i metodi di haartraining di opencv secondo questo tutorial http://note.sonots.com/SciSoftware/haartraining.html - questo dovrebbe dare i migliori risultati, ma finora non ho lavorato con la haartraining ...

2o approccio:

Suggerirei di usare metodi di "tracciamento senza marker" delle singole tessere del tabellone. Puoi implementarlo anche usando OpenCV ..

Preparazione

  1. A tal fine avrai bisogno di alcune foto di ogni tipo di piastrella. Scatta una foto di tutti i tipi di tessere (ognuna come una foto), con uno sfondo omogeneo da una tessera dall'alto verso il basso al centro della foto.

  2. Quindi utilizzare alcuni rilevatori di funzionalità (OpenCV ha più algoritmi per questo, ma SIFT / SURF sono algoritmi non liberi; suggerirei di utilizzare "FAST") per trovare punti distintivi nelle immagini.

  3. Utilizzare un descrittore di funzionalità per descrivere la funzione presente nell'immagine (utilizzare ad esempio "BREVE").

rivelazione

Ora puoi rilevare i riquadri in un'immagine applicando gli stessi algoritmi di rivelatore / descrittore di caratteristiche a questa immagine. Dopo aver acquisito le caratteristiche / i descrittori, è possibile applicare FlannBasedMatcher per trovare i riquadri.

Ecco un esempio / tutorial di codice da OpenCV: http://docs.opencv.org/doc/tutorials/features2d/feature_homography/feature_homography.html#feature-homography

Appunti

Il Metodo Matcher ti darà una sola partita e potrebbe avere problemi se sul tabellone sono presenti più tessere di quel tipo. È possibile aggirare il problema mascherando solo alcune parti dell'immagine di input. Suggerisco di farlo utilizzando le coordinate pixel delle funzioni rilevate. Se, in qualche modo, rilevi prima il contorno e le dimensioni delle piastrelle, puoi stimare approssimativamente le posizioni e le dimensioni delle piastrelle sull'immagine. Filtra l'elenco di funzionalità rilevate (ad esempio solo le funzioni nel raggio di pixel X dal punto medio previsto del riquadro) prima della corrispondenza, quindi utilizza la corrispondenza più forte. Di conseguenza, ti verrà data la posizione esatta della piastrella sull'immagine (incluso il suo orientamento). Se è troppo complicato rilevare il contorno della mappa, puoi lasciare che l'utente "punti" i riquadri degli angoli per contrassegnare manualmente il contorno ...

Approccio alternativo

Puoi anche usare questo metodo per trovare solo una delle tessere in base al suo contorno. Disegna un'immagine in scala di grigi "schematica" di esempio di una piastrella (esagono) senza immagini. Si noti che le aree "scure" e "chiare" in questa immagine devono essere corrette nello schema, non solo alcune "linee". Probabilmente dovrai sperimentare questo. Puoi provare a fare la media di più fotografie di tessere diverse per generare un'immagine "media" di una tessera. Assicurati che gli angoli siano nella stessa posizione (sposta / ridimensiona le immagini di conseguenza) e affina l'immagine al termine (angoli / bordi chiari dovrebbero essere visibili) e, se necessario, regola un po 'il contrasto.


Grazie per il tuo suggerimento @StefanK. Sono un po 'preoccupato se il primo e il secondo approccio funzionano ancora se i pezzi da gioco (case) giacciono sulle piastrelle. Il tuo approccio alternativo sembra promettente, ci proverò (forse dopo un po 'di preelaborazione).
Snalx,

Il rilevamento delle linee esterne sembra essere possibile nella maggior parte dei casi. Di recente ho provato a farlo con Hough, trasfom su immagini simili al risultato finale nella mia domanda. Aggiornerò la mia domanda quando ho trovato una soluzione stabile.
Snalx,

Case e altri pezzi di gioco sulle tessere non dovrebbero essere un problema. Questo fa sì che alcune "funzionalità" vengano coperte, ma alcune verranno comunque rilevate. Almeno 4 devono essere rilevabili. Puoi provare le dimostrazioni sul rilevamento delle funzionalità di opencv e vedere quante funzionalità vengono rilevate su ogni riquadro ...
SDwarfs,

3

Descriverò il mio approccio attuale, che è una combinazione di sfruttamento delle regole di gioco, elaborazione delle immagini e rilevamento delle funzionalità.

Regole di gioco pertinenti

Realizzazione

All'inizio utilizzo la trasformazione di Hough per estrarre la posizione del tabellone. L'immagine di origine è simile all'immagine finale in questione, ma con linee più spesse e ho filtrato i confini più piccoli. Uso solo il rilevamento di linee molto lunghe (ordine di grandezza: circa il 60 percento della larghezza / altezza dell'immagine) e una soglia molto piccola per la corrispondenza delle linee. Osservo anche le linee del 40 percento esterno dell'immagine e prendo la mediana delle linee rilevate in alto, in basso, a sinistra e a destra. Il risultato è mostrato nell'immagine seguente: Trasformata

Ho solo bisogno di un'approssimazione approssimativa, quindi va bene. Da ora in poi esaminerò solo l'immagine all'interno degli Houghline, oltre a un po 'di spazio in più a causa dell'incertezza della trasformazione di Hough.

Quindi uso il rilevamento delle caratteristiche, come proposto da Stefan K. nella sua risposta, per rilevare le caratteristiche dell'immagine, che non possono essere prese dai giocatori, ad esempio castelli, tessere di localizzazione e montagne. Uso l'algoritmo ORB in opencv-python per farlo e BruteForce-Hamming-Matcher (non ero ancora in grado di far funzionare il matcher FlannBased). ORB è invariante per scala e rotazione. Al fine di rilevare più occorrenze delle stesse caratteristiche (ad esempio castelli) ho diviso l'immagine in parti, che si sovrappongono. Funziona bene se la risoluzione dell'immagine è sufficientemente grande e l'immagine viene scattata direttamente dall'alto (necessita ancora di alcuni test). È anche un po 'lento. Il rilevamento della piastrella di posizione (taverna) è mostrato come esempio nell'immagine seguente rilevamento delle caratteristiche del castello

Al momento provo a trovare l'omografia Trasforma per estrarre la posizione e l'orientamento esatti delle funzioni rilevate.

Spero di essere in grado di ricostruire la griglia da queste informazioni (posizione di montagne, castello, tessere di localizzazione e nella maggior parte dei casi acqua). Gli esperimenti sulle correnti sembrano promettenti, anche se è necessario fare molta messa a punto e una corretta preparazione delle immagini delle caratteristiche.


Ho fatto qualcosa di simile con Catan ma al posto dell'hoomografia sto usando il valore cromatico medio per una data tessera. Identifica la piastrella come un poli contorno a 6 facce con pre-elaborazione per aiutare a isolare i bordi, quindi converti quel ROI in una maschera, quindi applica la maschera con bitwise_e sull'immagine di origine. È quindi possibile ottenere un colore medio, che può essere sufficiente per identificare la maggior parte delle tessere, quindi è possibile eseguire una corrispondenza aggiuntiva del motivo. Ho appena iniziato questo: youtube.com/watch?v=0ezfyWkio6c
Rex Hardin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.