我正在尝试编写一个程序,它接受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
。但是,我不知道音高,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个字节),但我不知道该怎么做。有什么想法吗?
答案 0 :(得分:11)
好的,我搞定了!
我认为我对OpenCV深度为8意味着一个像素每个通道有8位这一事实感到困惑,因此在3通道图像中,一个像素具有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
答案 1 :(得分:3)
首先:谢谢!
第二:它与3通道图像完美配合,但我想显示单通道IplImage
所以我们去了:
SDL_Surface *single_channel_ipl_to_surface (IplImage *opencvimg)
{
SDL_Surface *surface = SDL_CreateRGBSurfaceFrom((void*)opencvimg->imageData,
opencvimg->width,
opencvimg->height,
opencvimg->depth*opencvimg->nChannels,
opencvimg->widthStep,
0xffffff, 0xffffff, 0xffffff,0);
return surface;
}