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