3

我正在使用以下代码片段创建虚拟 YUV420 图像。我想使用 Y、U 和 V 组件以 RGB 格式创建相同图像的副本。

我提到了关于 YUV 到 RGB 转换的 Wiki 条目,但它没有给出与 YUV 相同的图像。有什么建议么 ?

编辑: img是 RGB32 格式 (ARGB) 的 QImage。

这是 YUV420 图像:在此处输入图像描述

这是 RGB 转换给出的:在此处输入图像描述

 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

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

另一件事是R, G,B是 8 位值,您将它们移动太多。你应该这样做:

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

我在什么里面char compY=x+y+i*3;你的 YUV420 图片的 FourCC 代码是什么。只有YUV420,我们无法知道图片是 打包格式还是平面格式

于 2012-05-30T08:04:27.063 回答
1

char compY=x+y+i*3;

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

整数 RGBval=0xFF<<24 | R<<16 | G<<8 | 乙;

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

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

在 C++ 中,char 通常是有符号的,并将值存储在 range 中[-128..127]。因此,如果您从任何正 char 值中减去 128,您将得到负数。这可能不是你想要的。

代替char使用quint8unsigned charuint8_t

于 2012-05-30T08:08:31.020 回答