2011-06-29 18 views
0

私はこのコードを試みましたが、要素に正しくアクセスしていませんでした。CvCreateMatND直接アクセス

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 

ありがとう!

+0

あなたは結果として何を期待していますか? –

+0

よく、私は1がdim [1]の要素[1]で返されると期待しています。これは、cvSetReal3D – Sharpie

答えて

0

私はそれが正しくないため、私の他の答えをお詫び申し上げます。期待通りに機能しなかったことを示すコメントを追加できました。私はそれ以来fixed itを持って、あなたがしようとしているものを行うための正しい方法は次のとおりです。

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 
... 
関連する問題