[英]Load png image for embedded system
我正在使用tensorRT進行嵌入式深度學習推理C ++項目。 對於我的模型,有必要減去平均圖像。
我使用的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]
並計算pitch和planeCount值?
當我使用RGB圖像時,DW_MAX_IMAGE_PLANES等於3。
pitch
和planeCount
的值很簡單。 由於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
數組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.