Разделить 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