Jump to content
Nokioteca Forum

Acquisizione Ed Elaborazione Immagini


JumpJack_
 Share

Recommended Posts

A casa ho un aggeggio che in ogni istante misura i consumi di corrente di tutta casa. Purtroppo, essendo un aggeggio da 20 euro, li mostra e basta, non li memorizza.

Allora ho pensato: e se gli piazzo davanti un vecchio cell che a intervalli regolari fa una foto al display e ne ricava le informazioni numeriche?

Si potrebbe fare?!?

Link to comment
Condividi su altri siti

praticamente ti serve un programma per un telefono che faccia delle foto ad intervalli regolari da te stabiliti? ;)

questa è la parte piu' facile.

Poi devo trasformare l'immagine in dati numerici, per poterli memorizzare ed elaborare... b) Chissa' se qualcuno l'ha mai fatto prima o se devo inventarmelo da zero... b)

Cosa potrei cercare su google? ;)

Link to comment
Condividi su altri siti

Puoi cercare OCR, le foto devono essere di "buona qualità", ti conviene usare software già esistenti e professionali come omnipage, creartene uno tuo con una comparazione pixel a pixel (il modo più semplice) non conviene, per farlo funzionare hai bisogno che le foto devono avere la stessa angolazione, lontananza, illuminazione,ecc... altrimenti non ti riconoscerebbe i vari numeri.

Link to comment
Condividi su altri siti

Puoi cercare OCR, le foto devono essere di "buona qualità", ti conviene usare software già esistenti e professionali come omnipage, creartene uno tuo con una comparazione pixel a pixel (il modo più semplice) non conviene, per farlo funzionare hai bisogno che le foto devono avere la stessa angolazione, lontananza, illuminazione,ecc... altrimenti non ti riconoscerebbe i vari numeri.

beh, di sicuro il telefono starebbe sempre fisso e fermo davanti al display, quindi le immagini sarebbero sempre "coerenti" (pensavo di usare proprio un cellulare dedicato, un vecchio s60 usato da 50E).

E' venuta in mente anche a me la faccenda dell'OCR, ma devo scoprire se qualcuno ha inventato l'OCR per i display a 7 segmenti! (Non credo, che bisogno ci sarebbe?!? b) )

Link to comment
Condividi su altri siti

beh, di sicuro il telefono starebbe sempre fisso e fermo davanti al display, quindi le immagini sarebbero sempre "coerenti" (pensavo di usare proprio un cellulare dedicato, un vecchio s60 usato da 50E).

E' venuta in mente anche a me la faccenda dell'OCR, ma devo scoprire se qualcuno ha inventato l'OCR per i display a 7 segmenti! (Non credo, che bisogno ci sarebbe?!? ;) )

ripensandoci, e visto che comunque un OCR-LCD non lo trovo... mi sa tanto che non mi serve proprio: visto che il telefono starà sempre fisso, riconoscere i segmenti è concettualmente semplicissimo: se in un punto (sempre quello!) dell'immagine i pixel sono scuri, vuol dire che c'e' un segmento acesso, senno' no. Punto. b)

Certo sarebbe piu' semplice se pys60 potesse salvare le immagini in formato BMP oltre in formati compressi... b) Indago.

Link to comment
Condividi su altri siti

beh, di sicuro il telefono starebbe sempre fisso e fermo davanti al display, quindi le immagini sarebbero sempre "coerenti" (pensavo di usare proprio un cellulare dedicato, un vecchio s60 usato da 50E).

E' venuta in mente anche a me la faccenda dell'OCR, ma devo scoprire se qualcuno ha inventato l'OCR per i display a 7 segmenti! (Non credo, che bisogno ci sarebbe?!? b) )

che starebbe sempre fisso sono daccordo, ma se stiamo parlando di un programma fatto da te, anche variazioni di angolazione derivati a movimenti del cellulare nell'arco di diversi giorni (diverse riprese), potrebbero renderlo "inutile" e dovresti rivederlo di volta in volta.

Non è che può o meno "venire in mente il discorso dell'OCR", qualunque cosa fai con lo scopo di "riconoscimento ottico dei caratteri" è OCR. Non deve esistere un "OCR particolare per i display a 7 segmenti", al limite basterà adattare l'immagine se c'è qualche problema particolare.

ripensandoci, e visto che comunque un OCR-LCD non lo trovo... mi sa tanto che non mi serve proprio: visto che il telefono starà sempre fisso, riconoscere i segmenti è concettualmente semplicissimo: se in un punto (sempre quello!) dell'immagine i pixel sono scuri, vuol dire che c'e' un segmento acesso, senno' no. Punto. thumbs.gif

Certo sarebbe piu' semplice se pys60 potesse salvare le immagini in formato BMP oltre in formati compressi... dry.gif Indago.

Non so che intendi con "OCR-LCD", e quello che stai dicendo è comunque quello che ti ho scritto sopra, puoi tentare di farti un tuo programma di ocr con una scansione pixel per pixel, ma forse non hai capito bene il concetto, cerca con google qualche esempio in qualche linguaggio che conosci.

I programmi ocr solitamente accettano in input qualunque formato di immagine, quindi alla fin fine non cambia tanto se sia jpg o bmp o gif.

Modificato da dany88
Link to comment
Condividi su altri siti

che starebbe sempre fisso sono daccordo, ma se stiamo parlando di un programma fatto da te, anche variazioni di angolazione derivati a movimenti del cellulare nell'arco di diversi giorni (diverse riprese), potrebbero renderlo "inutile" e dovresti rivederlo di volta in volta.

No no, quando dico fisso intendo dire che lo avvito davanti al display!! b)

L'unica cosa che mi preoccupa sono i cambiamenti di luce (il display non è retroilluminato).

Non è che può o meno "venire in mente il discorso dell'OCR", qualunque cosa fai con lo scopo di "riconoscimento ottico dei caratteri" è OCR. Non deve esistere un "OCR particolare per i display a 7 segmenti", al limite basterà adattare l'immagine se c'è qualche problema particolare.

Non so che intendi con "OCR-LCD", e quello che stai dicendo è comunque quello che ti ho scritto sopra, puoi tentare di farti un tuo programma di ocr con una scansione pixel per pixel, ma forse non hai capito bene il concetto, cerca con google qualche esempio in qualche linguaggio che conosci.

Si vabbe', il fatto è che a me serve un OCR che riconosca i numeri di un display a 7 segmenti: 'ndo lo trovo? Non mi pare possibile che vada bene un OCR qualunque. E poi o trovo i sorgenti, o trovo un OCR configurabile da linea d comando...

OCR-LCD è l'abbreviazione di "Programma di OCR che riconosce i numeri di un display LCD"!!! b)

I programmi ocr solitamente accettano in input qualunque formato di immagine, quindi alla fin fine non cambia tanto se sia jpg o bmp o gif.

Intendevo che se devo andare a cercare in un'immagine di che colore è il pixel alle coordinate 120,343, con una bitmap, che non è compressa, sarebbe molto piu' facile...

Link to comment
Condividi su altri siti

No no, quando dico fisso intendo dire che lo avvito davanti al display!! b)

L'unica cosa che mi preoccupa sono i cambiamenti di luce (il display non è retroilluminato).

i cambiamenti di illuminazione non dovrebbero comportarti grandi problemi in uno scan pixel per pixel, basta darsi una tolleranza tra l' "acceso" e lo "spento" e se parliamo di programmi professionali non sarai certo tu ad occupartene.

Si vabbe', il fatto è che a me serve un OCR che riconosca i numeri di un display a 7 segmenti: 'ndo lo trovo? Non mi pare possibile che vada bene un OCR qualunque. E poi o trovo i sorgenti, o trovo un OCR configurabile da linea d comando...

OCR-LCD è l'abbreviazione di "Programma di OCR che riconosce i numeri di un display LCD"!!! b)

un immagine è un immagine, sia che inquadra un "display da 7 segmenti" sia che inquadra un foglio di carta, devi solo fare qualche prova.

Intendevo che se devo andare a cercare in un'immagine di che colore è il pixel alle coordinate 120,343, con una bitmap, che non è compressa, sarebbe molto piu' facile...

Non so in che linguaggio tu indenda farlo ma solitamente l'immagine si carica in un "componente" (o in un oggetto) a cui si applicano delle funzioni (o dei metodi) per lavorarci su, per esempio in vb si usa la GetPixel. Alla fin fine poco importa il formato.

Modificato da dany88
Link to comment
Condividi su altri siti

i cambiamenti di illuminazione non dovrebbero comportarti grandi problemi in uno scan pixel per pixel, basta darsi una tolleranza tra l' "acceso" e lo "spento" e se parliamo di programmi professionali non sarai certo tu ad occupartene.

Professionali?!? A me serve un programma freeware, o i sorgenti per scrivere un programma da me!

Non so in che linguaggio tu indenda farlo ma solitamente l'immagine si carica in un "componente" (o in un oggetto) a cui si applicano delle funzioni (o dei metodi) per lavorarci su, per esempio in vb si usa la GetPixel. Alla fin fine poco importa il formato.

Ah gia', c'e' l' "oggetto bitmap" che astrae l'immagine.... b)

Come si fa in python a far eseguire un task ogni TOT secondi? C'e' un sorgente di esempio?

Link to comment
Condividi su altri siti

  • 4 settimane dopo...
il mio consiglio è di far fare l'ocr non al cellulare ma direttamente al pc, al cellulare fai salvare solo le immagini per poi adattarle e convertire i dati al pc.

mmmh... ci ho provato, ma il mio programma crea un'immagine ogni pochi secondi, e deve funzionare per ore d seguito.

Stamattina l'ho fatto funzionare per 2 ore di seguito, per monitorare l'innalzamento della temperatura della macchina al sole: in 2 ore a prodotto 2500 immagini!

D'accordo, con una card da 1gb lo spazio non è un problema... ma ho fatto impallare diverse volte il cell cercando poi di copiare le immagini sul PC: impossibile, sia sul pc che sul cell i filemanager si impallano!

Ho dovuto scrivere un prog sul cell che invia ogni immagine al pc singolarmente.

In allegato un campione delle immagini; idee su come estrarne i dati numerici?

lcd.zip

Link to comment
Condividi su altri siti

La soluzione piu' sbrigativa (ma per nulla riutilizzabile) credo sia quella di realizzare un software ad hoc su pc che effettui questi passi:

1) Converta l'immagine in 16 colori (se non meno) senza dithering per filtrare tutte le "impurita' " e semplificare cosi' il processo di scansione.

2) Tramite uno scan dell'immagine bisogna individuare il rettangolo nero che racchiude l'lcd, da qui estrapolarne il "vettore" (inteso come lunghezza ed orientamento del lato superiore del rettangolo nero)

3) Utilizzare l'orientamento del vettore per applicare una rotazione all'immagine in modo da riportarla perfettamente orizzontale

4) Utilizzare la lunghezza del vettore per applicare uno zoom (positivo o negativo) all'immagine per adeguarla a delle dimensioni predefinite.

5) Per ciascun numero dell'lcd, rilevare il colore di 7 "hot-spot" predefiniti (1 hot spot per ciascun segmento) grazie a cui si puo determinare qual'e' il numero visualizzato.

Modificato da Il.Socio
Link to comment
Condividi su altri siti

La soluzione piu' sbrigativa (ma per nulla riutilizzabile) credo sia quella di realizzare un software ad hoc su pc che effettui questi passi:

1) Converta l'immagine in 16 colori (se non meno) senza dithering per filtrare tutte le "impurita' " e semplificare cosi' il processo di scansione.

2) Tramite uno scan dell'immagine bisogna individuare il rettangolo nero che racchiude l'lcd, da qui estrapolarne il "vettore" (inteso come lunghezza ed orientamento del lato superiore del rettangolo nero)

3) Utilizzare l'orientamento del vettore per applicare una rotazione all'immagine in modo da riportarla perfettamente orizzontale

4) Utilizzare la lunghezza del vettore per applicare uno zoom (positivo o negativo) all'immagine per adeguarla a delle dimensioni predefinite.

5) Per ciascun numero dell'lcd, rilevare il colore di 7 "hot-spot" predefiniti (1 hot spot per ciascun segmento) grazie a cui si puo determinare qual'e' il numero visualizzato.

1) non credo che serva

2) , 3), 4) NOn è quello che mi serve adesso, mi servirà semmai poi per generalizzare il programma. Intanto ho ruotato "a mano" l'immagine per avere i numeri dritti, e ho individuato le coordinate che identificano i 7 segmenti: fin qui nessun problema.

5) E' qui la tragedia!! Come faccio a dire a 'sta baracca di computer come sui riconosce un numero a 7 segmenti? Ho provato a spiegargli che se la somma dei colori di tutti i pixel di un segmento è maggiore di una cert soglia, vuol dire che quella zona è "chiara", e quindi il segmento è spento. Ma siccome la luminosità dell'immagine non è uniforme, alcuni segmenti accesi appaiono chiari e alcuni segmenti spenti appaiono scuri, e quindi il programma non sa che pesci pigliare!

Allora ho provato a comparare ogni segmento con le aree adiacenti: se l'area del segmento è piu' scura, allora il segmento è acceso. Ci sto ancora lavorando su, ma non mi pare che funzioni. Pero' forse è perche' l'immagine è troppo piccola, ho troppi pochi pixel da elaborare...

Pero' è frustrante, "a occhio" si vede subito se è un 8, un 2 o un 1, anche se l'immagine è sbiadita: perche' il computer è cosi' de coccio??? Ho anche provato TopOCR, FreeOCR e una gui di Tesseract, l'OCER free di Google, con risultati scandalosi. b)

Link to comment
Condividi su altri siti

1) non credo che serva

2) , 3), 4) NOn è quello che mi serve adesso, mi servirà semmai poi per generalizzare il programma. Intanto ho ruotato "a mano" l'immagine per avere i numeri dritti, e ho individuato le coordinate che identificano i 7 segmenti: fin qui nessun problema.

5) E' qui la tragedia!! Come faccio a dire a 'sta baracca di computer come sui riconosce un numero a 7 segmenti? Ho provato a spiegargli che se la somma dei colori di tutti i pixel di un segmento è maggiore di una cert soglia, vuol dire che quella zona è "chiara", e quindi il segmento è spento. Ma siccome la luminosità dell'immagine non è uniforme, alcuni segmenti accesi appaiono chiari e alcuni segmenti spenti appaiono scuri, e quindi il programma non sa che pesci pigliare!

Allora ho provato a comparare ogni segmento con le aree adiacenti: se l'area del segmento è piu' scura, allora il segmento è acceso. Ci sto ancora lavorando su, ma non mi pare che funzioni. Pero' forse è perche' l'immagine è troppo piccola, ho troppi pochi pixel da elaborare...

Pero' è frustrante, "a occhio" si vede subito se è un 8, un 2 o un 1, anche se l'immagine è sbiadita: perche' il computer è cosi' de coccio??? Ho anche provato TopOCR, FreeOCR e una gui di Tesseract, l'OCER free di Google, con risultati scandalosi. b)

se hai visto il mio programma in luminosità foto (mi sembra fosse lì), nell'immagine controllo che 7 linee poste sempre allo stesso punto (in certe x,y rispetto la foto, quindi nn generalizza il problema) sono riempite di nero o di bianco, ma prima di ciò avevo trasformato il pezzo di immagine in bianco ed in nero con 1 mia funzione che aseconda della tolleranza di rosso e verde settabile impostava il pixel a nero o bianco.. a seconda di quante e quali linee sono riempite di nero, sarà un numero od 1 altro...

il software ti serve per pc o per cell?

Link to comment
Condividi su altri siti

se hai visto il mio programma in luminosità foto (mi sembra fosse lì), nell'immagine controllo che 7 linee poste sempre allo stesso punto (in certe x,y rispetto la foto, quindi nn generalizza il problema) sono riempite di nero o di bianco, ma prima di ciò avevo trasformato il pezzo di immagine in bianco ed in nero con 1 mia funzione che aseconda della tolleranza di rosso e verde settabile impostava il pixel a nero o bianco.. a seconda di quante e quali linee sono riempite di nero, sarà un numero od 1 altro...

il software ti serve per pc o per cell?

non ho analizzato come funziona il tuo prog: funziona con queste immagini?

Il prog mi serve per il cell... ma anche se riuscite a tirar fuori qualcosa che funzioni sul PC va bene lo stesso, poi lo adatto io al cell...

Cmq secondo me i numeri in quelle immagini sono troppo piccoli. Allego un nuovo esempio di immagine con cui sto lavorando. Al momento non ho immagini con numeri diversi.

LCD20080706_162757.jpg

Link to comment
Condividi su altri siti

P.S.

Un prog per il PC l'ho gia' scritto, sta su GoogleCode:

http://code.google.com/p/nokdat/source/bro...at/nokdat-PC.py

Mi è venuta un'altra idea: invece di sommare i valori di RGB di ogni pixel e fare un confronto "globale" rispetto a una soglia, potrei confrontare TRA LORO i valori RGB: se sono SIA bassi CHE simili, ALLORA sono pixel neri, quindi bla bla bla...

Link to comment
Condividi su altri siti

Ecco come "vede" la stessa immagine un algoritmo basato solo sulla luminosità assoluta (in questo caso, quello incluso in pys60)...

Non va proprio.

Ma non va nemmeno il mio modo "relativo" b) Ne' a colori ne' in BN.

Secondo il mio algoritmo, se i 3 rettangoli (segmento e 2 vicini) hanno piu' o meno lo stesso livello di luminosità, allora il segmento è spento.

Ho differenziato i colori dei "vicini" di ogni segmento, cosi' si distinguono i segmenti dai "vicini"; sembrerebbe funzionare... ma il segmento in basso a destra del 7 sembrerebbe SPENTO, visto che i tre rettangoli sembrano avere uguale distribuzione di punti!!!

bn3.png

processed_color.JPG

processed_bn.JPG

Modificato da JumpJack_
Link to comment
Condividi su altri siti

Dovrei essere vicino alla soluzione! (vedi immagine, che disegna rettangoli "color valor medio" sopra segmenti e "vicini")

-Converto l'immagine in toni di grigio

-Per ogni segmento calcolo il valor medio della luminosità

-Faccio lo stesso per i "vicini"

=> Un segmento è spento se il suo valor medio è minore di quelli vicini (forse anche solo di uno).

C'e' solo il 7 che mi fa disperare.... b) Ma dove lo vede un segmento orizzontale nel mezzo?!?

edit:

il nuovo sorgente è online su google, release 10

output.jpg

Modificato da JumpJack_
Link to comment
Condividi su altri siti

jumpjack...ti parlo da completo ignorante in materia, però voglio soddisfare questa mia curiosità...allora..hai detto che l'aggeggio ha un display.

bene, iofaccio elettronica a scuola...e abbiamo simulato la scrittura su display..ebbene,il display che abbiamo usato aveva integrato un integrato..mmmh scusa il doppione, nel senso che aveva integrato un circuito integrato...quelli coi piedini.

ecco, ogni piedino significava una stanghetta di quelle che si illuminavano del display...

Quindi, non potresti "staccare" il display e ottenere le informazioni in base a quali fili vengono alimentati?

Ok...forse è ua stupidata...anche perchè mi sto rendendo conto che poi avresti i dati, ma non sapresti come memorizzarli...mmmmh... sorry se ti ho fatto perdere tempo:P

Link to comment
Condividi su altri siti

jumpjack...ti parlo da completo ignorante in materia, però voglio soddisfare questa mia curiosità...allora..hai detto che l'aggeggio ha un display.

bene, iofaccio elettronica a scuola...e abbiamo simulato la scrittura su display..ebbene,il display che abbiamo usato aveva integrato un integrato..mmmh scusa il doppione, nel senso che aveva integrato un circuito integrato...quelli coi piedini.

ecco, ogni piedino significava una stanghetta di quelle che si illuminavano del display...

Quindi, non potresti "staccare" il display e ottenere le informazioni in base a quali fili vengono alimentati?

Ok...forse è ua stupidata...anche perchè mi sto rendendo conto che poi avresti i dati, ma non sapresti come memorizzarli...mmmmh... sorry se ti ho fatto perdere tempo:P

anche questa è una strada su cui ho indagato, ma non sono riuscito ad ottenere abbastanza informazioni.

In teoria, secondo me sarebbe sufficiente prendere i segnali dai vari pin del display e mandarli a un PIC (un integrato programmabile) per decodificarli e memorizzarli.

Ma tra il dire e il fare c'e... nessuno che mi spiega come farlo! b)

Link to comment
Condividi su altri siti

anche questa è una strada su cui ho indagato, ma non sono riuscito ad ottenere abbastanza informazioni.

In teoria, secondo me sarebbe sufficiente prendere i segnali dai vari pin del display e mandarli a un PIC (un integrato programmabile) per decodificarli e memorizzarli.

Ma tra il dire e il fare c'e... nessuno che mi spiega come farlo! b)

Forse ti posso dare una mano. Anche io alle superiori ho fatto elettronica e per l'esame di maturità ho proprio scritto un programma in ASSEMBLER per il PIC. Dovresti solo vedere com'è pilotato quel benedetto display LCD di cui tu parli. Ha un integrato che fa da interfaccia?

Modificato da Simon88
Link to comment
Condividi su altri siti

Please sign in to comment

You will be able to leave a comment after signing in



Accedi Ora
 Share

×
×
  • Crea Nuovo...

Informazione Importante

Questo sito utilizza i cookie per analisi, contenuti personalizzati e pubblicità. Continuando la navigazione, accetti l'utilizzo dei cookie da parte nostra | Privacy Policy