繁体   English   中英

将 CHW 格式的浮点向量转换为 cv::Mat

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM