美文网首页
我的OpenGL ES学习之路(七):YUV转RGB 未完待续.

我的OpenGL ES学习之路(七):YUV转RGB 未完待续.

作者: o0阿拉斯加的狗0o | 来源:发表于2017-01-08 23:39 被阅读433次

    色彩的二次抽样

    在RGB颜色模式下,每个像素点由Red、Green、Blue三种颜色组合而成,YUV使用色彩通道UV亮度通道Y,这种格式更适合图像处理领域,图片的所有细节保存在亮度通道中,如果没有亮度,图片就是一张灰度图片,人的眼睛对亮度的敏感度要高于颜色,所以可以通过减少每个像素点的颜色值,达到效果比较好的压缩,这个减少颜色数据的过程就是色彩的二次抽样

    YUV转RGB绘制纹理

    纹理映射只能在RGBA方式下执行,摄像头采集YUV,需要把YUV转换成RGBA

    • 获取到视频帧的YUV数据
    • CoreVideo进行分离Y分量UV分量
    • Fragment Shader对Y分量UV分量进行采样
    • Fragment Shader转换YUVRGB
    • 进行渲染

    看一下BT.601的RGB到YUV的转换算法

    R' = 1.164*(Y’-16) + 1.596*(Cr'-128)
    
    G' = 1.164*(Y’-16) - 0.392*(Cb'-128) - 0.813*(Cr'-128) 
    
    B' = 1.164*(Y’-16) + 2.017*(Cb'-128)
    
    // 其中括号里面的是做伽马矫正用的
    

    所以我们的转换矩阵可以这样写

      mat3( 1.164,     1.164,     1.164,
              0.0,    -0.392,     2.017,
            1.596,    -0.813,       0.0,)
    

    Fragment Shader中的转换下面这样写

    varying highp vec2 texCoordVarying;
    precision mediump float;
    
    uniform sampler2D SamplerY;
    uniform sampler2D SamplerUV;
    uniform mat3 colorConversionMatrix;
    
    void main() {
        mediump vec3 yuv;
        lowp vec3 rgb;
        yuv.x = (texture2D(SamplerY, texCoordVarying).r);// - (16.0/255.0));
        yuv.yz = (texture2D(SamplerUV, texCoordVarying).ra - vec2(0.5, 0.5));
        
        rgb = colorConversionMatrix * yuv;
        gl_FragColor = vec4(rgb, 1);
    }
    

    相关文章

      网友评论

          本文标题:我的OpenGL ES学习之路(七):YUV转RGB 未完待续.

          本文链接:https://www.haomeiwen.com/subject/giaqbttx.html