加载嵌入式系统的png图像

时间:2017-06-19 09:33:54

标签: c++ image embedded png

我正在使用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]并计算音高和planeCount值?

当我使用rgb图像时,DW_MAX_IMAGE_PLANES等于3。

1 个答案:

答案 0 :(得分:0)

pitchplaneCount的值很简单。由于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数组。