6

SDL_Surfaceを取り、それを に変換しIplImage、cvBlobsLib を使用してブロブを見つけ、ブロブを画像上のスポットとしてペイントし、出力IplImageを に戻すプログラムを作成しようとしていSDL_Surfaceます。

私はほぼ完了しています: IplImageback を 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 バイト) に変換することで解決できると思いますが、その方法がわかりません。何か案は?

4

2 に答える 2

11

わかりました、うまくいきました!

OpenCV の深さが 8 であるということは、1 つのピクセルが 1 チャネルあたり 8 ビットであることを意味するため、3 チャネルの画像では 1 つのピクセルが 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

初めまして:ありがとうございます!!

2 番目: 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 に答える