2010-06-17 42 views
5

Sto provando a rilevare oggetti bianchi in un video. Il primo passaggio consiste nel filtrare l'immagine in modo che lasci solo i pixel di colore bianco. Il mio primo approccio è stato utilizzare lo spazio colore HSV e quindi verificare l'alto livello del canale VAL. Ecco il codice:Qual è il modo migliore per rilevare il colore bianco?

//convert image to hsv 
cvCvtColor(src, hsv, CV_BGR2HSV); 
cvCvtPixToPlane(hsv, h_plane, s_plane, v_plane, 0); 

for(int x=0;x<srcSize.width;x++){ 
    for(int y=0;y<srcSize.height;y++){ 
    uchar * hue=&((uchar*) (h_plane->imageData+h_plane->widthStep*y))[x]; 
    uchar * sat=&((uchar*) (s_plane->imageData+s_plane->widthStep*y))[x]; 
    uchar * val=&((uchar*) (v_plane->imageData+v_plane->widthStep*y))[x]; 

    if((*val>170)) 
     *hue=255; 
    else 
     *hue=0; 
    } 
} 

lasciando il risultato nel canale di tonalità. Sfortunatamente, questo approccio è molto sensibile all'illuminazione. Sono sicuro che c'è un modo migliore. Eventuali suggerimenti?

risposta

2

Sarà sensibile all'illuminazione - cosa succede se lo guardi sotto una luce rossa!
Non so se l'uso dello spazio YUV sia molto più semplice che cercare valori RGB simili.

modifica - normalmente si chiamerebbe qualcosa senza colore grigio (potrebbe essere utile per le ricerche).
Se si ha una scelta, questo è il peggior colore da cercare perché rifletterà qualsiasi altra illuminazione nella scena. Quindi dovrai rilevare il colore generale dell'illuminazione e regolarlo per quello.

Quindi quello che stai cercando sono pixel con valori RGB simlar, o valori RGB nel rapporto della media per gli oggetti nella scena.

+0

Intendo bianco = grigio = senza colore, in realtà sto cercando di rilevare gli occhiali di plastica bianca. Ecco un'immagine di esempio: http://tinypic.com/r/14t1p1x/6 – dnul

+0

Non sono sicuro, stai dicendo che se metto una luce rossa sopra, il colore degli occhiali diventerebbe in qualche modo rossastro e invece di cercare i pixel bianchi dovrei cercare pixel simili, non importa il colore? – dnul

+3

se hai degli oggetti bianchi in una scena e li accendi con una luce rossa diventeranno rossi! In questo caso dovrai trovare il colore di un oggetto "bianco" e cercare quel colore –

2

Perché stai utilizzando HSV? Avrebbe più senso convertire in HSL e usare il canale di luminanza. Ovviamente non otterrai solo il bianco, ma tutti i colori ad alta luminanza oltre una soglia. Dopo tutto, non puoi fare affidamento sul bianco puro a meno che l'immagine sorgente non sia stata sovraesposta.

2

Un altro modo sarebbe trasformare la tua immagine in scala di grigi. Il bianco avrà valori molto alti (quasi> 225).

Un altro modo sarebbe quello di AND gli aerei R, G e B. Solo i bianchi resteranno nell'immagine risultante. In questo modo, non stai spendendo tempo a calcolare la conversione nello spazio colore HSV. Stai semplicemente facendo un'operazione AND su ogni pixel.

Problemi correlati