2014-11-28 16 views
19

Byłem zaskoczony, gdy nie mogłem znaleźć niczego w dokumentacji OpenCV, opisując - słowami - to, co oznaczają różne typy, a Googling też nie pomógł. Wiem, że CV_8UC1 ma skalę szarości, ale co oznacza CV_8UC3? Czy to RGB? Lub YUV?Co CV_8UC3 i inne typy oznaczają w OpenCV?

Co dalej z innymi definicjami z types_c.h (brak też komentarzy). Czy istnieje wzorzec tego, czym jest konwencja nazewnictwa? Czy potrafię interpretować ich imiona na podstawie ich cech, takich jak kolory itp.?

#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)) 

Odpowiedz

34

Jak wskazano w the documentation

Każda pierwotnych z listy może być określona przez identyfikator w postać CV_<bit-depth>{U|S|F}C(<number_of_channels>)

gdzie U jest typu liczba całkowita bez znaku, S podpisany typ całkowity, a F to typ zmiennoprzecinkowy.

więc CV_8UC3 to ośmiobitowa liczba całkowita bez znaku/obraz z 3 kanałami. Chociaż najczęściej zdarza się, że oznacza to obraz RGB (lub faktycznie BGR), nie upoważnia go. Oznacza to po prostu, że istnieją trzy kanały, a sposób ich użycia zależy od Ciebie i Twojej aplikacji.

+0

"To nie upoważnia" - ale zakładam, że funkcje takie jak "cv :: imread" wypełnią je wartościami RGB? – sashoalm

+0

To zależy od flag przekazanych do 'imread'. Ale jeśli przekażemy 'CV_LOAD_IMAGE_COLOR', to wyjście powinno zawsze być BGR, które jest formatem kolorów zwykle używanym przez OpenCV. –

+2

Co mam na myśli w moim poście, to, że matryca/obraz ma typ 'CV_8UC3' nie musi oznaczać, że jest BGR. Równie dobrze może to być HSV, albo coś, co w ogóle nie jest informacją o kolorze. –

9

Schemat nazewnictwa przedstawia sposób rozmieszczenia danych w pamięci komputera i nie jest bezpośrednio związany z typem obrazu. W rzeczywistości układ danych i typ obrazu są odsprzęgnięte.

Prawdopodobnie odkryłeś znaczenie wzorca CV_XX (tj. układ danych).

Dla odwzorowana typu danych, jeśli zapytać OpenCV aby załadować obraz jako obraz kolorów, to załadować go jako BGR obrazu i rozłożyć swoje dane jako CV_8UC3. Kilka rzeczy, aby być świadomym:

  • tak, zamawianie domyślny kanał jest BGR i nie RGB. To jest starsza kolejność, ponieważ cyfrowe kanały wideo z kamer wydawały się podążać za tą kolejnością, kiedy OpenCV 1.xx był w fazie rozwoju; Można użyć funkcji konwersji typu z modułu imgproc, a mianowicie cv::cvtColor(). Wszystkie układy danych i typy obrazów nie są jednak kompatybilne, sprawdź numer doc;
  • kanał alfa jest zwykle ignorowany. Ignorując, mam na myśli to, że cv::imwrite() napisze na przykład obraz 3-kanałowy bez alfa. Większość funkcji przetwarzania będzie albo specyficzna dla obrazów jednokanałowych, albo zastosuje to samo przetwarzanie do wszystkich kanałów jednakowo;
  • Gdy funkcja przyjmuje maskę (alpha), zwykle jest to opcjonalny parametr typu CV_8UC1, który domyślnie jest pustą macierzą.
+0

Zakładam, że CV_8UC4 miałby kanał alfa? – sashoalm

+0

Tak, kanał alfa zostanie zapisany w czwartym kanale. Jestem całkiem pewien, że 'cv :: imwrite()' zignoruje ** to jednak i musi być sprawdzone dla 'cv :: imwrite()'. Inne funkcje będą zwykle działać tylko w przypadku obrazów jednokanałowych lub zastosują to samo przetwarzanie do wszystkich kanałów w równym stopniu. – sansuiso

+0

Ok, sprawdziłem, 'cv :: imread()' może albo załadować kanał alfa (opcja: 'as_is') albo go upuścić (opcja:' load_colour'). Przykład: http://docs.opencv.org/doc/tutorials/introduction/display_image/display_image.html – sansuiso

0

8UC3 pomaga uzyskać dostęp do danych RGB. I nie ogranicza się tylko do obrazów. Możesz go użyć do uzyskania dostępu do danych RGB w chmurach punktów. Jeśli przekazujesz wartość RGB jako macierz typu 8UC3, możesz pokazać tę wartość jako kolor w module Viz i wyświetlić Pointcloud RGB.

Powiązane problemy