Dividir 3D MatND en vector de 2D Mat opencv

¿Es posible obtener un objeto Mat 2D de un cubo de datos 3D almacenado como MatND en opencv? Básicamente estoy pasando una matriz 3D a un MexFile usando "mexopencv". Convierto la matriz en un objeto MatND usando MxArray (prhs [0]). ToMatND (). Ahora quiero dividir este datacube a lo largo de la tercera dimensión en un vector de matrices cv :: Mat. Necesito realizar operaciones en estas matrices 2D y, por lo tanto, iterar sobre la tercera dimensión. ¿Hay una función para dividir el cubo de datos según sea necesario? ¿O tal vez una forma de obtener un puntero a las submatrices 2D del cubo de datos 3D?

Editar: este es mi código que usa mexopencv para convertir los argumentos de entrada de Matlab en matrices MatND. Implementé el método de @ chappjc para dividir el código de datos 3D en un vector de matrices 2D. Aparte del hecho de que las dimensiones xey se cambian, todo está bien.

#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);
}

2da Edición. En realidad, el hecho de que las dimensiones se cambien en "matVec" es bastante molesto. ¿Alguien tiene una solución mejor?

Este es el resultado de un pequeño ejemplo [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

Respuestas a la pregunta(2)

Su respuesta a la pregunta