我正在尝试编写一个程序,它接受一个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个字节),但我不知道该怎么做.有任何想法吗?
好的,我搞定了!
我认为我对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