continuità valori - visione artificiale [risolto]

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Avatar utente
submax82
Staff
Staff
Messaggi: 3202
Iscritto il: mer 31 ago 2005, 0:00
Desktop: xfce
Distribuzione: SalixOS
Contatta:

continuità valori - visione artificiale [risolto]

Messaggio da submax82 »

sto facendo la tesi sul riconoscimento dei movimenti del capo utilizzando un webcam, il progetto è in java e utilizza swing per la GUI, sarebbe tutto o quasi finito ma ho un problema che non riesco a risolvere in modo soddisfacente. Ora vi spiego meglio, il sistema rileva la regione della testa di cui calcola il baricentro e l'angolo di rotazione degli assi rispetto alla verticale, secondo la formula:

Immagine
Immagine
Immagine

il problema è che la regione della testa non è sempre perfettamente uguale per ogni frame del video, quindi i valori che escono dalla formula non hanno continuità e questo è un problema in quanto devo determinare l'inclinazione della testa

fonti http://vision.unipv.it/corsi/VisioneArt ... mn/lucidi/ in particolare "Analisi di regioni"

non sò se mi sono spiegato bene, ma per sto problema sto impazzendo! :evil: :roll: #-o

odiusseus
Linux 2.x
Linux 2.x
Messaggi: 352
Iscritto il: sab 30 giu 2007, 14:09
Slackware: 13.0
Kernel: 2.6.32.2
Desktop: kde
Località: roma/vibo valentia
Contatta:

Re: continuità valori - visione artificiale

Messaggio da odiusseus »

Ciao mi sto occumando anche io di questo tipo di problema..in modo diverso ma è simile. Per risolvere potresti (ammesso che io abbia capito bene il tuo problema) inserire un ritardo. Cioè la webcam cattura l'immagine e la processa. Fatto questo passa alltro frame.Questo perchè tu hai un ritardo nel captare l'immagine e quindi la regione interessata si sposta di un tot dal reticolo xyz (o in coordinate sferiche) che tu imponi. Una alternativa sarebbe quella di non far captare l'immagine della testa intera ma solo quella di hotspot luminoso (es. IR) che risulta più facile e preciso.

Avatar utente
RedSkull92
Linux 3.x
Linux 3.x
Messaggi: 567
Iscritto il: mar 21 apr 2009, 17:25
Slackware: 64bit -current
Kernel: 3.5.4
Desktop: FluxBox
Località: Palermo
Contatta:

Re: continuità valori - visione artificiale

Messaggio da RedSkull92 »

blacklight ha fatto un programmino in c che permette di muovere il mouse con la testa, spero ti sia d'aiuto.
http://www.infernet.ws/showthread.php?t ... light=head

Avatar utente
submax82
Staff
Staff
Messaggi: 3202
Iscritto il: mer 31 ago 2005, 0:00
Desktop: xfce
Distribuzione: SalixOS
Contatta:

Re: continuità valori - visione artificiale

Messaggio da submax82 »

odiusseus ha scritto:Ciao mi sto occumando anche io di questo tipo di problema..in modo diverso ma è simile. Per risolvere potresti (ammesso che io abbia capito bene il tuo problema) inserire un ritardo. Cioè la webcam cattura l'immagine e la processa. Fatto questo passa alltro frame.Questo perchè tu hai un ritardo nel captare l'immagine e quindi la regione interessata si sposta di un tot dal reticolo xyz (o in coordinate sferiche) che tu imponi. Una alternativa sarebbe quella di non far captare l'immagine della testa intera ma solo quella di hotspot luminoso (es. IR) che risulta più facile e preciso.
forse non hai capito bene, almeno credo, il problema è che le regioni vengono "estratte" dal resto cercando le zone con il colore della pelle (con i colori dei pixel in HSB viene comodo); poi viene estratta la regione con area maggiore (che è la testa); e di questa regione viene calcolato il baricentro e l'inclinazione degli assi rispetto alla verticale. Il problema è che la regione che identifica la testa non ha una forma costante ma può variare da frame a frame (a causa principalmente della luminosità non costante per tutto lo spazio dell'inquadratura), quindi l'inclinazione calcolata per questa regione ad ogni frame è spesso non "congruente" all'inclinazione della regione che identificava la testa nel frame precedente. Per questo ho bisogno di un sistema che dia "continuità" ai valori, per avere le inclinazioni di ogni frame "congruenti" con le inclinazioni calcolate nei frame precedenti e sucessivi. E' complicato da spiegare... spero di essermi fatto capire questa volta [-o<

grazie a tutti!
RedSkull92 ha scritto:blacklight ha fatto un programmino in c che permette di muovere il mouse con la testa, spero ti sia d'aiuto.
http://www.infernet.ws/showthread.php?t ... light=head
usa opencv e non sò se in opencv siano implementate il riconoscimento delle componenti connesse (o regioni), se si sarebbe interessante vedere se risolvono il problema sopra in qualche modo ma non credo perchè sono un supporto, non credo risolvino problemi di "collegamento logico" tra i concetti come nel mio caso. :-k

Avatar utente
absinthe
Iper Master
Iper Master
Messaggi: 2354
Iscritto il: dom 15 mag 2005, 0:00
Nome Cognome: Matteo Nunziati
Slackware: 12.1 - defunct
Kernel: 2.6.32-5-amd64
Desktop: gnome
Distribuzione: debian squeeze
Località: Prato
Contatta:

Re: continuità valori - visione artificiale

Messaggio da absinthe »

non capisco molto bene cosa tu intenda per congruenti. tuttavia il primo trucco banale che viene in mente con la visione artificiale e con i balzi di luminosità (se solo di questo i tratta) è utilizzare un filtro passa basso a un polo (filtro FIR se ricordo bene) che introduce un lieve ritardo ma consente di limare gli outlayers. per info: http://en.wikipedia.org/wiki/Low_pass_f ... ementation
se invece il problema non è legato solo alla luminosità ma al posizionamento della testa allora la cosa è un pò più complessa.

la soluzione che ti ho esposta la utilizziamo comunemente in sistemi di visione artificiale che lavorano in real-time. valori caratteristici per alpha (in riferimento al link) sono nell'ordine di 0.15-0.25. più è alto alpha minore è la "levigazione" ma più alta la reattività del sistema.

M

Avatar utente
submax82
Staff
Staff
Messaggi: 3202
Iscritto il: mer 31 ago 2005, 0:00
Desktop: xfce
Distribuzione: SalixOS
Contatta:

Re: continuità valori - visione artificiale

Messaggio da submax82 »

per "congruenti" intendo che se la forma della regione della testa cambia al trascorrere dei frame, cambiano anche gli assi e quindi l'angolo non è più confrontabile con l'angolo del frame precedente e di conseguenza non si riesce a "tracciare" bene e in modo continuo il movimento della testa.
Il ritardo è un fattore importante nella mia applicazione perchè rileva il colpo di sonno, comunque vaglierò bene anche la tua proposta per la luminosità che è molto interessante.

Avatar utente
submax82
Staff
Staff
Messaggi: 3202
Iscritto il: mer 31 ago 2005, 0:00
Desktop: xfce
Distribuzione: SalixOS
Contatta:

Re: continuità valori - visione artificiale

Messaggio da submax82 »

visto che sto per impazzire :shock: vi posto anche degli esempi grafici...

Avatar utente
submax82
Staff
Staff
Messaggi: 3202
Iscritto il: mer 31 ago 2005, 0:00
Desktop: xfce
Distribuzione: SalixOS
Contatta:

Re: continuità valori - visione artificiale

Messaggio da submax82 »

esempi

Immagine

sotto ogni frame c'è il valore dell'angolo dato dalla formula sopra, mentre la zona rossa è la regione della testa.

se avete qualche idea, io ci sto impazzendo :badgrin:

Avatar utente
submax82
Staff
Staff
Messaggi: 3202
Iscritto il: mer 31 ago 2005, 0:00
Desktop: xfce
Distribuzione: SalixOS
Contatta:

Re: continuità valori - visione artificiale

Messaggio da submax82 »

forse da questi esempi non si capisce il problema... :roll: :oops:

Avatar utente
absinthe
Iper Master
Iper Master
Messaggi: 2354
Iscritto il: dom 15 mag 2005, 0:00
Nome Cognome: Matteo Nunziati
Slackware: 12.1 - defunct
Kernel: 2.6.32-5-amd64
Desktop: gnome
Distribuzione: debian squeeze
Località: Prato
Contatta:

Re: continuità valori - visione artificiale

Messaggio da absinthe »

usando i tuoi valori e considerando il primo frame come l'istante 0
y(0) = x(0) = -4
y(1) = y(0) + alpha * (x(1) -y(0)) = -4 + alpha * (3 + 4) = -4 + alpha * 7

usando alpha = 0.15
y(1) = -2 + 0.15 * 7 = -2.95
y(2)= -2.95 -5.86 = -8.81
y(3)= -12.29
y(4) = -12.40

non so quali siano i valori esatti ma questo è l'effetto. da quello che vedo però i problemi principali li hai quando sono evidenziate delle zone di colore diverso (più scuro). la domanda è: perchè esistono almeno tre livelli di colore?! nero, rosso chiaro e rosso scuro?! non potresti fare una classificazione binaria (se lo sfondo è più o meno lo stesso usa l'algoritmo di otsu delle opencv).
se invece avere sfumature di colore è utile calcola i parametri come in un'immagine in scala di grigi applicando l'intensità luminosa come pesatura dei pixel (non ho capito se già lo fai)
mai provato un dilate + erode con kernel 3x3?! tentar non nuoce :-)

ciao,
M

Avatar utente
submax82
Staff
Staff
Messaggi: 3202
Iscritto il: mer 31 ago 2005, 0:00
Desktop: xfce
Distribuzione: SalixOS
Contatta:

Re: continuità valori - visione artificiale

Messaggio da submax82 »

esistono gli 3 colori perchè il rosso vivo è la regione della testa, i rosso più scuro sono altre regioni che becca (perchè del colore della pelle) ma hanno un'area più piccola, mentre il nero è tutto lo sfondo, poi l'immagine del frame viene binarizzata all'interno.

non uso c/c++ e opencv ma java e jmf

Avatar utente
absinthe
Iper Master
Iper Master
Messaggi: 2354
Iscritto il: dom 15 mag 2005, 0:00
Nome Cognome: Matteo Nunziati
Slackware: 12.1 - defunct
Kernel: 2.6.32-5-amd64
Desktop: gnome
Distribuzione: debian squeeze
Località: Prato
Contatta:

Re: continuità valori - visione artificiale

Messaggio da absinthe »

mmm... ho riletto meglio come viene computata la posizione della testa. se ho capito bene ti interessa l'angolo rispetto alla verticale quindi a occhio l'unico valore realmente sbagliato è quel 3 anzichè -3 giusto?! gli altri sono magari imprecisi.
se è così, in realtà non è un problema di "rumore" (ovvero ballonzolio della luminosità) in senso stretto. pare ci sia qualche baco nella logica di calcolo.

hai mai provato innanzi tutto a prototipizzare con un linguaggio di alto livello (octave) per fare dei plot e vedere che ne tira fuori?! detto questo ragiono ad alta voce per vedere se riesco a capire meglio la cosa:

0- ipotizzo che l'immagine sia binaria (no grayscale)
1- immagino che r e c nelle formule siano le coordinate del baricentro
2- quelli che calcoli sono i momenti dell'immagine noti anche come varianza (mu_cc, mu_rr) del/dei blob(s) che stai analizzando e covarianza (mu_cr).
3- la proprietà di questi valori è che mu_cc e mu_rr sono sempre positivi per definisione. mu_cr può essere positivo o negativo e seconda dell'orientazione della testa.
4- tenuto conto che per questo subset di immagini la testa è sempre inclinata in alto a sinistra (3zo quadrante) mu_cr ha sempre lo stesso segno, quindi:

a) controlla che mu_rr e mu_cc siano sempre positivi se no c'è un errore
b) controlla che mu_cr abbia sempre lo stesso segno se no c'è un errore. non vorrei dire una fesseria però mu_cr dovrebbe essere sempre positivo essendo la testa ruotata in senso anti orario.
c) se i punti a) e b) sono ok, significa innanzi tutto che c'è un problema anomalo di inversione di segno al denominatore della formula della tangente. questo non dovrebbe verificarsi perchè la testa è oblunga e fintanto che non si raggiungono all'incirca i 45 gradi m_rr dovrebbe essere minore di mu_cc (ammesso che rr sia orizzontale e cc verticale). questo perchè l'ellissoide che "circoscrive" la testa ha l'asse maggiore sempre rivolto nella direzione di inclinazione della testa.

detto questo tu non stai usando librerie di visione o matematiche ma solo acquisizione se ho capito bene il manuale jmf. il tuo problema in realtà si risolve in maniera più ortodossa con la PCA, individuando l'autovettore maggiore della testa e calcolandone l'angolo con la verticale.


ciao,
M

Avatar utente
submax82
Staff
Staff
Messaggi: 3202
Iscritto il: mer 31 ago 2005, 0:00
Desktop: xfce
Distribuzione: SalixOS
Contatta:

Re: continuità valori - visione artificiale

Messaggio da submax82 »

hai ragione e hai capito tutto :thumbright:

controllato: mu_cc e mu_rr con sempre >0 come da definizione, quindi ok. mu_rc alcune volte è > 0 altre < 0 il problema è che questo avviene con la testa sempre inclinata in avanti, ma questo, forse, *potrebbe* anche essere corretto ti spiego: se la forma della regione cambia (a causa della luce non uniforme) potrebbe risultare allungata all'indietro anche se la testa in realtà è inclinata in avanti

come al solito mi spiego un pò male... speriamo di riuscire a risolvere sto problema :-k [-o<

p.s. corretto anche primo post, così capite meglio ;)

Avatar utente
absinthe
Iper Master
Iper Master
Messaggi: 2354
Iscritto il: dom 15 mag 2005, 0:00
Nome Cognome: Matteo Nunziati
Slackware: 12.1 - defunct
Kernel: 2.6.32-5-amd64
Desktop: gnome
Distribuzione: debian squeeze
Località: Prato
Contatta:

Re: continuità valori - visione artificiale

Messaggio da absinthe »

sì ho capito. il fatto è che tu scarti le zone rosso scuro se ho ben capito... giusto?! se è così in effetti l'ellisse che descrive il cranio può cambiare inclinazione ed assumerne una non congruente con quella della testa inquadrata...

a sto punto ti ci vorrenne come minimo un sistema di clusterizzazione.

spiego meglio: se tu scarti le zone piccole (ipotesi mia) va a finire che a volte ti mangi aree rilevanti e modifichi la forma del cranio in maniera sensibile.

ti butto là delle idee venute d'istinto:

soluzione A
========
0- individui le zone rosse come già fai
1- usi una libreria di elaborazione grafica e fai un dilate + erode con kernel 3x3. questo modifica leggermente la forma della testa ma dovrebbe riempire alcuni buchi tra i pezzi di pelle rendendo connesse molte più zone della testa.

soluzione B
========
0- se l'immagine non è già grayscale riconducila e realizza un k-mean. putroppo il numero di cluster deve essere deciso per esperienza (a occhio ;-)
1- utilizza un cluster di riferimento e seleziona tutto il cluster non solo un colore

soluzione C
========
0- immagino che il colore della pelle sia comunque definito da due soglie e non come valore secco...
1- rendi più elevata la tolleranza delle soglie

soluzione D
========
0- seleziona le zone rosse chiare e scure come fai ora
1- usa un clustering statistico. questo funziona solo se la testa copre un'area predominante dell'immagine
2- calcola le PCA e prendi tutto ciò che sta in un intorno di semiassi delta_1 e delta_2 rispetto al baricentro
(questa mossa è un pò complessa da spiegare....)


ciao,
M

Avatar utente
submax82
Staff
Staff
Messaggi: 3202
Iscritto il: mer 31 ago 2005, 0:00
Desktop: xfce
Distribuzione: SalixOS
Contatta:

Re: continuità valori - visione artificiale

Messaggio da submax82 »

sto provando con la soluzione A e in effetti i valori sono leggermente cambiati ma l'angolo ha sempre lo stesso problema! :evil: :evil: :evil:

tra poco vi posto un esempio chiaramente errato [-(

Rispondi