開源相機管理庫Aravis學習——PixelFormat編碼規則

paw5zx發表於2024-04-28

目錄
  • 前言
  • 前置知識
    • 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中共分為三類,對應的編號為0x010x020x08。具體的分類準則在後面討論;
  • 0x08:表示當前PixelFormat對應的Bpp,0x08就對應Bpp8;
  • 0x0001:為畫素格式設定的序號。

分類標準

之前本來還想自己推斷一下Aravis中對PixelFormat的分類依據,後來我查資料時看到了GenICam Pixel Format Names and Values,這應該是相當於EMVA規定的一個準則吧。對比原始碼可以發現,Aravis中0x010x02開頭的PixelFormat對應的值就是遵循的這個檔案的內容。

0x010x02的差別估計就是一個畫素點對應的通道數量不同,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

相關文章