gpt4 book ai didi

c++ - 如何将 OpenCV IplImage 转换为 SDL_Surface?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:10:40 28 4
gpt4 key购买 nike

我正在尝试编写一个程序,该程序采用 SDL_Surface,将其转换为 IplImage,使用 cvBlobsLib 查找 Blob ,将 Blob 绘制为 Blob 图像,然后将输出 IplImage 转换回 SDL_Surface

我快完成了:仅将 IplImage 转换回 SDL_Surface 尚未完成。这个 IplImage 有 3 个图像 channel ,每像素 8 位。我想我可以使用两个调用:

SDL_Surface *SDL_CreateRGBSurface(Uint32 flags, int width, int height, int depth, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask);
SDL_Surface *SDL_CreateRGBSurfaceFrom(void *pixels, int width, int height, int depth, int pitch, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask);

我目前正在尝试使用 SDL_CreateRGBsurfaceFrom。但是,我不知道 pitch、Rmask、Gmask 和 Bmask 的正确值是多少。 (Amask 为 0,因为没有 alpha channel 。)

谁能帮我解释一下如何做到这一点?

谢谢!

编辑:例如,这是我尝试使用的代码:

SDL_Surface *ipl_to_surface (IplImage *opencvimg)
{
int pitch = opencvimg->nChannels*opencvimg->width;
printf("Depth %d, nChannels %d, pitch %d\n", opencvimg->depth,
opencvimg->nChannels, pitch);
SDL_Surface *surface = SDL_CreateRGBSurfaceFrom((void*)opencvimg->imageData,
opencvimg->width,
opencvimg->height,
opencvimg->depth,
pitch,
0x0000ff, 0x00ff00, 0xff0000, 0
);
return surface;
}

(SDL 文档写道“Pitch 是表面扫描线的大小,以字节为单位,即 widthInPixels*bytesPerPixel。”)这将输出“深度 8,nChannels 3,间距 1920”并显示完全红色的图像。我认为一个解决方案是将我的 8 位图像转换为 24 位(每个 channel 1 个字节),但我不知道该怎么做。有什么想法吗?

最佳答案

好的,我成功了!

我想我对 OpenCV 深度为 8 意味着一个像素每个 channel 有 8 位,所以在 3 channel 图像中,一个像素有 24 位这一事实感到困惑。因此,当将其转换为深度的 SDL 含义时,我们得到 8 * 3 = 24 位。

图像毕竟是 24 位的,SDL 支持。因此将图像转换为 SDL 非常简单:

SDL_Surface *surface = SDL_CreateRGBSurfaceFrom((void*)opencvimg->imageData,
opencvimg->width,
opencvimg->height,
opencvimg->depth*opencvimg->nChannels,
opencvimg->widthStep,
0xff0000, 0x00ff00, 0x0000ff, 0
);
return surface;

抱歉造成混淆,我希望这可以帮助任何正在寻找相同答案的人。

其他感兴趣的链接: http://www.libsdl.org/cgi/docwiki.cgi/Pixel_Access
完整的子程序位于: http://paster.dazjorz.com/?p=3714

关于c++ - 如何将 OpenCV IplImage 转换为 SDL_Surface?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/393954/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com