|
방태윤 님이 쓰신 글 :
: 웹캠에서 데이타를 받았는데 rgb 포멧이 아니라 yuv 라는 말씀인거 같습니다.,,.
:
: BITMAP 는 rgb 포멧을 사용하니까 당연이 안될겁니다.(자세이는 몰라요.^^)
:
: 일단 우리는 화면에 출력하려면 rgb 포멧이 있어야 하므로 yuv2 를 rgb 로 바꾸어야 할것 같습니다.
:
: 제 백업 하드를 찾아보니. ConvertYUY2toRGB24 가 잇네요, 오래된 소스군요... vfw 로 작업한거 같습니다.
:
: 지금 vfw 를 사용하시는 것 같은데요,,?. 그것도 좋치만,,, DirectShow 로 해보시길 권해드립니다...
:
: 암튼,,,그때 사용했던 소스입니다.제가 만든건 아니고 어디서 주워온겁니다.ㅋ
:
: raw 데이터(yuv)를 아래 방법으로 변환한후(rgb24) 출력해 보면 되지 않을까 슆습니다....
:
: 자세한 내용은 기억이 없으므로,,. 분석해 보시기 바랍니다.ㅋ,..
:
: 그럼...
:
:
: ps:아래 소스는 캡춰한 싸이즈 와 관연있는거 같으네요..
: 896 은 640(캡춰가로크기)+256 으로 나온거 같고,..암튼 캡춰한 사이즈랑 잘 역어서 해 보세요,^^
:
: 정 힘들면 질문한번 다시 주시고요.ㅋ...
:
:
:
: unsigned char clip[896];
:
: void InitClip(){
: memset(clip, 0, 320);
: for (int i=0; i<256; ++i) clip[i+320] = i;
: memset(clip+320+256, 255, 320);
: }
:
: inline unsigned char Clip(int x)
: { return clip[320 + ((x+0x8000) >> 16)]; }
:
: inline unsigned char Clip2(int x)
: { return clip[320 + x]; }
:
:
: //convert YUY2 to RGB24
: //R = 1.164(Y - 16) + 1.596(Cr - 128)
: //G = 1.164(Y - 16) - 0.813(Cr - 128) - 0.391(Cb - 128)
: //B = 1.164(Y - 16) + 2.018(Cb - 128)
: const long cy = int(1.164*65536+0.5);
: const long cu1 = int(1.596*65536+0.5);
: const int cu2 = int(-0.813*65536+0.5);
: const int cv1 = int(-0.391*65536+0.5);
: const int cv2 = int(2.018*65536+0.5);
:
: void ConvertYUY2toRGB24(const unsigned char* src, unsigned char* dst, int width, int height)
: {
: for (int row = 0; row < height; ++row) {
: const unsigned char* yuv = src + width * 2 * row;
: unsigned char* rgb;
: rgb = dst + width * 3 * (height-1-row);
:
: for (int col = 0; col < width; col += 2) {
: long y1=yuv[0];
: long y2=yuv[2];
: long v1=yuv[1];
: long u1=yuv[3];
: rgb[0]=Clip2((cy*(y1-16)>>16) + (cv2*(v1-128)>>16));
: rgb[1]=Clip2((cy*(y1-16)>>16) + (cu2*(u1-128)>>16) + (cv1*(v1-128)>>16));
: rgb[2]=Clip2((cy*(y1-16)>>16) + (cu1*(u1-128)>>16));
: rgb[3]=Clip2((cy*(y2-16)>>16) + (cv2*(v1-128)>>16));
: rgb[4]=Clip2((cy*(y2-16)>>16) + (cu2*(u1-128)>>16) + (cv1*(v1-128)>>16));
: rgb[5]=Clip2((cy*(y2-16)>>16) + (cu1*(u1-128)>>16));
: yuv += 4;
: rgb += 6;
: }
: }
: }
:
:
:
:
: mister 님이 쓰신 글 :
: : 캡쳐보드에서 YUY2 이미지를 받아서 bmp 포멧으로 바꿔 쓰려 합니다.
: : 비트맵 파일로 바꾸면 화면이 깨지네요.
: :
: : 소스는 다음과 같습니다.
: : 무엇이 문제인지 알려주십시요;;
: : //////////////////////////////////////////////////////////////////////////////////////////////////
: : // 콜백 함수 내용 입니다.
: : BITMAPFILEHEADER bmfh;
: : BITMAPINFOHEADER bmih;
: :
: : ZeroMemory(&bmfh, sizeof(bmfh));
: : ZeroMemory(&bmih, sizeof(bmih));
: :
: : bmfh.bfType = 0x4d42; // 'BM'
: : bmfh.bfSize = (sizeof(BITMAPFILEHEADER) - 2) + sizeof(BITMAPINFOHEADER) +
: : (sizeX * sizeY * 2); //360x240
: : bmfh.bfReserved1 = 0;
: : bmfh.bfReserved2 = 0;
: :
: : bmfh.bfOffBits = (sizeof(BITMAPFILEHEADER) - 2) + sizeof(BITMAPINFOHEADER) ;
: :
: : bmih.biSize=sizeof(BITMAPINFOHEADER);
: : bmih.biWidth=sizeX;
: : bmih.biHeight=sizeY;
: : bmih.biPlanes=1;
: : bmih.biBitCount=16;
: : bmih.biCompression=0;
: : bmih.biSizeImage=sizeX*sizeY*2;
: : bmih.biXPelsPerMeter=0;
: : bmih.biYPelsPerMeter=0;
: : bmih.biClrUsed=0;
: : bmih.biClrImportant=0;
: :
: : TMemoryStream *pMemoryStream = new TMemoryStream();
: : pMemoryStream->WriteBuffer(&bmfh, sizeof(BITMAPFILEHEADER) - 2);
: : pMemoryStream->WriteBuffer(&bmih, sizeof(bmih));
: : //pImage 이미지 소스
: : pMemoryStream->WriteBuffer((BYTE*) pImage, bmih.biSizeImage);
: : pMemoryStream->Position = 0;
: : Image1->Picture->Bitmap->LoadFromStream(pMemoryStream);
: :
: : delete pMemoryStream;
네 rgb24로 바꾸니 화면이 제대로 나오네요. 답변 감사 드립니다. ^^
|