SDL_SurfaceににOpenCVのIplImageへ変換する方法?
質問
私はSDL_Surface
を取るプログラムを書くためにしようとしている、IplImage
に変換し、ブロブを見つけることcvBlobsLibを使用して、戻って画像の上にスポットとしてブロブを描いて、それから戻っIplImage
に出力SDL_Surface
に変換します。
私はほぼ完了です:だけまだ行われていないIplImage
に戻す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」を出力し、完全に赤の画像を表示します。 私はがのソリューションは、24ビット(チャネルあたり1バイト)に私の8ビット画像に変換することですが、私はそれを行う方法がわからないと思います。任意のアイデア?
解決
[OK]を、私はそれが働いてしまった!
3チャンネルの画像では、画素は24ビットを有するように、私は8つの手段のOpenCVの深さという事実によって混乱したと思う画素は、チャンネル当たり8ビットを有します。深さの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;
混乱のため申し訳ありませんが、私はこれは誰もが同じ答えを探しに役立ちます願っています。
その他のリンク:
の<のhref = "http://www.libsdl.org/cgi/ docwiki.cgi / Pixel_Access」のrel = "noreferrer"> http://www.libsdl.org/cgi/docwiki.cgi/Pixel_Access の
そして、完全なサブルーチンで:
の<のhref = "http://paster.dazjorz.com/?p=3714" REL = "noreferrer"> 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;
}