C 格式转换
在OpenGL ES 2.0中读取帧缓冲区并将其转换为RGBA帧后。我想把它转换成YUV格式 我试过用这个。忽略α分量。当我这样做,看到YUV帧产生了扭曲 有人能帮我吗C 格式转换,c,opengl-es,opengl-es-2.0,yuv,rgba,C,Opengl Es,Opengl Es 2.0,Yuv,Rgba,在OpenGL ES 2.0中读取帧缓冲区并将其转换为RGBA帧后。我想把它转换成YUV格式 我试过用这个。忽略α分量。当我这样做,看到YUV帧产生了扭曲 有人能帮我吗 yuvdata[i * j *1]= (0.257)*memory[i*j*1] + (0.504)*memory[i*j*2]+(0.098)*memory[i*j*3]+16; yuvdata[i * j *3]= (0.439)*memory[i*j*1] - (0.368)*memory[i*j*2] -(0.071)*
yuvdata[i * j *1]= (0.257)*memory[i*j*1] + (0.504)*memory[i*j*2]+(0.098)*memory[i*j*3]+16;
yuvdata[i * j *3]= (0.439)*memory[i*j*1] - (0.368)*memory[i*j*2] -(0.071)*memory[i*j*3]+128;
yuvdata[i * j *2]= -(0.148)*memory[i*j*1] - (0.291)*memory[i*j*2] +(0.439)*memory[i*j*3]+128;
`
正常化无济于事
存储器存储器rgba
yuv是存储yuv的自由空间
我使用rgb到yuv的转换忽略了alpha组件
朋友们,这个问题已经解决了。这篇文章太棒了。多亏了Viktor Latypov和MārtiņšMožeiko您确定正确访问了内存阵列吗?是不是应该是这样的:
R=memory[(i*width + j)*4+0]
G=memory[(i*width + j)*4+1]
B=memory[(i*width + j)*4+3]
如果您有BGRA,也可以将0与3交换。“YUV”不是完整的格式
从中可以获得YUV411、YUV422、YUV420p到YUV444的转换。将这些变换的逆运算与RGB转换相结合,就可以得到结果
您缺少的是:一个RGB三元组可以通过这种方式生成多个(而不是一个)YUV组件
// Extract YUV components
u = yuv[0];
y1 = yuv[1];
y2 = yuv[2];
v = yuv[3];
y3 = yuv[4];
y4 = yuv[5];
rgb1 = Y'UV444toRGB888(y1, u, v);
rgb2 = Y'UV444toRGB888(y2, u, v);
rgb3 = Y'UV444toRGB888(y3, u, v);
rgb4 = Y'UV444toRGB888(y4, u, v);
与420p类似,但YUV值分布在矩形上-请参见Wikipedia的图表和图像
基本上,您应该获取4个RGB像素,将每个像素转换为YUV(使用您希望有效的444转换器),然后以维基百科上显示的微妙方式存储YUV[4]数组。有YUV420p、YUV411、YUV422和YUV444。在应用矩阵之前,前三个必须转换为YUV444。您想要使用的确切YUV格式是什么?@ViktorLatypov:如何将YUV420p YUV411和YUv422转换为YUV444?我只是拿RGB,用上面的公式转换。它必须提供一致的YUV格式。如果我是,请纠正我wrong@Martin我将访问的内存更改为+0+1+3,但结果相同..结果不可能相同@马丁斯谢谢你。我错了这样做之后,我的问题是数据类型。我解决了。再次感谢您在我的案例中,我将RGB组件转换为YUV444。现在我转换成YUV 420。这个答案对我帮助很大:)