Oppure

Loading
07/01/10 17:50
ilmettiu
Salve a tutti, oggi ho un problema per il quale non ho un minimo di idee: devo in pratica analizzare i dati derivanti da una webcam modificata per rilevare l'infrarosso in modo da prendere in considerazione la posizione dei punti più luminosi, per capirci quelli in cui ho posizionato dei led infrarossi.

Qualcuno ha un'idea su come farlo? Quale sia il linguaggio migliore, magari? L'idea è quella di basarci un gioco, tipo Wii, ma naturalmente senza la tecnologia fondamentale è inutile iniziare a scriverlo.

Pensavo di usare Darkbasic, ma non so neanche cosa cercare su Google per risolvere il problema soprastante.

. . . Consigli? ;)
aaa
07/01/10 18:11
Se devi fare pesanti analisi di dati (come mi sembra che sia) è indicato il C/C++
07/01/10 18:15
ilmettiu
Mhm. . . E sai se esistono funzioni specifiche per l'analisi video? Non parlo di modifiche ad un file multimediale, ma di analizzarlo per trovare i picchi di intensità luminosa.
aaa
07/01/10 18:16
Non esistono funzioni standard.

Probabilmente esistono librerie (free e/o a pagamento) ma dovrai fare qualche ricerca.
07/01/10 18:31
ilmettiu
Mhm. . . Ok, ti ringrazio. Prima di cercare librerie astruse, però, penso che tenterò l'analisi di frame per frame. Alla prossima ;)
aaa
07/01/10 21:05
TheKaneB
un piccolo hint: per trovare i picchi di luminosità in un'immagine devi prima convertire da RGB a YCbCr.

Il canale Y (luma) contiene le informazioni sulla luminosità, quindi è questo il canale che devi analizzare.

le formule sono le seguenti (supponiamo di avere 8 bit per canale):
Y =        0.299    * r + 0.587    * g + 0.114    * b;
Cb = 128 - 0.168736 * r - 0.331264 * g + 0.5      * b;
Cr = 128 + 0.5      * r - 0.418688 * g - 0.081312 * b;


Una volta trovato il canale Y, per trovare i picchi dovrai in sostanza generare una maschera dei gradienti:
Un gradiente è un vettore che esprime sostanzialmente la pendenza di una superficie, la punta di questo vettore ci indica la direzione della "cima".
Puoi trovare i gradienti calcolando separatamente la variazione di Y tra un pixel e quello adiacente, sia lungo l'asse delle ascisse (dY / dx) che quello delle ordinate (dY / dy), e unendo questi due valori per formare un vettore per ogni pixel.
I pixel che hanno gradiente nullo (la lunghezza di questo vettore comunque inferiore ad una certa soglia minima) costituiscono dei punti senza pendenza.
Tra questi punti si celano, tra l'altro, anche i massimi. Per trovare i massimi, ripeti l'applicazione della maschera dei gradienti due volte, la seconda maschera ti fornirà i gradienti di secondo ordine. I punti con gradiente di secondo ordine negativo AND gradiente di primo ordine nullo sono i punti di massimo che cerchi...

Se ci sono dubbi, leggi qualche testo di image processing o fai qualche domanda più specifica ;)
aaa
08/01/10 14:43
ilmettiu
Mi pare abbastanza chiaro, tranne l'ultima parte: che differenze ci sono tra la prima maschera e la seconda? Per quale motivo cioè dovrebbero darmi risultati differenti? Intuisco di dover applicare la seconda sul risultato della prima, ma non comprendo bene cosa questo voglia dire in pratica :-)

Inoltre, ho qualche dubbio su come comportarmi con i vettori ottenuti. Mi spiego: so cos'è un vettore in senso geometrico e so cos'è un vettore in senso informatico. Ora, per rappresentare i vettori di cui stiamo parlando (segmenti orientati verso l'aumento di luminosità, se non ho capito male), devo utilizzare in qualche modo un vettore inteso come array? Giusto perchè l'omonimia mi suggerisce un qualche tipo di relazione :yup:
aaa
08/01/10 17:05
TheKaneB
in pratica dovrai creare una matrice di vettori, un elemento per ogni pixel dell'immagine (escludendo, al più, il bordo). Il secondo passaggio sulla maschera dei gradienti dovrà essere calcolato "componente per componente", cioè la componente dx del secondo gradiente sarà dato dalla differenza dei componenti dx lungo l'asse orizzontale della prima maschera, la componente dy della seconda maschera sarà data dalla differenza di dy dei pixel adiacenti in senso verticale nella prima maschera.

In termini matematici:
considera la mappa del canale luma (Y) come una carta geografica, dove x,y sono le coordinate e Y (luma) rappresenta l'altitudine. La prima mappa dei gradienti contiene tanti vettori quanti sono i pixel, ciascuno di questi vettori risulta perpendicolare al "terreno" e di lunghezza proporzionale alla pendenza. Ne consegue che i vettori nulli saranno quelli con pendenza nulla, il chè accade nelle valli e nei picchi. Per distinguere le valli di picchi ripetiamo la maschera dei gradienti, calcolata sulla prima maschera nel modo che ho descritto prima.
La seconda maschera conterrà dei vettori che esprimono "quanto velocemente cambia la pendenza" in un dato punto. I picchi sono i punti in cui abbiamo contemporaneamente un valore minimo di pendenza (possiamo approssimare un picco come una superficie orizzontale molto piccola, quindi con pendenza nulla), e un valore negativo di "variazione di pendenza" (perchè partendo dalla fiancata del picco, la pendenza diminuisce, tocca zero e poi diventa negativa, quindi varia costantemente in modo negativo). Le valli invece hanno un valore positivo di "variazione di pendenza" perchè la pendenza passa da negativa a zero, quando dal picco scendiamo alla valle, e da zero continua a salire e diventa positiva, quando dalla valle saliamo su un'altro picco.

Scusa se sembra poco chiaro, ma per darti una spiegazione comprensibile senza ricorrere ad equazioni alle derivate parziali è un po' un'impresa!
aaa