Разделить 3D MatND на вектор 2D Mat opencv

Можно ли получить объект 2D Mat из куба 3D-данных, хранящегося как MatND в opencv? По сути, я передаю 3D-матрицу в MexFile, используя "mexopencv". Я преобразую матрицу в объект MatND с помощью MxArray (prhs [0]). ToMatND (). Теперь я хочу разбить этот куб данных по третьему измерению на вектор матриц cv :: Mat. Мне нужно сделать операции с этими двумерными матрицами, поэтому итерируем по третьему измерению. Есть ли функция для разделения куба данных по мере необходимости? Или, может быть, способ получить указатель на двухмерные подматрицы трехмерного куба данных?

Редактировать: это мой код, который использует mexopencv для преобразования входных аргументов Matlab в массивы MatND. Я реализовал метод @ chappjc для разбиения кода трехмерных данных на вектор двумерных матриц. Помимо того, что размеры x и y переключены, все в порядке.

#include "mexopencv.hpp"
#include <iostream>

void mexFunction(int nlhs, mxArray *plhs[],
                 int nrhs, const mxArray *prhs[])
{
    // Check arguments
    if (nlhs!=1 || nrhs!=1)
        mexErrMsgIdAndTxt("myfunc:invalidArgs", "Wrong number of arguments");

    // 1) Convert MxArray to cv::Mat
    cv::MatND matnd = MxArray(prhs[0]).toMatND();

    // Extract planes from matrix
    int dims[] = { matnd.size[0],matnd.size[1],matnd.size[2]};
    std::vector<cv::Mat> matVec;
    for (int p = 0; p < dims[2]; ++p) {
        double *ind = (double*)matnd.data + p * dims[0] * dims[1]; // sub-matrix pointer
        matVec.push_back(cv::Mat(2, dims, CV_64F, ind).clone()); // clone if mnd goes away
    }

    std::cout << "\nmatVec[0]:\n" << matVec[0] << std::endl;
    std::cout << "\nmatVec[1]:\n" << matVec[1] << std::endl;

    // Here I will do some stuff with the 2D submatrices from matVec
    // ...


    // 2) Here I want to pass the 3D matrix back to Matlab
    // I only know how to convert cv::Mat back to mxArray* using mexopencv:
    plhs[0] = MxArray(matnd);
}

2-е редактирование. На самом деле тот факт, что размеры переключаются в "matVec", довольно раздражает. У кого-нибудь есть лучшее решение?

Это вывод небольшого [5 x 4 x 2] примера:

>> b

b(:,:,1) =

     1     6    11    16
     2     7    12    17
     3     8    13    18
     4     9    14    19
     5    10    15    20


b(:,:,2) =

   101   106   111   116
   102   107   112   117
   103   108   113   118
   104   109   114   119
   105   110   115   120

>> c = cv.myFunc(b)

matVec[0]:
[1, 2, 3, 4, 5;
  6, 7, 8, 9, 10;
  11, 12, 13, 14, 15;
  16, 17, 18, 19, 20]

matVec[1]:
[101, 102, 103, 104, 105;
  106, 107, 108, 109, 110;
  111, 112, 113, 114, 115;
  116, 117, 118, 119, 120]

c(:,:,1) =

     1     6    11    16
     2     7    12    17
     3     8    13    18
     4     9    14    19
     5    10    15    20


c(:,:,2) =

   101   106   111   116
   102   107   112   117
   103   108   113   118
   104   109   114   119
   105   110   115   120

Ответы на вопрос(2)

Ваш ответ на вопрос