Я пытаюсь использовать 3D-матрицу в OpenCV для хранения и доступа к данным (тип float). В настоящее время у меня есть 3 методы для создания 3D-матрицы самого размера 158 х 98 х 32 и инициализировать его в нуле:C++ OpenCV - Создание трехмерной матрицы и доступ к ее элементам
int out[3];
out[0] = 98;
out[1] = 158;
out[2] = 32;
//Alternative 1:
cv::Mat M(3, out, CV_32FC1, cv::Scalar(0));
//Alternative 2:
cv::Mat M(3, out, CV_32F);
M = Scalar(0);
//Alternative 3:
Mat *feat = new Mat(3,out,CV_32F,Scalar(0));
Mat M = *feat;
Затем я использую .data функции, чтобы получить указатель на первый элемент данных:
unsigned char *input = (unsigned char*)(M.data);
Далее, я подумал я мог установить первый элемент (0,0,0) до 1 с помощью одного из следующих двух методов:
input[0]= 1; //Alternative 1
M.at<float>(0,0,0) = 1; //Alternative 2
по меньшей() метод работает очень хорошо, но Кажется, я не могу указатель на работу. Следующее:
input[0]= 1;
input[1]= 2;
Результаты в 4.32e-42 на элементе (0,0,0) в то время как другая команда кажется, не имеет никакого эффекта вообще. Согласно документации, вход [0] должен ссылаться на значение в точке (0,0,0), вход [1] - (0,0,1) и вход [32] - (0,1,0) и т. Д. .
Также, M.step установлен в 0, а M.cols и M.rows равны -1. Количество строк и столбцов кажется правильным для многомерной матрицы, но шаг должен иметь значение, правильно?
Итак, какой из трех вариантов лучше всего инициализировать трехмерную матрицу и как я могу использовать указатели для доступа к каждому элементу данных отдельно?
Кстати, я использую следующий код для вывода содержимое матрицы (любые другие идеи приветствуются, а):
float M_res = 0;
ofstream res;
res.open("Results.txt"); //Open file
for(int loopz=0;loopz<out[2];loopz++) {
res << endl << endl << "Dimension " << loopz << endl;
for(int loopy=0;loopy<out[0];loopy++) {
res << endl;
for(int loopx=0;loopx<out[1];loopx++) {
M_res = M.at<float>(loopy,loopx,loopz)
res << M_res << " ";
}
}
}
Любые мысли по этому вопросу? Все идеи очень приветствуются! – Knippie