YUV420到RGB转换不能给出相同的图像?

时间:2012-05-30 06:57:41

标签: c++ image-processing rgb color-scheme yuv

我正在使用以下代码片段创建虚拟YUV420图像。我想使用Y,U和V组件以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);


             }
    }

3 个答案:

答案 0 :(得分:1)

首先,img是什么?它本身可能有问题,可能是以错误的方式放置数据。它可能期望R,G,B值以相反的顺序(B <&lt; 16)或零alpha位。

另一件事是RGB是8位值,而你正在将它们转移得太多。你应该这样做:

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

答案 1 :(得分:1)

char compY=x+y+i*3中的我是什么; 什么是YUV420图片的FourCC代码。仅使用YUV420,我们无法知道图片是packed formats or planar formats

答案 2 :(得分:1)

  

char compY = x + y + i * 3;

您的图片宽度为359像素,您不会检查x或y是否在[0..255]范围内。该值可能会溢出并回绕。

  

int RGBval = 0xFF&lt;&lt; 24 | R&lt; 16 G <&lt; 8 | B;

Qt有qRgb和qRgba功能。您应该使用它们而不是自己编写宏。

  

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

在C ++中,char通常是签名,并将valus存储在范围[-128..127]中。因此,如果从任何正char值中减去128,您将获得负数。这可能不是你想要的。

Innstead of char使用quint8unsigned charuint8_t