答案是肯定的,这就要用到 shader 来实现 RGB 到 YUV 的图像格式转换。 glReadPixels 性能瓶颈一般出现在大分辨率图像的读取,在生产环境中通用的优化方法是在 shader 中将处理完成的 RGBA 转成 YUV (一般是 YUYV),然后基于 RGBA 的格式读出 YUV 图像,这样传输数据量会降低一半,性能提升明显,不用考虑兼容性问题。
vec3 yuv = rgb2yuv(col.rgb); col.rgb = yuv2rgb(yuv); } } fragColor = col; } N=10,只做 10 次 yuv 和 rgb 的来回转换,效果如下,这时肉眼已经无法区分颜色的误差。 N=4000,做 4000 次 yuv 和 rgb 的来回转换放大误差,效果如下,这时由于误差不断累计,出现了明显的偏色。不过,转换 4000 次这...
下面来做个试验,利用上面的公式,我们对一张图片反复做多次 rgb2yuv 和 yuv2rgb 转换,然后看下最终图像颜色的变化。 测试代码: #iChannel0"https://img-baofun.zhhainiao.com/pcwallpaper_ugc_mobile/static/2ddf8479959f1f3d9f52d0d561d281fe.jpg"vec3rgb2yuv(vec3 rgb){floaty =0.257* rgb.r +0.504...
2、读入YUV数据文件中的yuv数据: 关键代码如下: 2.1读文件代码 AI检测代码解析 unsigned char * readYUV(char *path) { FILE *fp; unsigned char * buffer; long size = 1280 * 720 * 3 / 2; if((fp=fopen(path,"rb"))==NULL) { printf("cant open the file"); exit(0); } buffer = new ...
w; else yuvColor.x = texture(texUYVY422, vTexCoord).y; yuvColor.y = texture(texUYVY422, vTexCoord).x; // color u yuvColor.z = texture(texUYVY422, vTexCoord).z; // color v vec3 rgbColor; yuvColor += offset; rgbColor = converter * yuvColor; FragColor = vec4(rgbColor, 1.0f...
GPU 实现 RGB -- YUV 转换 前言 RGB --> YUV 转换的公式是现成的,直接在 CPU 端转换的话,只需要遍历每个像素,得到新的 YUV 值,根据其内存分布规律,合理安排分布即可。然而在 CPU 端进行转换,存在的问题运行效率太低,无法满足高效转换的需求。我们将目光投向拥有流水线体系的支持高速浮点数计算的硬件——GPU....
2. 创建着色器 接下来,我们需要创建OpenGL的顶点着色器和片元着色器,以实现YUV到RGB的转换。 // 顶点着色器 const char* vertexShaderSource = """ #version 300 es layout(location = 0) in vec4 position; layout(location = 1) in vec2 texCoord; ...
上述代码中1.yuv就是YUV数据文件 3、将纹理传入 上述片段shader中就是根据yuv转rgb的公式得来的。也就是说是在shader中实现转换的。 3.1 顶点shader和片段shader代码 GLbyte vShaderStr[] = "attribute vec4 vPosition; \n" "attribute vec2 a_texCoord; \n" ...
RGB to YUV 的转换公式: RGB to YUV 的转换公式 开门见山,先贴实现 RGBA 转 YUV 的 shader 脚本: 代码语言:javascript 代码运行次数:0 复制Cloud Studio 代码运行 #version 300 es precision mediump float; in vec2 v_texCoord; layout(location = 0) out vec4 outColor; uniform sampler2D s_TextureMap...
在上面的代码中,我们创建了一个继承自QOpenGLWidget的YuvToRgbWidget类,并在其中实现了OpenGL的初始化、YUV纹理的加载以及绘制逻辑。需要注意的是,这里的YUV数据读取和纹理创建逻辑需要根据实际情况进行完善。 5. 测试并优化转换效果和性能 在实际应用中,你可能需要测试不同的YUV到RGB转换公式和算法,以找到最适合你应...