質問

私は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;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top