2011-03-02 9 views
6

Attualmente, in C#, sto cercando di capire un modo per trovare uno schema specifico in un'immagine grande, uno screenshot. È necessaria una corrispondenza del 100%, quindi il problema è abbastanza semplice.Corrispondenza modello immagine (se esistono coordinate di ritorno)

prova materiale: http://www.myhideout.eu/temp/pattern.png (NB: i pixel trasparenti sono irrilevanti e non devono essere testati.) http://www.myhideout.eu/temp/test.png

Se viene trovato un modello, avrò bisogno di una sorta di coordinare in modo so dove, ma è la parte facile.

L'unico approccio che ho escogitato finora è l'ovvio. Prendi il primo pixel del pattern e itera l'immagine di prova fino a trovare una corrispondenza, quindi prova il resto del pattern fino a quando il test fallisce o non c'è più pattern. Se il test fallisce, vai al pixel successivo che corrisponde al primo pixel del pattern e riprova. Se si esegue l'immagine di prova senza una corrispondenza, ovviamente non esiste un tale modello e questo dovrebbe essere il risultato del test.

La teoria funziona, ma in realtà le cose sono un po 'più complicate. Non ho ancora trovato un modo corretto di strutturare il codice e i test case che ho fatto hanno avuto alcuni bug piuttosto strani, il che non è una grande sorpresa considerando la complessità.

Tuttavia, la mia più grande preoccupazione è il tempo. Questa è solo una piccola parte di un lungo processo e l'obiettivo è portare il tempo di esecuzione totale a un paio di secondi. Immagina un'immagine 1920 * 1200, che è circa il limite, dove il modello è alla fine e diverse corrispondenze parziali si verificano prima.

Ho ovviamente cercato la rete, vari forum, ecc., Ma l'unico materiale che ho trovato è molto avanzato e sarebbe di scarsa utilità anche se riuscissi a capire che è pensato per scopi molto diversi.

Ho anche considerato se fosse possibile convertire il modello e l'immagine di prova in una sorta di bitset e quindi solo AND, SHIFT e/o MASK attraverso di esso, ma questo va oltre le mie attuali capacità.

Penso di aver descritto i miei problemi qui. Mi dispiace per il ritardo degli esempi di codice, ma quello che ho sarebbe di scarsa utilità per chiunque e anche un po 'imbarazzante.

Apprezzerò molto qualsiasi aiuto.

risposta

1

Se è possibile garantire che le immagini abbiano lo stesso orientamento, la semplice implementazione sarà probabilmente la più veloce.

Tuttavia, se stai verificando le immagini che sono state ruotate, convertite in scala di grigi o in qualsiasi altro tipo di trasformazione, fallirà rapidamente.

Non ho alcun codice per voi, ma ci sono alcune buone risorse da Generation5 (articoli AI), in particolare da McGill University's COMP-644 (Pattern Recognition) course.

Spero ti piaccia la matematica.

+0

Grazie per la risposta. Se è vero quello che dici, immagino che sia solo questione di capire come strutturare il codice correttamente. – Zacariaz

+0

Sarò sicuro di dargli un'occhiata. Grazie. – Zacariaz

0

Oltre alla ricerca generale sul pattern matching

  1. La descrizione della vostra strategia di ricerca suona come l'algoritmo di ricerca stringa di forza bruta; puoi applicare metodi ottimizzati per la ricerca di stringhe (ad es.Boyer Mooore) per il tuo problema?
  2. Guardando il tuo modello e il tuo 'pagliaio' - una (rapida?) Ricerca del riquadro grigio prima di cercare le icone dovrebbe migliorare la velocità di esecuzione.
  3. Se è possibile restringere l'area in cui prevedere il modello e pre-elaborare i motivi, è possibile utilizzare il codice/concetti OCR.

Naturalmente, niente può battere una libreria che fa esattamente quello che vuoi.

+0

Ho cercato Boyer Mooore e, sinceramente, non credo di aver capito il concetto. Mi ha comunque dato l'idea che dovrò riflettere. Per ora, supponiamo di controllare il primo pixel del patter contro il primo pixel dell'immagine di prova. Se corrisponde, fai come descritto in precedenza, ma in caso contrario, si passa comunque al pixel successivo nel patter, tuttavia, nell'immagine di prova si spostano di 2 pixel in avanti. Ciò potrebbe, potenzialmente, metà del lavoro che penso, ma ho bisogno di pensarci. 2. Sì, suppongo di sì, ma penso che sarà un'implementazione successiva, per ora farò un passo alla volta. – Zacariaz

Problemi correlati