图像局部扭曲算法有三个:局部缩放(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 自动瘦脸与眼睛放大相关推荐

  1. 【Android】自动瘦脸与眼睛放大美颜算法

    自动瘦脸与眼睛放大美颜算法 自动瘦脸与眼睛放大可以算作图像局部扭曲算法的一个应用,其参考文献可以追溯至1993年的一篇博士论文:Interactive Image Warping.这篇论文详细描述了算 ...

  2. 自动瘦脸与眼睛放大美颜算法[转载]

    自动瘦脸与眼睛放大可以算作图像局部扭曲算法的一个应用,其参考文献可以追溯至1993年的一篇博士论文:Interactive Image Warping. 图像局部扭曲算法有三个:局部缩放(Local ...

  3. 自动瘦脸与眼睛放大美颜算法

    http://www.shenyanhao.com/2015/09/眼睛放大美颜算法/ 转载于:https://www.cnblogs.com/guochen/p/8573021.html

  4. 谈谈自动瘦脸和自动眼睛放大算法

    原地址:http://blog.csdn.net/celerychen2009/article/details/8839099 目前,手机上各种图片特效的软件应用App盛行,典型的如camare360 ...

  5. OpenGL ES 实现瘦脸大眼效果

    该原创文章首发于微信公众号:字节流动 旧文中我们用 OpenGL 给小姐姐实现了瘦身和大长腿效果,结果小姐姐眯着眼睛.嘟着嘴说,我需要瘦身和大长腿效果吗? 笔者若有所思地看着她的眼睛和脸庞,终于弄明白 ...

  6. matlab瘦脸大眼的代码,OpenGL ES 实现瘦脸大眼效果

    Hi 小姐姐,这是你要的大眼瘦脸效果? 该原创文章首发于微信公众号:字节流动 旧文中我们用 OpenGL 给小姐姐实现了瘦身和大长腿效果,结果小姐姐眯着眼睛.嘟着嘴说,我需要瘦身和大长腿效果吗? 笔者 ...

  7. 使用OpenGL Shader实现放大镜效果

    使用OpenGL Shader实现放大镜效果 2014年3月16日renjihe发表评论阅读评论 周末闲来无事,想玩玩OpenGL Shader,想想就实现一个放大镜效果的Shader吧. 着色器可以 ...

  8. OpenGL.Shader:志哥教你写一个滤镜直播客户端:仿3个抖音滤镜效果(4镜像/电击/灵魂出窍)

    OpenGL.Shader:志哥教你写一个滤镜直播客户端(可能是结束篇) OpenGL.Shader基本的图像处理知识已经学习的7788了,所以这篇应该是滤镜直播客户端的最后一篇了,之后会出基于FFm ...

  9. OpenGL shader normals法线贴图的实例

    OpenGL shader normals法线贴图 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <glad/glad.h> #in ...

最新文章

  1. 研究生穿实验服满校追羊跑... 因为这是在追奔跑的毕业论文,哈哈哈!
  2. Lambda表达式很鸡肋?它到底有何用呢?
  3. bean validation校验方法参数_Spring Validation最佳实践及其实现原理,参数校验没那么简单!
  4. 使用recyclerView实现无限循环banner效果
  5. s时钟画布 android,Canvas画布实现自定义时钟效果
  6. 进击的爱奇艺文学:如何成为苹果园生态的重要一环?
  7. 高端的面试从来不会在HashMap的红黑树上纠缠太多
  8. php中如何使用html代码
  9. 基于Python的A-Priori算法发现购物篮关联规则
  10. 哪有什么太迟,世界多的是大器晚成
  11. Chrome 75 lazy-loading
  12. android edittext 输入手机号码格式变化
  13. 【黑马程序员西安中心】一个女程序猿的成长历程
  14. python面向对象OOP编程(三)-- 同类 不同实例 之间的关联关系
  15. 在 Node.js 应用中集成 Redis
  16. python猜单词游戏
  17. 光功率 博科交换机_华为交换机查看光功率的方法请大神指教
  18. 通用商业画布-0408-v1.0张雅慧
  19. 小明走格子 (10 分)(Java)
  20. linux dts 视频播放器,Linux DTS配置总结

热门文章

  1. c语言int2字节负数类型范围,c语言中int范围是多少?
  2. 提示:SQL Server 阻止了对组件'Ad Hoc Distributed Queries '的STATEMENT 'OpenRowset/OpenDatasource'...
  3. libsvm中svmtrain的参数
  4. t420i升级固态硬盘提升_雷克沙移动固态硬盘体验:给自己办公最大升级,数据读写速度飙升...
  5. 实时流处理Storm、Spark Streaming、Samza、Flink孰优孰劣
  6. 多台电脑共享打印机怎么设置?
  7. < 今日份知识点:Javascript本地存储的方式有哪些?区别及应用场景? >
  8. 52-jQuery删除节点相关方法
  9. 搭建nagios监控平台
  10. 社群营销——新的商业模式