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
[52765] Re:캠에서 받은 RAW(yuy2 ) 이미지를 bmp로 전환시 깨짐 현상
방태윤 [nabty] 4910 읽음    2008-03-18 22:06
웹캠에서 데이타를 받았는데 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;

+ -

관련 글 리스트
52751 캠에서 받은 RAW(yuy2 ) 이미지를 bmp로 전환시 깨짐 현상 mister 1550 2008/03/18
52765     Re:캠에서 받은 RAW(yuy2 ) 이미지를 bmp로 전환시 깨짐 현상 방태윤 4910 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 2207 2008/03/18
59295             Re:Re:Re:캠에서 받은 RAW(yuy2 ) 이미지를 bmp로 전환시 깨짐 현상 나그네 2137 2009/12/02
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.