我正在使用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。
答案 0 :(得分:0)
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
数组。