opencv iplimage를 sdl_surface로 변환하는 방법은 무엇입니까?
문제
나는 프로그램을 작성하려고합니다 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;
}