我想写一个程序,它需要一个 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;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top