2014-11-28 21 views
19

Sono rimasto sorpreso quando non sono riuscito a trovare nulla nella documentazione di OpenCV che descrivesse - con le parole - quali fossero i vari tipi e Googling non è stato di grande aiuto. So che CV_8UC1 è in scala di grigi, ma cosa significa CV_8UC3? È RGB? O YUV?Cosa vuol dire CV_8UC3 e gli altri tipi in OpenCV?

Inoltre, che dire delle altre definizioni da types_c.h (mancano anche commenti). Esiste un modello per ciò che è la convenzione di denominazione? Posso interpretare dai loro nomi a quali sono le loro caratteristiche, come i colori, ecc.?

#define CV_8UC1 CV_MAKETYPE(CV_8U,1) 
#define CV_8UC2 CV_MAKETYPE(CV_8U,2) 
#define CV_8UC3 CV_MAKETYPE(CV_8U,3) 
#define CV_8UC4 CV_MAKETYPE(CV_8U,4) 
#define CV_8UC(n) CV_MAKETYPE(CV_8U,(n)) 

#define CV_8SC1 CV_MAKETYPE(CV_8S,1) 
#define CV_8SC2 CV_MAKETYPE(CV_8S,2) 
#define CV_8SC3 CV_MAKETYPE(CV_8S,3) 
#define CV_8SC4 CV_MAKETYPE(CV_8S,4) 
#define CV_8SC(n) CV_MAKETYPE(CV_8S,(n)) 

#define CV_16UC1 CV_MAKETYPE(CV_16U,1) 
#define CV_16UC2 CV_MAKETYPE(CV_16U,2) 
#define CV_16UC3 CV_MAKETYPE(CV_16U,3) 
#define CV_16UC4 CV_MAKETYPE(CV_16U,4) 
#define CV_16UC(n) CV_MAKETYPE(CV_16U,(n)) 

#define CV_16SC1 CV_MAKETYPE(CV_16S,1) 
#define CV_16SC2 CV_MAKETYPE(CV_16S,2) 
#define CV_16SC3 CV_MAKETYPE(CV_16S,3) 
#define CV_16SC4 CV_MAKETYPE(CV_16S,4) 
#define CV_16SC(n) CV_MAKETYPE(CV_16S,(n)) 

#define CV_32SC1 CV_MAKETYPE(CV_32S,1) 
#define CV_32SC2 CV_MAKETYPE(CV_32S,2) 
#define CV_32SC3 CV_MAKETYPE(CV_32S,3) 
#define CV_32SC4 CV_MAKETYPE(CV_32S,4) 
#define CV_32SC(n) CV_MAKETYPE(CV_32S,(n)) 

#define CV_32FC1 CV_MAKETYPE(CV_32F,1) 
#define CV_32FC2 CV_MAKETYPE(CV_32F,2) 
#define CV_32FC3 CV_MAKETYPE(CV_32F,3) 
#define CV_32FC4 CV_MAKETYPE(CV_32F,4) 
#define CV_32FC(n) CV_MAKETYPE(CV_32F,(n)) 

#define CV_64FC1 CV_MAKETYPE(CV_64F,1) 
#define CV_64FC2 CV_MAKETYPE(CV_64F,2) 
#define CV_64FC3 CV_MAKETYPE(CV_64F,3) 
#define CV_64FC4 CV_MAKETYPE(CV_64F,4) 
#define CV_64FC(n) CV_MAKETYPE(CV_64F,(n)) 

risposta

34

Come notato in the documentation

Qualsiasi tipo primitivo dall'elenco può essere definito da un identificatore in forma CV_<bit-depth>{U|S|F}C(<number_of_channels>)

dove U è di tipo intero senza segno, S è firmato tipo intero e F è il tipo float.

quindi CV_8UC3 è una matrice/immagine intera senza segno a 8 bit con 3 canali. Sebbene sia più comune che ciò significhi un'immagine RGB (o effettivamente BGR), non lo impone. Significa semplicemente che ci sono tre canali, e il modo in cui li usi dipende da te e dalla tua applicazione.

+0

"non lo richiede" - ma presumo che funzioni come 'cv :: imread' le riempiranno di valori RGB? – sashoalm

+0

Dipende dai flag passati a 'imread'. Ma se si passa 'CV_LOAD_IMAGE_COLOR', l'output dovrebbe essere sempre BGR, che di solito è il formato di colore OpenCV. –

+2

Quello che intendevo nel mio post era che solo perché una matrice/immagine ha il tipo 'CV_8UC3' non significa necessariamente che sia BGR. Potrebbe anche essere HSV o qualcosa che non è affatto una informazione a colori. –

9

Il modello di denominazione mostra come i dati sono effettivamente disposti nella memoria del PC e non è direttamente correlato al tipo di immagine. In realtà, il layout dei dati e il tipo di immagine sono disaccoppiati.

Probabilmente avete trovato il significato per il modello CV_XX (ad esempio, layout dati).

Per il tipo di dati immaginato, se chiedete OpenCV di caricare un'immagine come immagine di colore, caricherà come immagine di BGR e lay out i suoi dati come CV_8UC3. Un paio di cose da tenere presente:

  • sì, l'ordinamento canale predefinito è BGR e non RGB. Si tratta di un ordine precedente poiché i feed video digitali delle webcam sembravano seguire questo ordine quando OpenCV 1.xx era in fase di sviluppo;
  • è possibile utilizzare le funzioni di conversione del tipo dal modulo imgproc, ovvero cv::cvtColor(). Tutti i layout di dati e i tipi di immagine non sono compatibili, controllare lo doc;
  • il canale alfa viene generalmente ignorato. Ignorando, intendo che cv::imwrite() scriverà un'immagine a 3 canali senza alpha, ad esempio. La maggior parte delle funzioni di elaborazione sarà specifica per le immagini a canale singolo o applicherà la stessa elaborazione a tutti i canali allo stesso modo;
  • quando una funzione accetta una maschera (alfa), di solito è un parametro facoltativo di tipo CV_8UC1 che per impostazione predefinita è una matrice vuota.
+0

Suppongo che CV_8UC4 abbia il canale alfa? – sashoalm

+0

Sì, il canale alfa verrà memorizzato nel 4 ° canale. Sono abbastanza sicuro che 'cv :: imwrite()' lo ignorerà **, però, e deve essere controllato per 'cv :: imwrite()'. Altre funzioni solitamente funzionano solo con immagini a canale singolo o applicheranno la stessa elaborazione a tutti i canali allo stesso modo. – sansuiso

+0

Ok, ho controllato, 'cv :: imread()' può caricare il canale alfa (opzione: 'as_is') o rilasciarlo (opzione:' load_colour'). Esempio qui: http://docs.opencv.org/doc/tutorials/introduction/display_image/display_image.html – sansuiso

0

8UC3 consente di accedere ai dati RGB. E non è limitato alle sole immagini. Puoi usarlo per accedere ai dati RGB anche in Point Clouds. Se si passa il valore RGB come una matrice di tipo 8UC3, è possibile quindi mostrare questo valore come colore nel modulo viz e visualizzare un Pointcloud RGB.