在 OpenCV 中访问 IPL_DEPTH_16S 类型的 IplImage 元素

发布于 2024-10-27 22:56:29 字数 460 浏览 0 评论 0原文

我知道对于单通道字节图像,您会这样做:

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

对于单通道浮动图像,您会这样做:

((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]

没有成功。

谢谢,

I know that for a single channel byte image you do:

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

and for a single channel float image, you do:

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

But how about for 16 bit signed images (IPL_DEPTH_16S), I tried:

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

and

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

to no avail.

Thanks,

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

眼泪淡了忧伤 2024-11-03 22:56:29

实际上,如果你采用 widthStep/2,那么短的效果很好......

Actually, the short works fine if you take widthStep/2...

强辩 2024-11-03 22:56:29

答案是:

 (((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

The answer is :

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

And the reason is explained by this example:

#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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文