- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用以下代码片段创建虚拟 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);
}
}
最佳答案
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,您将得到负数。这可能不是您想要的。
使用 quint8
、unsigned char
或 uint8_t
代替 char
。
关于c++ - YUV420 到 RGB 的转换没有给出相同的图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10811386/
例如,我有 4*4 图像。我想分别提取 Y、U 和 V 分量。如果图像是 YUV 422 ,YUV 420 和 YUV444 怎么办。我有兴趣了解数组的结构 Y、U 和 V 如何存储在 422,420
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
我无法理解两者之间的确切区别。从研究中,更多地讨论这两者是不同的,但似乎有一些人将它们归为“4 2 2”抽样方案。 YUV 422(I 和 J 版本):“具有一个亮度平面 Y 和 2 个色度平面 U、
我有 10 个 yuv 输入,每个 yuv 都是 WxH 的帧(ip0_WxH.yuv,ip1_WxH.yuv,...,ip9_WxH.yuv) 我需要连接所有 10 个以创建一个包含所有 10 个帧
我的目标是将我解码的帧写入文件中。我知道我捕捉得很好,因为它显示在我的 SDL 播放中,并且我随后对其进行编码,没有任何问题。但似乎我无法将框架正确写入文件。这是代码: #define PIXFMT
我用ffmpeg做HDR测试视频,我的做法是写一张图片,把图片转成yuv420p,然后用ffmpeg做HDR测试视频。 但我发现从 mp4 读取的 yuv 数据与原始输入不同.. 我在这里被困了一段时
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭 9 年前。 要求提供代码的问题必须表现出对所解决问题的最低限度的了解。包括尝试的解决方案、为什么它们
我一直在尝试用 C++ 将 YUYV 原始文件转换为 YUV420 原始文件。格式记录在 YUV Formats Page 中.转换后我的输出文件显示为绿色。我采用了来自 Experts Exchan
我正在尝试通过 python 使用 OpenCV 4.1.0 版将平面 YUV 4:2:0 图像转换为 RGB,并且正在努力了解如何格式化数组以传递给 cvtColor 功能。我将所有 3 个 cha
我正在编写一个医疗应用程序,其中有来自 IP 接口(interface)的数据包。其中对像素骨架解码有以下定义。我可以决定在主框架中选择什么来使用不同的像素算法。但我没有正确理解逻辑。 这三种格式是什
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 1年前关闭。 Improve thi
我得到 YUV 到 RGB 函数 1 和 2(来自堆栈溢出) 但是结果是这样的错误http://163.18.62.32/device.jpg 我不明白这一步有什么问题 我的设备是 Moto Mile
我正在使用opencv来实现对象跟踪。我读到 YUV 图像比 RGB 图像更好用。我的问题是,尽管我花了很多时间阅读笔记,但我还是无法理解 YUV 格式。 Y 是亮度,我认为它是根据 R、G、B 分量
我有高清1920x1080 YUV 格式视频。 我想将它们压缩到 640x480和其他转换为其他格式(mp4/avi..) 我使用了以下命令: ffmpeg -f rawvideo -pix_fmt
我正在使用 FFMPEG 从 MXF 视频中提取图像。我有兴趣使用 YUV(最好是 422)颜色空间提取 tiff 格式的图像。 MXF 视频属于 YUV 颜色空间。因此,为什么我想继续在那个色彩空间
我有一个 YUV 文件,我想以 BMP 文件的形式获取每一帧,该怎么做?我可以使用 FFMPEG 和 MPlayer。 最佳答案 您可以使用以下命令: ffmpeg -s widthxheight -
如何从 YUV 视频文件格式中获取信息?我需要了解有关流的信息(例如编解码器、位深度)。使用 ffplay 我可以播放 yuv 视频,但如何获取有关流的信息? 我尝试使用 ffprobe 但它不起作用
我试图将 C++ 程序中生成的数组中的原始 YUV 帧流式传输到使用 FFPEG 的视频。谁能指出我正确的方向? 最佳答案 要将管道 YUV420 平面帧流式传输到 RTMP,请尝试例如 ffmpeg
我有一个要实时流式传输到屏幕的 YUV 数据流(来自视频文件)。 (基本上,我想写一个实时播放视频的程序。) 因此,我正在寻找一种将 YUV 数据发送到屏幕的便携方式。理想情况下,我希望使用可移植的东
我已经通过用 Nvidia 的着色器语言编写的片段着色器实现了 YUV 到 RGB 的转换。 (Y、U 和 V 存储在单独的纹理中,这些纹理通过我的片段着色器中的多纹理组合而成)。它在 OpenGL
我是一名优秀的程序员,十分优秀!