扣丁书屋

Android 平台 Camera 实时滤镜实现方法探讨 -- 实时美颜滤镜

上一章完成了对图片的磨皮处理,经过简单算法流程优化,可以达到很快的速度,但是不能用于实时美颜。

经实验,若采用只处理Y信号的方案,半径极限大约是5-10,超过10则明显感受到卡顿,但对于1920X1080的预览分辨率来说,取10为半径很难得到理想效果。

即使将分辨率降低到1280X720也差强人意。所以很难简单的直接应用在移动端实时处理上。

另一方面,人物的正常肤,色应该是偏红,所以则会导致人物图像的红色通道偏亮,使红色通道保留的细节成分较少,相比之下,绿色通道保留更多细节,所以,一般情况下我们也可以只采用过滤绿色通道来实现实时磨皮。下面对思路简单介绍:

1.取出绿色通道,对绿色通道进行模糊处理,例如高斯模糊,得到模糊后的值sampleColor:

在顶点着色器中创建长度为20~25的数组,作为片段着色器需要取数据的点

        varying vec2 blurCoordinates[20];
    blurCoordinates[0] = inputTextureCoordinate.xy + singleStepOffset * vec2(0.0, -10.0);
        ....
    blurCoordinates[19] = inputTextureCoordinate.xy + singleStepOffset * vec2(4.0, -4.0);</span>

在片段着色器依次取出这些点的绿色通道值,乘以权重,最后除以总权重,得到模糊后的绿色通道值

2.用原图绿色通道值减去sampleColor,加上0.5(即128),1+2两个步骤即PS中的高反差保留:

   vec3 centralColor = texture2D(inputImageTexture, textureCoordinate).rgb;    
    float highpass = centralColor.g - sampleColor + 0.5;

3.对上述结果值进行3-5次强光处理(见第七章的“叠加”混合模式),此步骤可以使得噪声更加突出:

       if(color <= 0.5){
        color = color * color * 2.0;
    }else{
        color = 1.0 - ((1.0 - color)*(1.0 - color) * 2.0);
    }

经过1-3之后的图:

4.计算原图的灰度值,公式为0.299*R + 0.587*G + 0.114*B:

       const highp vec3 W = vec3(0.299,0.587,0.114);
       float lumance = dot(centralColor, W);

得到灰度图像:

5.将灰度值作为阈值,用来排除非皮肤部分,根据灰度值计算,将原图与1-3后的结果图合成:

 float alpha = pow(lumance, 0.333333);
    vec3 smoothColor = centralColor + (centralColor-vec3(highpass))*alpha*0.1;</span>

原图rgb值与高反差后的结果相比,噪声越大,两者相减后的结果越大,在原结果基础上加上一定值,来提高亮度,消除噪声。

pow函数中第二个参数可调(1/3~1),值越小,alpha越大,磨皮效果越明显,修改该值可作为美颜程度

6.对混合后结果增加亮度:

7.以灰度值作为透明度将原图与混合后结果进行滤色、柔光等混合,并调节饱和度:

原图与结果图:

上面用图片来举例子,剩下的就是打开摄像头切换到前置自己看效果了~

代码地址:https://github.com/wuhaoyu1990/MagicCamera

MagicCamera/MagicFilter/res/raw/目录下

beautify_fragment.glsl 与 beautify_vertex.glsl————————————————


https://mp.weixin.qq.com/s/gXF9cJsaivDE_McUNblX2Q

最多阅读

简化Android的UI开发 3年以前  |  515576次阅读
Android 深色模式适配原理分析 2年以前  |  27121次阅读
Android 样式系统 | 主题背景覆盖 2年以前  |  8471次阅读
Android Studio 生成so文件 及调用 2年以前  |  6380次阅读
30分钟搭建一个android的私有Maven仓库 3年以前  |  5216次阅读
Android设计与开发工作流 3年以前  |  4941次阅读
Google Enjarify:可代替dex2jar的dex反编译 3年以前  |  4796次阅读
移动端常见崩溃指标 2年以前  |  4709次阅读
Android内存异?;?用户空间)_NE 2年以前  |  4443次阅读
Android多渠道打包工具:apptools 3年以前  |  4399次阅读
Android-??榛?面向接口编程 2年以前  |  4392次阅读
Google Java编程风格规范(中文版) 3年以前  |  4277次阅读
Android死锁初探 2年以前  |  4182次阅读
Android UI基本技术点 3年以前  |  4083次阅读

手机扫码阅读
18禁止午夜福利体验区,人与动人物xxxx毛片人与狍,色男人窝网站聚色窝
<蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>