문제

나는 프로그램을 작성하려고합니다 SDL_Surface, 그것을 an로 변환합니다 IplImage, cvblobslib를 사용하여 얼룩을 찾아, 얼룩을 이미지 위에 다시 반점으로 칠한 다음 출력을 변환합니다. IplImage 다시 SDL_Surface.

나는 거의 끝났다 : 만 변환 IplImage 다시 SDL_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입니다.)

이 작업을 수행하는 방법을 설명하여 아무도 나를 도울 수 있습니까?

감사!

편집하다: 예를 들어, 이것은 내가 사용하려는 코드입니다.

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, pitch 1920"은 완전히 빨간색 이미지를 표시합니다. 나 생각한다 솔루션은 8 비트 이미지를 24 비트 (채널 당 1 바이트)로 변환하는 것이지만, 어떻게 해야하는지 모르겠습니다. 어떤 아이디어?

도움이 되었습니까?

해결책

좋아, 나는 그것을 작동시켰다!

나는 8의 OpenCV 깊이가 의미한다는 사실에 혼란 스러웠다 고 생각합니다. 픽셀에는 채널 당 8 비트가 있으므로 3 채널 이미지에서 픽셀에는 24 비트가 있습니다.. 그래서 그것을 깊이의 SDL 의미로 변환 할 때, 우리는 8 * 3 = 24 비트.

이미지는 결국 24 비트였으며 SDL은 지원합니다. 따라서 이미지를 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

다른 팁

우선 : 감사합니다 !!

둘째 : 3 개의 채널 이미지와 완벽하게 작동하지만 단일 채널-배수구를 표시하고 싶습니다.

그래서 우리는 간다 :

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