Доступ к элементам cvCreateMatND - PullRequest
2 голосов
/ 27 июня 2011

Я новичок в OpenCV и пытаюсь создать n-мерный массив и получить доступ к каждому элементу с помощью CvMatND.

Я могу получить доступ к 2D-матрице по данным [i * step + j * nchannels + 0], как мне получить доступ к элементам матрицы, созданной

      int size[] = { 12, 12, 12 };
      CvMatND* matB = cvCreateMatND(3, size, CV_8U);
      int *Data = matA->data.i;

Спасибо

Ответы [ 2 ]

3 голосов
/ 29 июня 2011

Я просмотрел и протестировал свой предыдущий ответ, и, как вы выяснили, он не был точным.

Это рабочий код для перебора всех элементов трехмерного массива.

int size[] = { 5, 5, 5 };
CvMatND* matA = cvCreateMatND(3, size, CV_32F);
cvSetZero(matA);

for (int x = 0; x < matA->dim[0].size; x++)
{
    for (int y = 0; y < matA->dim[1].size; y++)
    {
        for (int z = 0; z < matA->dim[2].size; z++)
        {
            unsigned char* ptr = matA->data.ptr + ((size_t)x * matA->dim[0].step) + ((size_t)y * matA->dim[1].step) + ((size_t)z * matA->dim[2].step);
            float value = *(float*)ptr;

            printf("x:%d y:%d z:%d --> %f\n", x, y, z, value);
        }
    }
}
0 голосов
/ 19 апреля 2018

Вы можете использовать at<type>(idx[]) с type типом данных вашего изображения и idx[] массивом индексов.Например, чтобы получить доступ к строке 2, столбцу 3 и каналу 4-й матрицы 3D M типа CV_32F, вы должны выполнить:

int idx[3] = {2,3,4};
float x = M.at<float>(idx);
...