SDL_Surface
を取り、それを に変換しIplImage
、cvBlobsLib を使用してブロブを見つけ、ブロブを画像上のスポットとしてペイントし、出力IplImage
を に戻すプログラムを作成しようとしていSDL_Surface
ます。
私はほぼ完了しています: IplImage
back を anに変換することだけSDL_Surface
がまだ行われていません。この IplImage には 3 つの画像チャネルがあり、ピクセルあたり 8 ビットです。使用できる呼び出しが 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);
私は現在試していSDL_CreateRGBsurfaceFrom
ます。しかし、ピッチ、Rmask、Gmask、および Bmask の正しい値が何であるかはわかりません。(アルファ チャネルがないため、Amask は 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 ドキュメンテーションには、「ピッチは、サーフェスのスキャンラインのサイズ (バイト単位)、つまり widthInPixels*bytesPerPixel です。」と書かれています)。これは、「深さ 8、nChannels 3、ピッチ 1920」を出力し、完全に赤い画像を表示します。8 ビット イメージを 24 ビット (チャネルあたり 1 バイト) に変換することで解決できると思いますが、その方法がわかりません。何か案は?