6

我正在尝试编写一个程序,该程序需要一个SDL_Surface,将其转换为IplImage,使用 cvBlobsLib 查找 blob,将 blob 绘制为图像上的点,然后将输出转换IplImageSDL_Surface.

我快完成了:只有将IplImageback 转换为 anSDL_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. 但是,我不知道 pitch、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 个字节),但我不知道该怎么做。有任何想法吗?

4

2 回答 2

11

好的,我得到它的工作!

我想我对 OpenCV 深度为 8 意味着一个像素每个通道有 8 位这一事实感到困惑,因此在 3 通道图像中,一个像素有 24 位。因此,当将其转换为深度的 SDL 含义时,我们会得到8 * 3 = 24位。

图像毕竟是 SDL 支持的 24 位。因此将图像转换为 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

于 2008-12-27T21:02:29.097 回答
3

首先:谢谢!!

第二:它与 3 通道图像完美配合,但我想显示 Single-Channel-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;
}
于 2009-09-21T10:24:58.953 回答