- 前言
- 前置知識
- PixelFormat
- Bpp
- 編碼規則
- 原始碼
- 分析
- 分類標準
- 補充
- ARV_PIXEL_FORMAT_BIT_PER_PIXEL
- 參考文章
前言
在學習Aravis官方例程的時候,有這麼一個函式:arv_camera_get_pixel_format
,它的返回型別是ArvPixelFormat
(本質是個32位無符號整數)。這意味著對於每個影像資料格式,都有自己對應的唯一的編碼。我比較好奇Aravis是透過什麼規則對各種影像資料格式進行的編碼,於是就檢視了原始碼。
本文主要討論Aravis中對不同影像資料格式的編碼規則。
前置知識
PixelFormat
PixelFormat指的是影像中每個畫素的資料格式,它定義了影像中畫素的組成方式、顏色資訊的儲存方法和每個畫素所佔的位數等。這一格式對於影像的處理和顯示是非常關鍵的,因為它直接影響到影像的質量和處理的效率。
常見的PixelFormat有:Mono8,BayerGB8,BayerGB10等。
Bpp
在工業相機中,Bpp
通常指的是"bits per pixel",它描述了儲存每個畫素所需的位數。這個值決定了影像的顏色深度以及可能包含的資訊量。例如:
- Bpp8: 每個畫素使用8位表示,常用於灰度影像,可以顯示256種灰度級別。
- Bpp16: 每個畫素使用16位,可以是更深的灰度圖,或者是用於儲存彩色影像的顏色分量之一(如在某些彩色格式中,紅色、綠色和藍色每個分量可能各佔16位)。
- Bpp24 或 Bpp32: 這通常用於彩色影像,其中每個顏色分量(紅、綠、藍)各佔8位,32點陣圖像格式可能會包含一個額外的8位用於透明度(alpha通道)。
在工業成像應用中,Bpp的選擇對於影像質量和處理效率非常重要,因為它直接影響影像的細節和色彩表達。高Bpp值允許影像包含更多的顏色和亮度級別,從而提供更精確的視覺資料,但也意味著更大的資料大小和處理需求。
編碼規則
原始碼
畫素格式指定了影像中每個畫素應該如何表示,包括每個畫素的元件數量和每個元件的位數等。在Aravis中透過編碼可以清晰的表示影像資料的顏色和位深資訊,部分定義如下:
//file: arvenums.h
/* Grey pixel formats */
#define ARV_PIXEL_FORMAT_MONO_8 ((ArvPixelFormat) 0x01080001u)
#define ARV_PIXEL_FORMAT_BAYER_GR_8 ((ArvPixelFormat) 0x01080008u)
/* Color pixel formats */
#define ARV_PIXEL_FORMAT_RGB_8_PACKED ((ArvPixelFormat) 0x02180014u)
/* Custom */
#define ARV_PIXEL_FORMAT_CUSTOM_BAYER_GR_12_PACKED ((ArvPixelFormat) 0x810c0001u)
分析
對於每個PixelFormat,都有唯一一個32位的無符號整數與之對應。
以Mono8為例,其對應的32位無符號整數為:0x01080001
,我們從高位向低位看:
0x01
:對畫素格式的一個分類,Aravis中共分為三類,對應的編號為0x01
,0x02
和0x08
。具體的分類準則在後面討論;0x08
:表示當前PixelFormat對應的Bpp,0x08
就對應Bpp8;0x0001
:為畫素格式設定的序號。
分類標準
之前本來還想自己推斷一下Aravis中對PixelFormat的分類依據,後來我查資料時看到了GenICam Pixel Format Names and Values,這應該是相當於EMVA規定的一個準則吧。對比原始碼可以發現,Aravis中0x01
和0x02
開頭的PixelFormat對應的值就是遵循的這個檔案的內容。
0x01
和0x02
的差別估計就是一個畫素點對應的通道數量不同,0x01
表示一個畫素點上只有一個通道,0x02
表示一個畫素點上的通道數大於1。至於0x08
,應該是Aravis自己定義的一些格式,具體的作用目前不太清楚。
補充
ARV_PIXEL_FORMAT_BIT_PER_PIXEL
在arvenums.h中還定義了一個宏,用於獲取畫素格式的Bpp:
#define ARV_PIXEL_FORMAT_BIT_PER_PIXEL(pixel_format) (((pixel_format) >> 16) & 0xff)
以Mono8為例,其值為0x01080001,右移16位並與上0xff
,獲取到第17位到32位:0x08
。對應的Bpp就可以被正確解析出來,為8。
參考文章
1.GenICam_SFNC_v2_5
2.GenICam_PFNC_v2_4
3.GenICam Pixel Format Names and Values