如何展平2D矩阵,然后将其复制到OpenCV中另一个矩阵中的特定列?

时间:2018-11-24 15:31:09

标签: c++ opencv matrix

例如,我有一个3通道的2D矩阵:

const auto img = imread("path.jpg", IMREAD_COLOR);
const auto ROWS = img.rows;
const auto COLS = img.cols;

然后我将其拆分为矢量以获得具有1通道的2D矩阵:

std::vector<Mat> channels{};
split(img, channels);

我想将通道存储为大小为[ROWS COLS,3]的矩阵,因此我尝试执行此操作。我认为应该将上方渠道中的每个矩阵展平为[ROWS COLS,1]大小的矩阵,然后将其复制到结果中的特定列,但这是错误的:

Mat result(ROWS*COLS, 3, CV_32F);
auto i = 0;
for(const auto& channel : channels) {
    channel.reshape(0, ROWS*COLS).copyTo(result.col(i));
    ++i;
}

我使用了一种天真的方法,可以给出正确的结果

for (const auto& channel : channels) {
     for (auto y = 0; y < rows; ++y)
        for (auto x = 0; x < cols; ++x) {
            result.at<float>(y + x * rows, i) = channel.at<uchar>(y, x);
        }
    ++i;
}

第一个解决方案我做了什么错?

0 个答案:

没有答案