вставлять и извлекать 2D Mat в 3D Mat и из него - PullRequest
0 голосов
/ 15 апреля 2019

Мне нужно поместить считанные 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 (пустыня).

...