2017-06-19 73 views
0

我正在使用tensorRT進行嵌入式深度學習推理C++項目。 對於我的模型,有必要減去平均圖像。爲嵌入式系統加載png圖像

,我使用的API,允許我定義與RGB圖像以下數據結構的平均影像:

uint8_t *data[DW_MAX_IMAGE_PLANES];  // raw image data 
size_t pitch;        // pitch of the image in bytes 
uint32_t height;       // height of the image in px 
uint32_t width;       // image width in px 
uint32_t planeCount;      // plane count of the image 

到目前爲止,我發現的lib LodePNG,這是非常有用的這個任務我認爲。 它可以只用幾行加載png格式:

// Load file and decode image. 
std::vector<unsigned char> image; 
unsigned width, height; 
unsigned error = lodepng::decode(image, width, height, filename); 

的,現在的問題是如何std::vector<unsigned char>轉換爲uint8_t *[DW_MAX_IMAGE_PLANES]和計算音調和planeCount值?

由於我使用的是RGB圖像DW_MAX_IMAGE_PLANES等於爲pitchplaneCount簡單3.

+0

你的問題的標題似乎有點不對,因爲你已經成功加載了PNG。 –

+0

也許一個['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)引用可能有用?有幾種方法可以獲得由矢量管理的數據的指針,包括(但不限於)獲取指向其第一個元素的指針。 –

+0

至於其餘部分,您提供的元數據庫不是嗎? –

回答

0

值。由於LodePNG的decode默認爲bitdepth = 8,所以pitch的值(以字節爲單位)爲1。並且因爲圖像是RGB,所以planeCount的值是3 - 每種顏色的一個平面。

既然你不使用alpha通道,你應該有LodePNG簡單地解碼爲RGB格式直接:

unsigned error = lodepng::decode(image, width, height, filename, LCT_RGB); 

但是一旦圖像被解碼成std::vector<unsigned char>,您將無法使用它直。從LodePNG解碼後的數據是按以下格式:

image -> R0, G0, B0, R1, G1, B1, R2, G2, B2, ... 

但你需要它的格式如下:

data[0] -> R0, R1, R2, ... 
data[1] -> G0, G1, G2, ... 
data[2] -> B0, B1, B2, ... 

如果你的內存限制,你必須重新排列的值圖像矢量(R0, R1, ... Rn, G0, G1, ... Gn, B0, B1, ... Bn)並計算適當的指針來初始化data數組。

如果您有可用內存,則可以爲三個顏色通道中的每一個創建單獨的矢量。然後複製解碼後的數據image,並使用指向矢量第一個元素的指針初始化data數組。