将CHW格式的浮点向量转换为cv::Mat
Converting vector of floats in CHW format to a cv::Mat
我有一个以CHW
格式存储元素的std:vector<float>
。在这里C=8, H=48, W=48
。
我希望将其存储在HWC格式的cv::Mat
中。
我不知道该怎么做。
最简单的方法之一是创建大小为48 x 48的单通道cv::Mat
s,然后将它们与cv::merge
合并在一起。
下面是一个函数,它接收具有行、列和通道数的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;
}
使用此功能:
std::vector<float> data = ...; // Data is created here
cv::Mat output = CreateMatFromVector(data, 48, 48, 8);
相关文章:
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 将CHW格式的浮点向量转换为cv::Mat
- 将 cv::mat 转换为 QImage
- 将 cv::Mat 转换为 std::vector 的通用函数
- 将 opencv 从 2.4.13 转换为 3.3.1 时由 cv::resize() 引起的运行错误
- 如何将 cv::Mat 转换为 vtkImageData?
- 如何将 vtkImageData 转换为 cv::Mat?
- Qt-工作线程崩溃时将cv::Mat转换为QImage
- 将 cv::Mat 转换为无符号的 int 像素
- 如何在不复制数据的情况下将 cv::Mat 转换为 2d 标准::矢量
- 转换 cv::mat 转换为 std::矢量<double>并发症
- 如何将屏幕截图位图转换为 cv::Mat
- 如何从 cv::Mat (C++) 转换为 tf.placeholder(C++ Boost.Python)
- CV :: MAT如何从/转换为GLM :: MAT4
- 无法将参数 8 从 'int' 转换为 'cv::HOGDescriptor::HistogramNormType'
- 如何转换 cv:垫子的类型
- 如何正确转换 cv::Mat 到 CV_8UC1.
- 需要一个更快的方式来转换cv::Mat成一维矢量形式
- 内存泄漏转换cv::Mat
- 如何转换cv::Mat到MFC CBitmap