如何将 cv::Mat 中的维度从 CxWxH 置换为 WxHxC?

问题描述 投票:0回答:3

如何将 cv::Mat 中的尺寸从 CxWxH 置换为 WxHxC(宽度 x 高度 x 通道)?

即我如何转换 Mat:

  • 来自

    cv::Mat frame (1000, 1000, CV_8UC3) = cv::imread("image.jpg", -1);

    尺寸:通道,宽度,高度

  • to Mat with dimensions: width, height, channels

    
    int sizes_inputs[] = { 3, 1000, 1000 };
    cv::Mat out_image(3, sizes_inputs, CV_8UC);
    

OpenCV 中是否有现成的快速转换函数?或者我应该自己实现这个算法?

c++ algorithm opencv image-processing opencv3.0
3个回答
0
投票

如果你想以不同的方式对待底层数据,那么你可以使用

reshape
。数据存储为
BGRBGRBGR...

否则你将不得不自己打乱数据。

cv::reshape
cv::minChannels
可能对此很方便。


0
投票

你可以模仿它。我没有测试过代码,但应该这样做:

cv::Mat frame (1000, 1000, CV_8UC3) = cv::imread("image.jpg", -1);
int sizes_inputs[] = { 3, 1000, 1000 };
cv::Mat out_image(3, sizes_inputs, CV_8UC);

cv::Mat slices[] = {cv::Mat(1000, 1000, CV_8UC, out_image.ptr()),
                    cv::Mat(1000, 1000, CV_8UC, out_image.ptr() + 1000*1000),
                    cv::Mat(1000, 1000, CV_8UC, out_image.ptr() + 1000*1000*2)};
cv::split(frame, slices);

0
投票

请在此处查看答案:C++ OpenCV 转置/置换图像轴

我尝试使用以下代码:

cv::Mat a = cv::imread("red.png");
auto b = a.clone();
std::vector<cv::Mat> planes =
{
    cv::Mat(a.rows, a.cols, CV_8U, b.ptr(0)), 
    cv::Mat(a.rows, a.cols, CV_8U, b.ptr(0) + a.rows * a.cols),
    cv::Mat(a.rows, a.cols, CV_8U, b.ptr(0) + a.rows * a.cols * 2)
};
cv::split(a, planes);

通过观察a和b的值,buffer似乎是正确的。

© www.soinside.com 2019 - 2024. All rights reserved.