在 C++ 中将 NCHW 转换为 NHWC

Posted

技术标签:

【中文标题】在 C++ 中将 NCHW 转换为 NHWC【英文标题】:Convert NCHW to NHWC in C++ 【发布时间】:2021-09-05 11:54:01 【问题描述】:

OpenCV 读取 NCHW 格式的图像(样本数 x 通道 x 高度 x 宽度),我需要将其转换为 NHWC 格式(将数组的第二维移到最后)。有没有一种有效的方法可以在 C++ 中从 NCHW 转换为 NHWC?我可以用 3 个 for 循环来做到这一点,但显然这根本没有效率。

【问题讨论】:

您要分离频道吗?您可以使用 cv::split 后跟连接或使用 cv::blobFromImage。也许还有其他方法可以使用 cvtColor 或更专业的功能。 @Micka 不,blobFromImage 以 NCHW 格式创建 blob。在这一点上,我找不到将其转换为 NHWC 的有效方法。我想做的只是用 cv::imread 读取图像,然后自己将其转换为 4d Mat,而不是使用 blobFromImage。我不知道这是否会解决问题,但我会尝试。无论如何,非常感谢您的回复。 那么 NCHW 就是 N 个图像的串联。也许你可以将它作为数据指针嵌入到 Mat4d 中 此处指定的维度排序不明确。最后一个维度是样本在内存中连续的维度吗?因为 OpenCV 通常会在内存中读取具有连续一个像素的样本的图像。您需要更清楚地了解如何重新组织数据的内存布局。 另外,为什么你说循环效率不高?除了循环之外,您无法复制数据。甚至像 memcpy 这样的系统调用也会循环数据。 【参考方案1】:

这个简单的解决方案对我来说适用于 OpenCV C++:

static void hwc_to_chw(cv::InputArray src, cv::OutputArray dst) 
  std::vector<cv::Mat> channels;
  cv::split(src, channels);

  // Stretch one-channel images to vector
  for (auto &img : channels) 
    img = img.reshape(1, 1);
  

  // Concatenate three vectors to one
  cv::hconcat( channels, dst );

【讨论】:

以上是关于在 C++ 中将 NCHW 转换为 NHWC的主要内容,如果未能解决你的问题,请参考以下文章

TensorFlow的图像NCHW与NHWC

pytorch层顺序会影响结果吗

如何在 C++ 中将数字转换为字符串,反之亦然

如何在 C++ 中将指针转换/转换为引用

在 C++ 中将彩色位图转换为灰度

在 C++ 中将 bitset 转换为 int