C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[52767] Re:Re:캠에서 받은 RAW(yuy2 ) 이미지를 bmp로 전환시 깨짐 현상
mister [vsado] 3024 읽음    2008-03-19 08:41
방태윤 님이 쓰신 글 :
: 웹캠에서 데이타를 받았는데 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로 바꾸니 화면이 제대로 나오네요. 답변 감사 드립니다. ^^

+ -

관련 글 리스트
52751 캠에서 받은 RAW(yuy2 ) 이미지를 bmp로 전환시 깨짐 현상 mister 1550 2008/03/18
52765     Re:캠에서 받은 RAW(yuy2 ) 이미지를 bmp로 전환시 깨짐 현상 방태윤 4911 2008/03/18
52767         Re:Re:캠에서 받은 RAW(yuy2 ) 이미지를 bmp로 전환시 깨짐 현상 mister 3024 2008/03/19
52752     Re:캠에서 받은 RAW(yuy2 ) 이미지를 bmp로 전환시 깨짐 현상 cc1232 1851 2008/03/18
52755         Re:Re:캠에서 받은 RAW(yuy2 ) 이미지를 bmp로 전환시 깨짐 현상 mister 2208 2008/03/18
59295             Re:Re:Re:캠에서 받은 RAW(yuy2 ) 이미지를 bmp로 전환시 깨짐 현상 나그네 2138 2009/12/02
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.