|
웹캠에서 데이타를 받았는데 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;
|