如何把一个开源IplImage到SDL_Surface?
题
我想写一个程序,它需要一个 SDL_Surface
, ,将其转换为 IplImage
, 使用cvBlobsLib找到斑点、油漆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。(于为0,因为没有阿尔法渠道。)
可能有人帮我解释如何做到这一点?
谢谢!
编辑:例如,这是码我尝试使用:
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文件写道:"距的尺寸扫描线的面,在字节,即宽度(像素)*bytesPerPixel.") 这输出"深入8,nChannels3,间距1920年",并显示一个完全是红色的图像。我 想想 一个解决办法就是把我的8位图像的24位(1个字节每频道),但是我不知道如何做到这一点。任何想法?
解决方案
好吧,我得到了它的工作!
我认为我很困惑的事实,即一个开源深入的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
其他提示
首先:谢谢!
第二:它的工作原理完全与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;
}