2

単一チャネルのバイト画像の場合、次のことを知っています。

((uchar *)(img->imageData + i*img->widthStep))[j]

単一チャネルの float 画像の場合は、次のようにします。

((float*)(img->imageData + i*img->widthStep))[j]

しかし、16ビットの署名付き画像(IPL_DEPTH_16S)についてはどうですか、私は試しました:

((short*)(img->imageData + i*img->widthStep))[j]

((signed int*)(img->imageData + i*img->widthStep))[j]

無駄に。

ありがとう、

4

2 に答える 2

1

実際には、widthStep/2 を取ると、short は正常に動作します...

于 2011-03-31T17:38:32.573 に答える
0

答えは:

 (((short*)(img->imageData)) + i*img->widthStep)[j]

そしてその理由はこの例で説明されています:

#include <stdio.h>

int main(){
    char * pointer;

    printf("%zu \n", sizeof(char));
    printf("%zu \n", sizeof(signed short));
    printf("%zu \n", sizeof(signed int));
    printf("%zu \n", sizeof(float));

    printf("%p \n",((char*)(pointer) + 10 * 5));
    printf("%p \n",((signed short*)(pointer)) + 10 * 5);
    printf("%p\n",(((signed int*)(pointer)) + 10 * 5));
    printf("%p\n",((float*)(pointer)) + 10 * 5);
}

1 
2 
4 
4 
0x7fff5fc01084 
0x7fff5fc010b6 
0x7fff5fc0111a
0x7fff5fc0111a
于 2011-04-01T08:40:05.500 に答える