2012-05-30 75 views
3

我使用以下代碼片段創建虛擬YUV420圖像。我想使用Y,U和V組件創建RGB格式的相同圖像的副本。YUV420到RGB轉換不給相同的圖像?

我把YUV上的Wiki條目轉換成了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 | B;

Qt具有qRgb和qRgba函數。您應該使用它們而不是自己編寫宏。

char R = clamp(compY + 1.402 *(compV-128));

在C++炭通常簽署,並存儲在範圍[-128..127]衣被合計。所以如果你從任何正的char值減去128,你會得到負數。這可能不是你想要的。

Innstead of char use quint8unsigned char or uint8_t

1

首先,什麼是img?它本身可能是有缺陷的,它可能會以錯誤的方式放置數據。它可能會以相反的順序(B < < 16)或零個alpha位預期R,G,B值。

另一件事是,R,G, B是8位值,你正在改變他們太多。你應該這樣做:

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

對不起,img是一個QImage實例,採用RGB32格式(ARGB) –

+0

Qt具有qRgb和qRgba函數。您應該使用它們而不是自己編寫宏。 – SigTerm

1

什麼是我在char compY=x+y+i*3; 什麼是您的YUV420圖片的FourCC代碼。只有YUV420,我們無法知道圖片是packed formats or planar formats

+0

「i」是一個遞增的整數。我使用這個代碼來生成樣本視頻。「i」在幀之間進行轉換。 –

+0

@AshikaUmangaUmagiliya哦,沒有。讓我們再看看 – RolandXu