How to convert an OpenCV IplImage to an SDL_Surface?
我正在尝试编写一个将
我快完成了:尚未将
1 2 | 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); |
我目前正在尝试
有人可以通过解释如何帮助我吗?
谢谢!
编辑:例如,这是我尝试使用的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | SDL_Surface *ipl_to_surface (IplImage *opencvimg) { int pitch = opencvimg->nChannels*opencvimg->width; printf("Depth %d, nChannels %d, pitch %d\ ", 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文档写道:"间距是表面扫描线的大小,以字节为单位,即widthInPixels * bytesPerPixel。")
这将输出"深度8,n通道3,音高1920"并显示全红色图像。
我认为一种解决方案是将我的8位图像转换为24位(每个通道1个字节),但是我不知道该怎么做。有任何想法吗?
好吧,我知道了!
我认为,OpenCV深度为8意味着一个像素每个通道具有8位的事实使我感到困惑,因此在3通道图像中,一个像素具有24位。 因此,当将其转换为深度的SDL含义时,我们得到
图像毕竟是24位,这是SDL支持的。 因此,将图像转换为SDL很简单:
1 2 3 4 5 6 7 8 | 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通道图像完美配合,但我想显示一个Single-Channel-IplImage
所以我们去了:
1 2 3 4 5 6 7 8 9 10 | 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; } |