我需要将从文件读取的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(沙漠)中的图像。