【问题标题】:How to convert image storage order from channel-height-width to height-width-channel?如何将图像存储顺序从通道高度宽度转换为高度宽度通道?
【发布时间】:2019-05-27 04:52:01
【问题描述】:

我想知道如何在 C++ 中将存储为 1D std::vector<float> 的图像从 CHW 格式(通道、高度、宽度)转换为 HWC 格式(高度、宽度、通道)。由于神经网络的要求,需要更改格式。

我使用 OpenCV 读取并显示如下图像:

cv::namedWindow("Screenshot", cv::WINDOW_AUTOSIZE );
cv::imshow("Screenshot", rgbImage);

然后我将cv::MatrgbImage转换为CHW格式的一维std::vector<float>

size_t channels = 3;
std::vector<float> data(channels*ROS_IMAGE_HEIGHT*ROS_IMAGE_WIDTH);
for(size_t j=0; j<ROS_IMAGE_HEIGHT; j++){
    for(size_t k=0; k<ROS_IMAGE_WIDTH; k++){
        cv::Vec3b intensity = rgbImage.at<cv::Vec3b>(j, k);
        for(size_t i=0; i<channels; i++){
            data[i*ROS_IMAGE_HEIGHT*ROS_IMAGE_WIDTH + j*ROS_IMAGE_HEIGHT + k] = (float) intensity[i];
        }
    }
}

现在我想将std::vector&lt;float&gt;数据的格式转换为HWC。我该怎么做?

【问题讨论】:

  • 问题实际上与machine-learning ofdeep-learning 无关 - 请不要向标签发送垃圾邮件(已删除)。
  • CHW,HWC wut?请说清楚,而不是用难以理解的首字母缩写词和流行语谜语说话。
  • 没有什么能像几个 TLA 那样散布混乱。
  • 你知道如何读写二进制文件吗?如果没有,你应该学习如何这样做。这个网站是针对特定的编程问题,而不是代码编写请求。
  • 我编辑了我的问题并为我的问题提供了更多详细信息

标签: c++ image opencv vector computer-vision


【解决方案1】:

我发现了一些关于“CHW”和“HWC”格式的描述here

如果存储顺序为HWC,则表示

每个样本都存储为(height, width) 的列主矩阵float[numChannels] (r00, g00, b00, r10, g10, b10, r01, g01, b01, r11, g11, b11)

因此,使用(x, y, c) 找到像素

xStride = channels;
yStride = channels * width;
cStride = 1;

data[x*xStride + y*yStride + c*cStride]

如果存储顺序为CHW,则表示每个通道是不同的平面。使用

找到像素(x, y, c)
xStride = 1;
yStride = width;
cStride = width * height;

data[x*xStride + y*yStride + c*cStride]

注意问题代码中data[i*ROS_IMAGE_HEIGHT*ROS_IMAGE_WIDTH + j*ROS_IMAGE_HEIGHT + k]不正确,j是y坐标,应该乘以ROS_IMAGE_WIDTH

可以修改问题中的代码以生成 HWC 格式的 std::vector,方法是将最内层循环中的行替换为:

data[i + j*ROS_IMAGE_WIDTH*channels + k*channels] = (float) intensity[i];

【讨论】:

  • data[i + j*ROS_IMAGE_WIDTH*channels + k*channels] => data[i + (j * ROS_IMAGE_WIDTH + k) * channels]
  • @Scheff:是的,我通常会这样写,但我希望代码清晰并与我上面写的内容相匹配。我想一个好的编译器无论如何都会将两种形式优化为相同的机器代码。
  • 是的。我三思而后行,这是否会有所改善。 (如果ROS_IMAGE_WIDTHchannels 是常量,那肯定不会。)忽略它。 ;-)(除此之外,你得到了我的支持。);-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-02
  • 2019-05-31
  • 1970-01-01
  • 2018-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多