OpenGL Shader 自动瘦脸与眼睛放大
图像局部扭曲算法有三个:局部缩放(Local Scaling)算法、局部平移(Local Transition)算法和局部旋转(Local Rotation)算法。其中应用局部缩放算法可实现眼睛放大,局部平移算法则可用于实现瘦脸效果。
precision highp float;varying highp vec2 textureCoordinate;uniform sampler2D inputImageTexture;uniform highp float scaleRatio;// 缩放系数,0无缩放,大于0则放大uniform highp float radius;// 缩放算法的作用域半径uniform highp vec2 leftEyeCenterPosition; // 左眼控制点,越远变形越小uniform highp vec2 rightEyeCenterPosition; // 右眼控制点uniform float aspectRatio; // 所处理图像的宽高比highp vec2 warpPositionToUse(vec2 centerPostion, vec2 currentPosition, float radius, float scaleRatio, float aspectRatio){vec2 positionToUse = currentPosition;vec2 currentPositionToUse = vec2(currentPosition.x, currentPosition.y * aspectRatio + 0.5 - 0.5 * aspectRatio);vec2 centerPostionToUse = vec2(centerPostion.x, centerPostion.y * aspectRatio + 0.5 - 0.5 * aspectRatio);float r = distance(currentPositionToUse, centerPostionToUse);if(r < radius){float alpha = 1.0 - scaleRatio * pow(r / radius - 1.0, 2.0);positionToUse = centerPostion + alpha * (currentPosition - centerPostion);}return positionToUse; }void main(){vec2 positionToUse = warpPositionToUse(leftEyeCenterPosition, textureCoordinate, radius, scaleRatio, aspectRatio);positionToUse = warpPositionToUse(rightEyeCenterPosition, positionToUse, radius, scaleRatio, aspectRatio);gl_FragColor = texture2D(inputImageTexture, positionToUse); }
图像局部平移算法
图像局部平移算法还是参见论文,多说无益,在此奉上对应Shader代码给需要的同学,可以实现瘦脸和肥脸。这里需要指定瘦脸的控制点,最多支持MAX_CONTOUR_POINT_COUNT个控制点。
precision highp float;varying highp vec2 textureCoordinate;uniform sampler2D inputImageTexture;uniform highp float radius;uniform highp float aspectRatio;uniform float leftContourPoints[MAX_CONTOUR_POINT_COUNT*2];uniform float rightContourPoints[MAX_CONTOUR_POINT_COUNT*2];uniform float deltaArray[MAX_CONTOUR_POINT_COUNT];uniform int arraySize;highp vec2 warpPositionToUse(vec2 currentPoint, vec2 contourPointA, vec2 contourPointB, float radius, float delta, float aspectRatio){vec2 positionToUse = currentPoint;vec2 currentPointToUse = vec2(currentPoint.x, currentPoint.y * aspectRatio + 0.5 - 0.5 * aspectRatio);vec2 contourPointAToUse = vec2(contourPointA.x, contourPointA.y * aspectRatio + 0.5 - 0.5 * aspectRatio);float r = distance(currentPointToUse, contourPointAToUse);if(r < radius){vec2 dir = normalize(contourPointB - contourPointA);float dist = radius * radius - r * r;float alpha = dist / (dist + (r-delta) * (r-delta));alpha = alpha * alpha;positionToUse = positionToUse - alpha * delta * dir;}return positionToUse;}void main(){vec2 positionToUse = textureCoordinate;for(int i = 0; i < arraySize; i++){positionToUse = warpPositionToUse(positionToUse, vec2(leftContourPoints[i * 2], leftContourPoints[i * 2 + 1]), vec2(rightContourPoints[i * 2], rightContourPoints[i * 2 + 1]), radius, deltaArray[i], aspectRatio);positionToUse = warpPositionToUse(positionToUse, vec2(rightContourPoints[i * 2], rightContourPoints[i * 2 + 1]), vec2(leftContourPoints[i * 2], leftContourPoints[i * 2 + 1]), radius, deltaArray[i], aspectRatio);}gl_FragColor = texture2D(inputImageTexture, positionToUse);}
OpenGL Shader 自动瘦脸与眼睛放大相关推荐
- 【Android】自动瘦脸与眼睛放大美颜算法
自动瘦脸与眼睛放大美颜算法 自动瘦脸与眼睛放大可以算作图像局部扭曲算法的一个应用,其参考文献可以追溯至1993年的一篇博士论文:Interactive Image Warping.这篇论文详细描述了算 ...
- 自动瘦脸与眼睛放大美颜算法[转载]
自动瘦脸与眼睛放大可以算作图像局部扭曲算法的一个应用,其参考文献可以追溯至1993年的一篇博士论文:Interactive Image Warping. 图像局部扭曲算法有三个:局部缩放(Local ...
- 自动瘦脸与眼睛放大美颜算法
http://www.shenyanhao.com/2015/09/眼睛放大美颜算法/ 转载于:https://www.cnblogs.com/guochen/p/8573021.html
- 谈谈自动瘦脸和自动眼睛放大算法
原地址:http://blog.csdn.net/celerychen2009/article/details/8839099 目前,手机上各种图片特效的软件应用App盛行,典型的如camare360 ...
- OpenGL ES 实现瘦脸大眼效果
该原创文章首发于微信公众号:字节流动 旧文中我们用 OpenGL 给小姐姐实现了瘦身和大长腿效果,结果小姐姐眯着眼睛.嘟着嘴说,我需要瘦身和大长腿效果吗? 笔者若有所思地看着她的眼睛和脸庞,终于弄明白 ...
- matlab瘦脸大眼的代码,OpenGL ES 实现瘦脸大眼效果
Hi 小姐姐,这是你要的大眼瘦脸效果? 该原创文章首发于微信公众号:字节流动 旧文中我们用 OpenGL 给小姐姐实现了瘦身和大长腿效果,结果小姐姐眯着眼睛.嘟着嘴说,我需要瘦身和大长腿效果吗? 笔者 ...
- 使用OpenGL Shader实现放大镜效果
使用OpenGL Shader实现放大镜效果 2014年3月16日renjihe发表评论阅读评论 周末闲来无事,想玩玩OpenGL Shader,想想就实现一个放大镜效果的Shader吧. 着色器可以 ...
- OpenGL.Shader:志哥教你写一个滤镜直播客户端:仿3个抖音滤镜效果(4镜像/电击/灵魂出窍)
OpenGL.Shader:志哥教你写一个滤镜直播客户端(可能是结束篇) OpenGL.Shader基本的图像处理知识已经学习的7788了,所以这篇应该是滤镜直播客户端的最后一篇了,之后会出基于FFm ...
- OpenGL shader normals法线贴图的实例
OpenGL shader normals法线贴图 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <glad/glad.h> #in ...
最新文章
- 研究生穿实验服满校追羊跑... 因为这是在追奔跑的毕业论文,哈哈哈!
- Lambda表达式很鸡肋?它到底有何用呢?
- bean validation校验方法参数_Spring Validation最佳实践及其实现原理,参数校验没那么简单!
- 使用recyclerView实现无限循环banner效果
- s时钟画布 android,Canvas画布实现自定义时钟效果
- 进击的爱奇艺文学:如何成为苹果园生态的重要一环?
- 高端的面试从来不会在HashMap的红黑树上纠缠太多
- php中如何使用html代码
- 基于Python的A-Priori算法发现购物篮关联规则
- 哪有什么太迟,世界多的是大器晚成
- Chrome 75 lazy-loading
- android edittext 输入手机号码格式变化
- 【黑马程序员西安中心】一个女程序猿的成长历程
- python面向对象OOP编程(三)-- 同类 不同实例 之间的关联关系
- 在 Node.js 应用中集成 Redis
- python猜单词游戏
- 光功率 博科交换机_华为交换机查看光功率的方法请大神指教
- 通用商业画布-0408-v1.0张雅慧
- 小明走格子 (10 分)(Java)
- linux dts 视频播放器,Linux DTS配置总结
热门文章
- c语言int2字节负数类型范围,c语言中int范围是多少?
- 提示:SQL Server 阻止了对组件'Ad Hoc Distributed Queries '的STATEMENT 'OpenRowset/OpenDatasource'...
- libsvm中svmtrain的参数
- t420i升级固态硬盘提升_雷克沙移动固态硬盘体验:给自己办公最大升级,数据读写速度飙升...
- 实时流处理Storm、Spark Streaming、Samza、Flink孰优孰劣
- 多台电脑共享打印机怎么设置?
- < 今日份知识点:Javascript本地存储的方式有哪些?区别及应用场景? >
- 52-jQuery删除节点相关方法
- 搭建nagios监控平台
- 社群营销——新的商业模式