在3D Mat中插入和提取2D Mat

时间:2019-04-15 08:12:08

标签: c++ opencv 3d load 2d

我需要将从文件读取的2D Mat放入3D Mat。

背景:我想创建一个可以处理2D / 3D图像,视频,这些图像的堆栈等的类。为此,我需要6D Mats(x,y,z,时间,堆栈,页面),我需要知道如何(有效)处理2D切片以进行处理。

我设法创建了一个6D 3通道Mat,用例如蓝色将其初始化,沿任意尺寸截取2D切片并显示它,但是我无法在其中放入数据(例如来自文件的数据)。

这篇帖子How to assign 2d images to planes of a 3d OpenCV Mat, then extract 2D Mats along a different axis?提出了类似的问题,但对于我的情况而言,答案无济于事。

所以我的问题是,如何将2D Mat放入3D材质中(简化)。我如何尝试做到这一点:

//3D main-mat where data shall be stored in
int size_3D_main[] = {3, 768, 1024};
Mat MA_3D_main(3, size_3D_main, CV_8UC3);

//2D input mats (from files, each 1024x768 color)
Mat MA_2Da_inp[3];
MA_2Da_inp[0] = imread("D:/path/motiv_chrysanthemum.jpg");
MA_2Da_inp[1] = imread("D:/path/motiv_desert.jpg");
MA_2Da_inp[2] = imread("D:/path/motiv_hydrangeas.jpg");

//Put input-2D mats into 3D-main mat using target mat
for(int z = 0; z < 3; z++)
{
    vector<Range> vRG_trgt = {Range(z, z+1), Range::all(), Range::all()};
    Mat MA_2D_trgt = MA_3D_main(vRG_trgt);
    MA_2Da_inp[z].copyTo(MA_2D_trgt);
}

//Extract one plane/img (technically still 3D) - read 2nd plane
vector<Range> vRG_extr = {Range(1, 2), Range::all(), Range::all()};
Mat MA_3D_extr = MA_3D_main(vRG_extr);

//3D-extr mat reinterpreted as 2D
int size_2D_show[] = {768, 1024};
Mat MA_2D_show(2, size_2D_show, CV_8UC3, MA_3D_extr.ptr());

//show 2D-show mat
imshow("test if it worked", MA_2D_show);

上面的代码编译并运行,但是显示的是黑色图像(正确大小),而不是平面1(沙漠)中的图像。

0 个答案:

没有答案