2015-05-26 2 views
1

Я пытаюсь использовать 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 << " "; 
     } 
    } 
} 
+1

Любые мысли по этому вопросу? Все идеи очень приветствуются! – Knippie

ответ

1

Привет, у меня нет достаточно репутации комментарий, и поскольку нет ни ответов, ни комментариев, я напишу свой комментарий здесь.

Похоже, эта линия является ошибочным:

Затем я использую .data функцию, чтобы получить указатель на первый элемент данных:

unsigned char *input = (unsigned char*)(M.data);

с матрицей M тип float поэтому вы должны использовать

float *input = (float *)(M.data);

Смежные вопросы