关于GPUimage的介绍请看这里GPUImage:滤镜、美颜、视频流处理

美颜只是不同滤镜组合起来的效果,实际上美颜也是一种滤镜,它的需求较多,于是自称一派。


GPUImageBeautifyFilter

/*
GPUImageBeautifyFilter是基于GPUImage的实时美颜滤镜中的美颜滤镜,包括GPUImageBilateralFilter、GPUImageCannyEdgeDetectionFilter、GPUImageCombinationFilter、GPUImageHSBFilter。
*/

在GPUImageBeautifyFilter.h中有:分别创建对应上面的对象

#import "GPUImage.h"@class GPUImageCombinationFilter;@interface GPUImageBeautifyFilter : GPUImageFilterGroup {GPUImageBilateralFilter *bilateralFilter;GPUImageCannyEdgeDetectionFilter *cannyEdgeFilter;GPUImageCombinationFilter *combinationFilter;GPUImageHSBFilter *hsbFilter;
}@end

绘制流程分为:

  1. 准备纹理
  2. 绘制纹理
  3. 显示处理后的纹理

一、 准备纹理:这里用到的类
[GPUImageVideoCamera] -
[GPUImageBeautifyFilter] -
[GPUImageBilateralFliter] -
[GPUImageCombinationFilter] -
[GPUImageCannyEdgeDetectionFilter] -

准备 过程:

第一个纹理
1、GPUImageVideoCamera捕获摄像头图像
调用newFrameReadyAtTime: atIndex:通知GPUImageBeautifyFilter;
2、GPUImageBeautifyFilter调用newFrameReadyAtTime: atIndex:
通知GPUImageBilateralFliter输入纹理已经准备好;
第二个纹理:
3、GPUImageBilateralFliter 绘制图像后,
informTargetsAboutNewFrameAtTime(),
调用setInputFramebufferForTarget: atIndex:
把绘制的图像设置为GPUImageCombinationFilter输入纹理,
并通知GPUImageCombinationFilter纹理已经绘制完毕;
4、GPUImageBeautifyFilter调用newFrameReadyAtTime: atIndex:
通知 GPUImageCannyEdgeDetectionFilter输入纹理已经准备好;
第三个纹理:
5、同3,GPUImageCannyEdgeDetectionFilter 绘制图像后,
把图像设置为GPUImageCombinationFilter输入纹理;
6、GPUImageBeautifyFilter调用newFrameReadyAtTime: atIndex:
通知 GPUImageCombinationFilter输入纹理已经准备好;

原文:http://blog.sina.com.cn/s/blog_61bc01360102wpl2.html

二、绘制纹理:

7、判断纹理数量
GPUImageCombinationFilter判断是否有三个纹理,三个纹理都已经准备好后
调用GPUImageThreeInputFilter的绘制函数renderToTextureWithVertices: textureCoordinates:,
图像绘制完后,把图像设置为GPUImageHSBFilter的输入纹理,
通知GPUImageHSBFilter纹理已经绘制完毕;
8、绘制纹理
GPUImageHSBFilter调用renderToTextureWithVertices:
textureCoordinates:绘制图像,
完成后把图像设置为GPUImageView的输入纹理,并通知GPUImageView输入纹理已经绘制完毕;

显示纹理

9、GPUImageView把输入纹理绘制到自己的帧缓存,然后通过
[self.context presentRenderbuffer:GL_RENDERBUFFER];显示到UIView上。

GPUImageBeautifyFilter.m文件是这样的

//
//  GPUImageBeautifyFilter.m
//  BeautifyFaceDemo
//
//  Created by guikz on 16/4/28.
//  Copyright © 2016年 guikz. All rights reserved.
//#import "GPUImageBeautifyFilter.h"// Internal CombinationFilter(It should not be used outside)
@interface GPUImageCombinationFilter : GPUImageThreeInputFilter
{GLint smoothDegreeUniform;
}@property (nonatomic, assign) CGFloat intensity;@endNSString *const kGPUImageBeautifyFragmentShaderString = SHADER_STRING
(varying highp vec2 textureCoordinate;varying highp vec2 textureCoordinate2;varying highp vec2 textureCoordinate3;uniform sampler2D inputImageTexture;uniform sampler2D inputImageTexture2;uniform sampler2D inputImageTexture3;uniform mediump float smoothDegree;void main(){highp vec4 bilateral = texture2D(inputImageTexture, textureCoordinate);highp vec4 canny = texture2D(inputImageTexture2, textureCoordinate2);highp vec4 origin = texture2D(inputImageTexture3,textureCoordinate3);highp vec4 smooth;lowp float r = origin.r;lowp float g = origin.g;lowp float b = origin.b;if (canny.r < 0.2 && r > 0.3725 && g > 0.1568 && b > 0.0784 && r > b && (max(max(r, g), b) - min(min(r, g), b)) > 0.0588 && abs(r-g) > 0.0588) {smooth = (1.0 - smoothDegree) * (origin - bilateral) + bilateral;}else {smooth = origin;}smooth.r = log(1.0 + 0.2 * smooth.r)/log(1.2);smooth.g = log(1.0 + 0.2 * smooth.g)/log(1.2);smooth.b = log(1.0 + 0.2 * smooth.b)/log(1.2);gl_FragColor = smooth;});@implementation GPUImageCombinationFilter- (id)init {if (self = [super initWithFragmentShaderFromString:kGPUImageBeautifyFragmentShaderString]) {smoothDegreeUniform = [filterProgram uniformIndex:@"smoothDegree"];}self.intensity = 0.5;return self;
}- (void)setIntensity:(CGFloat)intensity {_intensity = intensity;[self setFloat:intensity forUniform:smoothDegreeUniform program:filterProgram];
}@end@implementation GPUImageBeautifyFilter- (id)init;
{if (!(self = [super init])){return nil;}// First pass: face smoothing filterbilateralFilter = [[GPUImageBilateralFilter alloc] init];bilateralFilter.distanceNormalizationFactor = 4.0;[self addFilter:bilateralFilter];// Second pass: edge detectioncannyEdgeFilter = [[GPUImageCannyEdgeDetectionFilter alloc] init];[self addFilter:cannyEdgeFilter];// Third pass: combination bilateral, edge detection and origincombinationFilter = [[GPUImageCombinationFilter alloc] init];[self addFilter:combinationFilter];// Adjust HSBhsbFilter = [[GPUImageHSBFilter alloc] init];[hsbFilter adjustBrightness:1.1];[hsbFilter adjustSaturation:1.1];[bilateralFilter addTarget:combinationFilter];[cannyEdgeFilter addTarget:combinationFilter];[combinationFilter addTarget:hsbFilter];self.initialFilters = [NSArray arrayWithObjects:bilateralFilter,cannyEdgeFilter,combinationFilter,nil];self.terminalFilter = hsbFilter;return self;
}#pragma mark 绘制第一个纹理- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex;
{for (GPUImageOutput<GPUImageInput> *currentFilter in self.initialFilters){if (currentFilter != self.inputFilterToIgnoreForUpdates){if (currentFilter == combinationFilter) {textureIndex = 2;}[currentFilter newFrameReadyAtTime:frameTime atIndex:textureIndex];}}
}- (void)setInputFramebuffer:(GPUImageFramebuffer *)newInputFramebuffer atIndex:(NSInteger)textureIndex;
{for (GPUImageOutput<GPUImageInput> *currentFilter in self.initialFilters){if (currentFilter == combinationFilter) {textureIndex = 2;}[currentFilter setInputFramebuffer:newInputFramebuffer atIndex:textureIndex];}
}@end

GPUImage--美颜滤镜GPUImageBeautifyFilter相关推荐

  1. GPUImage美颜视频录制

    工作太忙,偷闲分享一个我刚做的一个录制视频工具类,基于GPUImage的带美颜功能的工具,简单易用! 完整录制播放代码链接:https://github.com/SunshineTraveller/L ...

  2. GPUImage美颜实现

    GPUImageBeautifyFilter.h文件中 #import <GPUImage/GPUImage.h> @class GPUImageCombinationFilter; @i ...

  3. iOS GPUImage之滤镜功能说明

    GPUImage 简介 GPUImage是一个非常牛逼的图像处理的开源库,里面提供了大概125种滤镜效果来加工图像,并且支持照相机和摄像机的实时滤镜,能够满足我们日常美颜/滤镜开效果.通过这样强大的开 ...

  4. android 美颜录像,Android 关于美颜/滤镜 利用PBO从OpenGL录制视频

    前言 上次我写了一遍文章<Android 关于美颜/滤镜 从OpenGl录制视频的一种方案>,里面利用ImageReader来从获取Surface上获取数据,但是经过@熊皮皮的提醒,我发现 ...

  5. 美颜滤镜sdk是什么?

    时下,大家在拍摄人像图片或者视频时都会使用滤镜进行润色,以此提高质感.当然,小编在这里所说的"滤镜"可不是很久之前那种套在相机镜头前的硬件滤镜,而是美颜滤镜sdk,目前已经有许多平 ...

  6. 美颜滤镜SDK有什么效果?美颜SDK可以自主开发吗?

    当下,短视频和直播平台在互联网娱乐APP类中保持着极高的人气,特别是在年轻群体中,甚至已经成了人手必备.如今的年轻人喜欢追求新鲜事物,审美能力也有所提高,对自己外表比较严格,特别是在短视频和直播这种社 ...

  7. OBS美颜滤镜插件,美白、瘦脸....

    分享一个美颜效果还不错的OBS美颜滤镜插件,亲测可以正常使用! 原文来自魔豆TV:OBS美颜插件,OBS美颜软件,美颜滤镜.瘦脸.瘦下巴 - 魔豆TVOBS美颜插件,OBS美颜软件,美颜滤镜.瘦脸.瘦 ...

  8. android 视频美颜代码,Android 关于美颜/滤镜 利用PBO从OpenGL录制视频

    前言 上次我写了一遍文章<Android 关于美颜/滤镜 从OpenGl录制视频的一种方案>,里面利用ImageReader来从获取Surface上获取数据,但是经过@熊皮皮的提醒,我发现 ...

  9. Android视频编辑器(三)给本地视频加水印和美颜滤镜

    前言          在上两篇文章中,我们分别实现了通过OpenGL预览.录制视频,以及在预览和录制的时候加上视频水印和美白效果,而作为一个视频编辑器,当然不仅仅是录制视频,也会有从本地选择视频,然 ...

最新文章

  1. python检查URL是否能正常访问
  2. 最近5年,诺贝尔化学奖都颁给了谁?
  3. jquery操作select(增加,删除,清空)
  4. tableau实战系列(三十九)-教你如何优雅的做图表展示-南丁格尔玫瑰图
  5. 如何使用lazyCSRF在Burp Suite上生成强大的CSRF PoC
  6. 线性表算法题库_数据结构与算法(线性表)练习题
  7. Hive动态分区 参数配置及语法
  8. 互联网、SaaS的技术挑战与机遇
  9. IOProcess基础知识
  10. 学java里面包括php_【学习java和PHP区别你知道多少】
  11. python正则表达式使用修饰符
  12. 刚嘲讽过iPhone 12,三星就打算“抄”了:取消赠送充电头和耳机?
  13. 有钱就是任性!阿里20亿美元拿下网易考拉:欢迎加入阿里动物园
  14. 用JAVA写出1到999的随性化数_请详细翻译一个简单的JAVA程序问题
  15. 拓端tecdat|R语言结合新冠疫情COVID-19对股票价格预测:ARIMA,KNN和神经网络时间序列分析
  16. svn提交报错Previous operation has not finished; run 'cleanup' if it was interrupted
  17. 布朗运动 1 | 基本概念与性质
  18. JAVAWEB-NOTE04
  19. 关于加油站GPS坐标所想到的解决办法
  20. 密码学系列之:blowfish对称密钥分组算法

热门文章

  1. PCB模块化设计13——FLASH、DDR和eMMC高速PCB布局布线设计规范
  2. yolov5目标框预测
  3. 2021珠海数据开放创新应用大赛今日启动 征集创意创新应用 争夺数据最强大脑
  4. Linux中rz和sz命令用法
  5. Unity3d地形反光
  6. 大型企业信息安全管理实践(05年第六期)
  7. Linux 清除历史操作命令
  8. 美团Q3财报解读:即时零售订单量50亿笔,变身本地超市?
  9. 古希腊神话故事:雅典娜的神像
  10. 什么是 DeGods NFT 系列?