2012-05-30 4 views
3

다음 코드 스 니펫을 사용하여 더미 YUV420 이미지를 생성합니다. Y, U 및 V 구성 요소를 사용하여 RGB 형식의 동일한 이미지 복사본을 만들려고합니다.YUV420에서 RGB로 변환해도 같은 이미지가 나오지 않습니까?

YUV에서 RGB로 변환시 위키 항목을 언급했지만 YUV와 같은 이미지를 제공하지 않습니다. 제안 사항이 있으십니까?

편집 :img은 RGB32 형식 (ARGB)의 QImage입니다.

이것은 YUV420 이미지 : enter image description here

이 무엇 RGB 변환주고있다 : 모든 enter image description here

int clamp(int val){ 
     if(val>255) return 255; 
     if(val<0) return 0; 
     return val; 
    } 

    ----- 
    int h=height; 
    int w=width; 
    for(y=0;y<h ;y++){ 
     for(x=0;x<w;x++){ 

       int hy=y/2; 
       int hx=x/2; 

       //Populate YUV420 image  
       char compY=x+y+i*3; //Y component 
       char compU=128+hy+(i)*2; //U component 
       char compV=64+hx+(i)*5; //V component 

       //encoder.setInputPicturePixelData(0,y* l0+x,compY); 
       //encoder.setInputPicturePixelData(1,hy*l1+hx,compU);         //encoder.setInputPicturePixelData(2,hy*l2+hx,compV); 
       //encoder.setInputPicturePixelData(2,hy*l2+hx,compV); 

       //Now create the RGB image 

       char R=clamp(compY+1.402*(compV-128)); 
       char G=clamp(compY-0.3444*(compU-128)-0.714*(compV-128)); 
       char B=clamp(compY+1.772*(compU-128)); 

       int RGBval=0xFF<<24 | R<<16 | G<<8 | B; 
       img->setPixel(x,y,RGBval); 


      } 
    } 
+0

그리고 당신이 얻는 것은 YUV와는 다른 ...? –

+0

@RomanR. 사진이 –

답변

1

char compY = x + y + i * 3;

이미지의 너비는 359 픽셀이며 x 또는 y가 [0..255] 범위 내에 있는지 확인하지 않아도됩니다. 이 값은 아마도 오버플로되고 랩 어라운드 될 것입니다.

int RGBval = 0xFF < < 24 | R < < 16 | G < < 8 | 비;

Qt는 qRgb 및 qRgba 기능을 갖는다. 직접 매크로를 작성하는 대신 이들을 사용해야합니다.

char R = clamp (compY + 1.402 * (compV-128)); C++에서 숯

일반적 서명되고, 저장 영역에 [-128..127] valus. 따라서 어떤 양의 char 값에서 128을 빼면 음수가됩니다. 아마 당신이 원하는 것이 아닙니다. char

Innstead는 quint8, unsigned char 또는 uint8_t 사용합니다.

1

첫째, img 무엇인가? 자체적으로 결함이있을 수 있으며 잘못된 방식으로 데이터를 넣을 수 있습니다. R, G, B 값이 반대 순서 (B < < 16)이거나 알파 비트가 0 일 것으로 예상 할 수 있습니다.

또 다른 점은 R, G, B이 8 비트 값이고 너무 많이 이동한다는 것입니다. 당신은 이것을 다음과 같이해야합니다 :

int RGBval= (0xFF << 24) | ((unsigned int) R << 16) | ((unsigned int) G << 8) | B; 
+0

을 추가했습니다. img는 RGB32 형식 (ARGB)의 QImage 인스턴스입니다. –

+0

Qt는 qRgb 및 qRgba 기능을 가지고 있습니다. 직접 매크로를 작성하는 대신 이들을 사용해야합니다. – SigTerm

1

나는 무엇을 char compY=x+y+i*3에 넣었습니까? 그리고 YCC420 그림에 대한 FourCC 코드는 무엇입니까? YUV420만으로는 그림이 무엇인지 알 수 없습니다. packed formats or planar formats

+0

"i"는 증가하는 정수입니다.이 코드를 사용하여 샘플 비디오를 생성합니다. "i"는 프레임 간을 전환합니다. –

+0

@AshikaUmangaUmagiliya 오, 안돼. 다시 보자. – RolandXu

관련 문제