Мне нужно поместить считанные 2D-мат из файла в 3D-мат.
Фон: я хочу создать класс, который может обрабатывать 2D / 3D-изображения, видео, их стеки и т. Д. Длячто мне нужны 6D Mats (x, y, z, время, стек, страницы), и мне нужно знать, как (эффективно) обрабатывать их 2D-фрагменты для обработки.
Мне удалось создать 6D 3-канальныйМат, инициализируйте его, например, синим цветом, возьмите 2D-срез вдоль любых размеров и отобразите его, но я не могу поместить в него данные (например, из файлов).
Этот пост Как назначить 2D-изображенияна плоскости 3d OpenCV Mat, затем извлекать 2D Mats вдоль другой оси? задает аналогичный вопрос, но ответы не помогли в моем случае.
Итак, мой вопрос, как поставить2D мат в 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 (пустыня).