【发布时间】:2010-09-28 11:32:53
【问题描述】:
我正在尝试编写一个程序,它采用 SDL_Surface,将其转换为 IplImage,使用 cvBlobsLib 查找 blob,将 blob 绘制为图像上的点,然后转换输出 IplImage回SDL_Surface。
我快完成了:仅将 IplImage 转换回 SDL_Surface 尚未完成。这个 IplImage 有 3 个图像通道,每像素 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 通道。)
谁能帮我解释一下如何做到这一点?
谢谢!
编辑:例如,这是我尝试使用的代码:
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。”) 这将输出“Depth 8, nChannels 3, pitch 1920”并显示一个完全红色的图像。 我认为一个解决方案是将我的 8 位图像转换为 24 位(每个通道 1 个字节),但我不知道该怎么做。有什么想法吗?
【问题讨论】:
-
您的图像是每像素 8 位,具有 3 个通道?您的意思是每像素 24 位吗,因为您指定的 RGB 掩码似乎暗示了这一点?
-
不,恰恰相反:我指定的 RGB 蒙版是错误的。图像实际上是每像素 8 位,具有 3 个通道。我现在要试试这段代码:paster.dazjorz.com/?p=3705
-
是的,您最好将其转换为 24 位或 32 位,因为我认为 SDL 不能很好地处理非标准位深度。
-
在stackoverflow.com/questions/394488/…也看到问题... :(
-
好的。所以现在我有一个 32 位的 3 通道图像,我需要将其转换为 SDL_Surface。