CvCreateMatND Прямой доступ - PullRequest
0 голосов
/ 29 июня 2011

Я пробовал этот код, и он неправильно обращается к элементу, может кто-нибудь объяснить, почему?

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


    printf("test: %d \n",cvGetReal3D(matA, 1, 1, 1));
    cvSetReal3D(matA, 1, 1, 1, (cvGetReal3D(matA, 1, 1, 1)+1));
    int test = cvGetReal3D(matA, 1, 1, 1);
    printf("test: %d \n",test);


    char cont = 1;
       for (int dim_index = 0; dim_index < matA->dims; dim_index++) 
         {   
    printf("There are %d elements on dim %d\n", matA->dim[dim_index].size, dim_index);

    for (int elem = 0; elem < matA->dim[dim_index].size; elem++)
    {   
        printf("On element [%d] of dim %d, wrote: %d\n", elem, dim_index, matA->data.ptr[matA->dim[dim_index].size * dim_index + elem]);
    }   
} 

Выход:

test: 0
test: 1
There are 5 elements on dim 0
On element [0] of dim 0, wrote: 0
On element [1] of dim 0, wrote: 0
On element [2] of dim 0, wrote: 0
On element [3] of dim 0, wrote: 0
On element [4] of dim 0, wrote: 0
There are 5 elements on dim 1
On element [0] of dim 1, wrote: 0
On element [1] of dim 1, wrote: 0
On element [2] of dim 1, wrote: 0
On element [3] of dim 1, wrote: 0
On element [4] of dim 1, wrote: 0
There are 5 elements on dim 2
On element [0] of dim 2, wrote: 0
On element [1] of dim 2, wrote: 0
On element [2] of dim 2, wrote: 0
On element [3] of dim 2, wrote: 0
On element [4] of dim 2, wrote: 0

Спасибо!

1 Ответ

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

Я прошу прощения за мой другой ответ, потому что он не был правильным. Вы могли бы добавить комментарий, в котором говорилось, что это не сработало, как ожидалось. Я исправил это с тех пор, и правильный способ сделать то, что вы пытаетесь это:

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

printf("Before writting at 1x1x1 %f \n", cvGetReal3D(matA, 1, 1, 1));
cvSetReal3D(matA, 1, 1, 1, (cvGetReal3D(matA, 1, 1, 1)+1));

int test = cvGetReal3D(matA, 1, 1, 1);
printf("After: %d\n", test);

printf("Before writting at 3x2x1 %f \n", cvGetReal3D(matA, 3, 2, 1));
cvSetReal3D(matA, 3, 2, 1, (cvGetReal3D(matA, 3, 2, 1)+1));

test = cvGetReal3D(matA, 3, 2, 1);
printf("After: %d\n", test);

for (int x = 0; x < matA->dim[0].size; x++) // dim 0
{
    for (int y = 0; y < matA->dim[1].size; y++) // dim 1
    {
        for (int z = 0; z < matA->dim[2].size; z++) // dim 2
        {
            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);
        }
    }
}

Я немного улучшил ваш тест, и код выше записывает 1 в позиции (1,1,1) и (3,2,1).

Выходы (упрощенно):

x:1 y:1 z:0 --> 0.000000
x:1 y:1 z:1 --> 1.000000
x:1 y:1 z:2 --> 0.000000
...
x:3 y:2 z:1 --> 1.000000
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...