[英]Converting vector of floats in CHW format to a cv::Mat
我有一个std:vector<float>
以CHW
格式存储元素。 这里, C=8, H=48, W=48
。
我希望将其存储在 HWC 格式的cv::Mat
中。
我对如何做到这一点一无所知。
最简单的方法之一是创建大小为 48 x 48 的单通道cv::Mat
,然后使用cv::merge
将它们合并在一起。
下面是一个 function ,它接收一个带有行数、列数和通道数的std::vector<float>
然后创建一个大小为H x W x C
的最终cv::Mat
。 由于您的数据采用C x H x W
格式,不幸的是,这变得有点困难,因为每个通道的数据不是连续的格式。 具体来说,如果数据采用典型的H x W x C
格式,则以扁平格式访问数据的方法是:
HWC ---> index = (i*cols + j) + k*rows*cols
(i, j, k)
将是访问向量中相应元素的行、列和通道索引。 您的数据采用C x H x W
格式,这意味着以扁平格式访问数据:
CHW ---> index = (k*rows + i) + j*channels*rows
因此,我们将遍历每个通道k
,并获取行和列位置(i, j)
并将其临时存储到一个向量中,然后使用该向量并创建一个单通道cv::Mat
。 然后,我们将在最后堆叠这些cv::Mat
。
#include <opencv2/opencv.hpp>
cv::Mat CreateMatFromVector(const std::vector<float>& data, const int rows, const int cols, const int channels)
{
// Create stacked vector of cv::Mats
std::vector<cv::Mat> stacked_mats;
stacked_mats.reserve(channels); // Reserve space for efficiency
// Stack the channels
for (int k = 0; k < channels; ++k) {
std::vector<float> pixels;
pixels.reserve(rows * cols);
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
pixels.push_back(data[k * rows + i + j * channels * rows]);
}
}
cv::Mat channel(rows, cols, CV_32FC1, pixels.data());
stacked_mats.push_back(channel);
}
// Stores output matrix
cv::Mat output;
// Create the output matrix
cv::merge(stacked_mats, output);
return output;
}
要使用这个 function:
std::vector<float> data = ...; // Data is created here
cv::Mat output = CreateMatFromVector(data, 48, 48, 8);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.