YUV420转换为RGB后图片不一致?

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


             }
    }

你得到的东西与YUV有什么不同? - Roman R.
3个回答

1

char compY = x + y + i * 3; 中的 i 是什么意思? 你的 YUV420 图像的 FourCC 代码是什么?只有知道是 packed formats 还是 planar formats,我们才能确定图片格式。


"i" 是一个递增的整数。我正在使用这段代码生成示例视频。"i" 在帧之间进行过渡。 - Ashika Umanga Umagiliya

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++中char通常是带符号的,并且存储在范围[-128..127]内。因此,如果从任何正char值中减去128,则会得到负数。这可能不是您想要的。

请改用quint8unsigned charuint8_t


1
首先,什么是img?它本身可能存在故障,并且可能以错误的方式放置数据。它可能期望R、G、B值以相反的顺序(B << 16)或零alpha位。
另一件事是,RGB是8位值,而您将它们移动得太多了。您应该这样做:
int RGBval= (0xFF << 24) | ((unsigned int) R << 16) |  ((unsigned int) G << 8) | B;

抱歉,img是一个RGB32格式(ARGB)的QImage实例。 - Ashika Umanga Umagiliya
Qt有qRgb和qRgba函数。你应该使用它们而不是自己编写宏。 - SigTerm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接