gpt4 book ai didi

c++ - YUV420 到 RGB 的转换没有给出相同的图像?

转载 作者:太空狗 更新时间:2023-10-29 21:26:41 25 4
gpt4 key购买 nike

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

我提到了关于 YUV 到 RGB 转换的 Wiki 条目,但它没有给出与 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);


}
}

最佳答案

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 代替 char

关于c++ - YUV420 到 RGB 的转换没有给出相同的图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10811386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com