2009-07-31 11 views
8

Ho un'immagine, presa da una webcam live, e voglio essere in grado di rilevare un oggetto specifico nell'immagine ed estrarre quella parte di esso per fare qualche ulteriore elaborazione.Rileva un oggetto in un'immagine della telecamera in C#

In particolare, l'immagine sarebbe di una scheda di gioco, diciamo ai fini di questa domanda che si tratta di una scheda di gioco Sudoku. Ecco uno sample image.

Il mio approccio iniziale era quello di cercare aree contrastanti e risolverle da lì, ma mi sembra di avere molti margini potenziali (molti errati) e nessun vero indizio su come capire quali sono i quelli che voglio davvero!

Ci sono algoritmi, librerie, esempi di codice o anche solo idee brillanti là fuori, su come farei per trovare ed estrarre la parte rilevante dell'immagine?

risposta

8

utilizzare la libreria di elaborazione immagini AForge.Net gratuita per questo. c'è un sacco di cose interessanti con cui giocare.

+6

Solo perché qualcuno ti dà il martello non significa che puoi costruire una casa. Avere strumenti è utile ma devi sapere cosa intendi fare con lo strumento. –

3

È necessario eseguire operazioni sui filtri e maschere sull'immagine.

Penso che non ci siano modi semplici per il per recuperare l'oggetto dall'immagine, è necessario utilizzare algoritmi di rilevamento dei bordi, ritaglio e impostare i criteri per oggetti/immagini validi.

È inoltre possibile utilizzare la soglia di immagine per rilevare l'oggetto. Ecco article and algorithm da Stanford Uni.

Si consiglia di guardare sotto la libreria di elaborazione delle immagini.

  1. Filters API per C, C++, C#, Visual Basic .NET, Delphi, Python
  2. http://www.catenary.com/
  3. CIMG più ricco di quanto sopra biblioteca tuttavia è scritto in C++
1

Uno dei (Immagino che molti possibili) approcci:

  1. Trovare un filtro che "ottiene/calc "linee rette (bordi, ecc.) da una determinata immagine.

  2. Ora si dispone della raccolta (matrice) di tutte le linee (xStart, yStart & xEnd, yEnd). Puoi facilmente calcolare tutte le lunghezze delle linee dalle coordinate.

  3. Ora, considerando che puoi sempre (!) Aspettarti "un quadrato più grande/rettangolo" all'interno dell'immagine, sarebbe abbastanza facile trovare e calcolare la regione del rettangolo desiderato-sudoku e ritagliarla dall'immagine per fare qualche ulteriore elaborazione.

MODIFICA: Risolvere/programmare questo tipo di problemi è sempre impegnativo MA davvero interessante allo stesso tempo :).

0

Si potrebbe provare prima a trovare le intersezioni della linea in grassetto e utilizzarle come segni di registrazione.

Questo sarebbe un buon punto di partenza perché:

  • Sono abbastanza uniformemente a forma di
  • Sai quanti ce ne sono
  • si sa dove (approssimativamente) dovrebbero essere in relazione tra di loro
  • variazioni possono tollerare scala

Quindi:

  1. Applicare un filtro bordo
  2. scansione una maschera * di ciò che l'ideale + dovrebbe essere simile in tutta l'immagine, la registrazione di tutti quelli che sono una buona partita
  3. Selezionare il set che soddisfa le vostre aspettative migliori, in base alle posizione l'una rispetto all'altra
  4. Ora sai anche dove devono essere i numeri, quindi puoi estrarli facilmente.

* Una soluzione più sofisticata sarebbe utilizzare una rete neurale invece di una maschera per riconoscere le intersezioni. Questo potrebbe valerne la pena poiché probabilmente utilizzerai uno per l'OCR dei numeri.

+0

+1 per idea, -1 per suggerire un NN –

+0

Le immagini sono disturbate e le reti neurali gestiscono bene i dati rumorosi. Ecco perché sono utilizzati in OCR. Detto questo, preferisco il tuo suggerimento per il rilevatore Harris ... forse come input per un NN? ;-) – pufferfish

3

Questa è la caratteristica di un Coding4Fun blog entry che potrebbe risultare utile. Questo significa anche un secondo voto per la biblioteca di AForge, dal momento che l'autore lo usa nell'esempio.

1

Vorrei iniziare utilizzando un rilevatore d'angolo (il rilevatore Harris funziona in modo ottimale) per trovare le intersezioni e gli angoli della griglia di sudoku.

Quindi vorrei utilizzare quei punti per eseguire una correzione dell'immagine per trasformare l'immagine in modo che la griglia fosse la più rettangolare possibile. Ora non dovresti avere problemi a trovare ogni quadrato per fare OCR.

La rettifica dell'immagine non è semplice e comporta un sacco di matematica.

essere pronti a fare qualche lettura :)

Se le immagini delle schede di gioco sono già vicino a rettangolare potete naturalmente saltare la parte di rettifica e di utilizzare direttamente i punti d'angolo per trovare il vostro piazze per l'OCR.

Un sacco di persone hanno suggerito di utilizzare le reti neurali. Sono abbastanza sicuro che lanciare una rete neurale su questo problema è totalmente inutile. Gli NN sono (a volte) buoni se è necessario classificare gli oggetti in cui la definizione dell'oggetto è vaga. "Trovare auto nell'immagine" è un problema che potrebbe essere utilizzato per una rete neurale dal momento che le auto possono sembrare molto diverse ma hanno alcune caratteristiche uguali. Quindi, dati dati sufficienti, puoi addestrare il tuo NN a rilevare le auto. In questo problema hai qualcosa che è molto regolare e sembra sempre lo stesso, quindi un NN non renderà nulla di più facile o migliore.

+0

+1 per "Preparati a leggere un po ':)" – Niki

0

Senza rifiutare nessuna delle altre idee, il passaggio 1 dovrebbe essere effettivamente il rilevamento della rotazione dell'immagine. È possibile farlo determinando il gradiente locale in ogni punto e creando un istogramma di ciò. Questo avrà 4 componenti principali con offset a 90 gradi.Idealmente, questi sarebbero 0, 90, 180 e 270 ma se non lo sono dovresti ruotare l'immagine. Per esempio. nell'immagine di esempio dovresti iniziare con una rotazione di circa 8 gradi CW.

1

Usa aforge colorfiltering

ci sono molti metodo di filtraggio previsto C#, soprattutto preferisco filtri aforge, per questo scopo hanno pochi filtri, sono

* ColorFiltering 
* ChannelFiltering 
* HSLFiltering 
* YCbCrFiltering 
* EuclideanColorFiltering 

See here

0

Devi cercare su google per CamShift o Blob tracking o Filtri per particelle. Sono tutti utili per il tuo problema. E la maggior parte di questi sono spediti con OpenCV ed è il wrapper C# AForge.NET. Troverete alcune belle demo su Youtube che mostrano come funzionano.

Buona fortuna

Problemi correlati