Domanda

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 eseguire ulteriori elaborazioni.

In particolare, l'immagine sarebbe di un tabellone di gioco, diciamo ai fini di questa domanda che è un tabellone di gioco di Sudoku.

Il mio approccio iniziale era quello di cercare aree contrastanti e risolverle da lì, ma mi sembra di finire con molti potenziali spigoli (molti errati) e nessun vero indizio su come capire quali sono quelli In realtà voglio!

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

È stato utile?

Soluzione

usa la AForge.Net gratuita per l'elaborazione delle immagini. c'è un sacco di cose interessanti con cui giocare.

Altri suggerimenti

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

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

È inoltre possibile utilizzare il limite di immagini per rilevare l'oggetto. Si consiglia di consultare la libreria di elaborazione delle immagini di seguito.

  1. Filtri API per C, C ++, C #, Visual Basic .NET, Delphi, Python
  2. http://www.catenary.com/
  3. CIMG più ricco della libreria di cui sopra ma è scritto in C ++

Uno degli approcci (immagino molti possibili):

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

  2. Ora hai la raccolta (array) di tutte le linee (xStart, yStart & amp; xEnd, yEnd). Puoi facilmente calcolare tutte le lunghezze delle linee dalle coordinate.

  3. Ora, considerando che puoi sempre (!) aspettarti " uno-più grande quadrato / rettangolo " all'interno dell'immagine, sarebbe abbastanza facile trovare e calcolare la regione desiderata del sudoku-rettangolo e ritagliarla dall'immagine per eseguire ulteriori elaborazioni.

EDIT: risolvere / programmare quel tipo di problemi è sempre una sfida, ma allo stesso tempo è davvero interessante :).

Potresti provare a utilizzare Hough Transform .

Vorrei iniziare usando un rilevatore d'angolo (Il rilevatore Harris funziona bene) per trovare le intersezioni e gli angoli della griglia del sudoku.

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

La rettifica delle immagini non è semplice e comporta molta matematica.

Preparati a leggere un po ':)

Se le immagini delle schede di gioco sono già vicine al rettangolare, puoi ovviamente saltare la parte di rettifica e utilizzare direttamente i punti d'angolo per trovare i tuoi quadrati per l'OCR.

Molte persone hanno suggerito di usare le reti neurali. Sono abbastanza certo che lanciare una rete neurale su questo problema sia totalmente inutile. Gli NN sono (a volte) validi se è necessario classificare oggetti in cui la definizione dell'oggetto è vaga. " Trova auto nell'immagine " è un problema che potrebbe essere utilizzato per una rete neurale poiché le auto possono apparire molto diverse ma avere alcune caratteristiche uguali. Pertanto, dati sufficienti, puoi addestrare il tuo NN per rilevare le auto. In questo problema hai qualcosa che è molto regolare e sembra quasi sempre lo stesso, quindi un NN non renderà nulla di più facile o migliore.

Usa aforge colorfiltering

Esistono molti metodi di filtraggio forniti per c #, principalmente preferisco i filtri aforge, per questo hanno pochi filtri, sono

* ColorFiltering
* ChannelFiltering
* HSLFiltering
* YCbCrFiltering
* EuclideanColorFiltering

Vedi qui

Dai un'occhiata a: https://github.com/dajuric/accord-net-extensions

La libreria " unisce " la libreria gratuita AForge.NET e Accord.NET e aggiunge algoritmi di elaborazione delle immagini e di tracciamento degli oggetti. Campioni inclusi :)

Potresti prima provare a trovare le intersezioni in grassetto e usarle come segni di registrazione.

Sarebbe un buon inizio perché:

  • Hanno una forma abbastanza uniforme
  • Sai quanti ce ne sono
  • Sai dove (approssimativamente) dovrebbero trovarsi l'uno rispetto all'altro
  • Può tollerare variazioni di scala

  1. Applica un filtro per bordi
  2. Scansiona una maschera * di come dovrebbe essere l'ideale + sull'immagine, registrando tutto ciò che è una buona corrispondenza
  3. Scegli il set che soddisfa meglio le tue aspettative, in base alla posizione l'uno rispetto all'altro
  4. Ora sai anche dove dovrebbero essere i numeri, in modo da poterli estrarre facilmente.

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

Senza rifiutare nessuna delle altre idee, il passaggio 1 dovrebbe davvero essere il rilevamento della rotazione dell'immagine. Puoi farlo determinando il gradiente locale in ciascun punto e creandone un istogramma. 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.

Dovresti cercare su Google CamShift o Blob tracking o Filtri antiparticolato . Sono tutti utili per il tuo problema. E la maggior parte di essi viene fornita con OpenCV ed è il wrapper C # AForge.NET. Troverai alcune belle demo su Youtube che mostrano come funzionano.

Buona fortuna

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top