我正在尝试编写一个程序,该程序需要一个SDL_Surface
,将其转换为IplImage
,使用 cvBlobsLib 查找 blob,将 blob 绘制为图像上的点,然后将输出转换IplImage
回SDL_Surface
.
我快完成了:只有将IplImage
back 转换为 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 个字节),但我不知道该怎么做。有任何想法吗?