3

I am creating dummy YUV420 image using following code-snippet.I want to create a copy of the same image in RGB format using the Y,U and V components.

I referred Wiki entry on YUV to RGB conversion but it doesnt give the same image as of YUV. Any suggestions ?

Edit : img is a QImage in RGB32 format (ARGB).

This is YUV420 image :enter image description here

This is what RGB conversion giving : 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);


             }
    }
4

3 に答える 3

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 =クランプ(compY + 1.402 *(compV-128));

C ++では、charは通常署名されており、値を範囲内に格納します[-128..127]。したがって、正のchar値から128を引くと、負の数になります。これはおそらくあなたが望むものではありません。

代わりcharquint8、、unsigned charまたはuint8_t

于 2012-05-30T08:08:31.020 に答える
1

まず第一に、何imgですか?それ自体が故障している可能性があり、データを間違った方法で配置している可能性があります。逆の順序 (B << 16) の R、G、B 値、またはゼロのアルファ ビットを期待している可能性があります。

もう1つのことは、、、Rが8ビット値でありGBそれらをシフトしすぎていることです。次のようにする必要があります。

int RGBval= (0xFF << 24) | ((unsigned int) R << 16) |  ((unsigned int) G << 8) | B;
于 2012-05-30T07:13:41.623 に答える
1

i は何ですかchar compY=x+y+i*3; YUV420画像のFourCCコードは何ですか。YUV420 だけでは、画像が パック形式なのか平面形式なのかわかりません。

于 2012-05-30T08:04:27.063 に答える