美颜sdk基础技术讲解、代码分析——人脸检测篇
创始人
2025-05-29 03:24:15
0

目前,短视频、直播一类app非常热门,美颜sdk的应用场景也愈发广泛。所谓“美颜”,简单解释下,就是通过视频(图片)技术对人脸进行美化。但是就“美化”这个词,却牵扯到众多深度学习、图像处理、图像学技术。下文小编将为大家讲解一下最为基础的美颜sdk技术和代码。

美颜sdk

一、人脸检测
美颜sdk中所用到的人脸检测技术指的是对视频中、图片中的人脸进行检测,并且准确定位人脸的位置。而人脸检测主要的技术难点在于,如何在特定光照条件,人脸姿态变化、人脸表情变化、遮挡等情况下,从视频或图片中检测出人脸。而人脸检测的发展时期也分为两个时期,一个是深度学习时期。在深度学习之前,人脸检测主要是套用人工设计好的特征,根据人工特征来训练检测器来检测人脸。但当深度学习在计算机视觉领域占据绝对主导地位之后,人们便开始尝试用深度神经网络来训练人脸检测模型。

美颜sdk

二、代码分析
#import “GPUImageCrosshairGenerator.h”

NSString *const kGPUImageCrosshairVertexShaderString = SHADER_STRING
(
attribute vec4 position;

uniform float crosshairWidth;

varying vec2 centerLocation;
varying float pointSpacing;

void main()
{
gl_Position = vec4(((position.xy * 2.0) - 1.0), 0.0, 1.0);
gl_PointSize = crosshairWidth + 1.0;
pointSpacing = 1.0 / crosshairWidth;
centerLocation = vec2(pointSpacing * ceil(crosshairWidth / 2.0), pointSpacing * ceil(crosshairWidth / 2.0));
}
);

#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE
NSString *const kGPUImageCrosshairFragmentShaderString = SHADER_STRING
(
uniform lowp vec3 crosshairColor;

varying highp vec2 centerLocation;
varying highp float pointSpacing;

void main()
{
lowp vec2 distanceFromCenter = abs(centerLocation - gl_PointCoord.xy);
lowp float axisTest = step(pointSpacing, gl_PointCoord.y) * step(distanceFromCenter.x, 0.09) + step(pointSpacing, gl_PointCoord.x) * step(distanceFromCenter.y, 0.09);

 gl_FragColor = vec4(crosshairColor * axisTest, axisTest);

// gl_FragColor = vec4(distanceFromCenterInX, distanceFromCenterInY, 0.0, 1.0);
}
);
#else
NSString *const kGPUImageCrosshairFragmentShaderString = SHADER_STRING
(
GPUImageEscapedHashIdentifier(version 120)\n

uniform vec3 crosshairColor;

varying vec2 centerLocation;
varying float pointSpacing;

void main()
{
vec2 distanceFromCenter = abs(centerLocation - gl_PointCoord.xy);
float axisTest = step(pointSpacing, gl_PointCoord.y) * step(distanceFromCenter.x, 0.09) + step(pointSpacing, gl_PointCoord.x) * step(distanceFromCenter.y, 0.09);

 gl_FragColor = vec4(crosshairColor * axisTest, axisTest);//     gl_FragColor = vec4(distanceFromCenterInX, distanceFromCenterInY, 0.0, 1.0);

}
);
#endif

@implementation GPUImageCrosshairGenerator

@synthesize crosshairWidth = _crosshairWidth;

#pragma mark -
#pragma mark Initialization and teardown

  • (id)init;
    {
    if (!(self = [super initWithVertexShaderFromString:kGPUImageCrosshairVertexShaderString fragmentShaderFromString:kGPUImageCrosshairFragmentShaderString]))
    {
    return nil;
    }

    runSynchronouslyOnVideoProcessingQueue(^{
    crosshairWidthUniform = [filterProgram uniformIndex:@“crosshairWidth”];
    crosshairColorUniform = [filterProgram uniformIndex:@“crosshairColor”];

      self.crosshairWidth = 5.0;[self setCrosshairColorRed:0.0 green:1.0 blue:0.0];
    

    });

    return self;
    }

#pragma mark -
#pragma mark Rendering

  • (void)renderCrosshairsFromArray:(GLfloat *)crosshairCoordinates count:(NSUInteger)numberOfCrosshairs frameTime:(CMTime)frameTime;
    {
    if (self.preventRendering)
    {
    return;
    }

    runSynchronouslyOnVideoProcessingQueue(^{
    [GPUImageContext setActiveShaderProgram:filterProgram];

#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE
#else
glEnable(GL_POINT_SPRITE);
glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
#endif

    outputFramebuffer = [[GPUImageContext sharedFramebufferCache] fetchFramebufferForSize:[self sizeOfFBO] textureOptions:self.outputTextureOptions onlyTexture:NO];[outputFramebuffer activateFramebuffer];glClearColor(0.0, 0.0, 0.0, 0.0);glClear(GL_COLOR_BUFFER_BIT);glVertexAttribPointer(filterPositionAttribute, 2, GL_FLOAT, 0, 0, crosshairCoordinates);glDrawArrays(GL_POINTS, 0, (GLsizei)numberOfCrosshairs);[self informTargetsAboutNewFrameAtTime:frameTime];
});

}

  • (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates;
    {
    // Prevent rendering of the frame by normal means
    }

#pragma mark -
#pragma mark Accessors

  • (void)setCrosshairWidth:(CGFloat)newValue;
    {
    _crosshairWidth = newValue;

    [self setFloat:_crosshairWidth forUniform:crosshairWidthUniform program:filterProgram];
    }

  • (void)setCrosshairColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent;
    {
    GPUVector3 crosshairColor = {redComponent, greenComponent, blueComponent};

    [self setVec3:crosshairColor forUniform:crosshairColorUniform program:filterProgram];
    }

@end

相关内容

热门资讯

【MapGIS精品教程】012... 文章目录 一、DEM概述二、DEM建立1. 创建规则格网Grid2. 创建不规则三角网Tin 三、数...
深度学习(21)——关于训练过... 深度学习(21)——关于训练过程中loss和acc固若磐石 1. 背景描...
【视频】当端午遇见“六一”,清... 当粽香四溢的端午佳节邂逅童趣满满的六一儿童节,一场别开生面的奇妙之旅即将在清远拉开帷幕!5月31日至...
以文旅为桨,向世界扬帆,202... 极目新闻记者 邬晓芳 通讯员 武旅信 5月29日,2025年武汉市导游大赛在洪山宾馆圆满落幕。本次大...
和姐妹去北京旅游五天四晚需要多... 北京,这座融合了古典与现代的城市,以其独特的风景吸引着世界各地的游客。长城蜿蜒起伏,如同巨龙般壮观;...
潮汕四天三晚旅游攻略,潮汕旅游... 潮汕四天三晚旅游攻略,潮汕旅游4天3晚 作为一个对各地美食和独特文化充满好奇的旅行者,我一直对潮汕这...
Python逆向及相关知识 今天第二次看见python字节码的逆向题,然后发现了一个介绍Python逆向的文章&#...
计算结构体大小-结构体内存对齐... 前言:内容包括:计算结构体大小的详解,修改默认对齐数&#x...
OpenCV 鼠标绘图 1、实验目标 (1)、鼠标当笔 (2)、函数:setMouseCallback() (3)、滑动调色...
【数据分析】ChatGPT可以... ChatGPT可以自动完成哪些数据科学领域的任务?1. 使用ChatGPT为机器学习模...
端午逢六一 避暑在黑河丨粽香游... 端午节作为中国四大传统节日之一,不仅是我国首个入选世界非遗的节日,更是集欢庆娱乐与特色饮食于一体的民...
赛里木湖:大西洋最后一滴眼泪,... 赛里木湖:大西洋最后一滴眼泪,邂逅蓝色梦幻之境 在广袤无垠的西北大地,天山山脉犹如一条巨龙横亘其中。...
暑假去黄山旅游五天四晚花多少钱... 黄山,这座被誉为“天下第一奇山”的名山,以其独特的奇松、怪石、云海、温泉四绝闻名于世,一直是无数旅行...
江西四日游自由行攻略,江西纯玩... 江西这片土地,有着深厚的历史文化底蕴,也有着如诗如画的自然风光。无论是巍峨的庐山,还是灵动的婺源,都...
和爸妈去黄山玩3天人均花多少钱... 黄山,这座被誉为“天下第一奇山”的名山,以其奇松、怪石、云海、温泉四绝闻名于世。一直以来,它都是我心...
潮汕旅游五日游费用,潮汕五天游... 潮汕旅游五日游费用,潮汕五天游怎样安排路线 作为一个对各地风土人情充满好奇的旅行者,潮汕这片充满神秘...
重庆5天游旅游跟团多少钱,重庆... 重庆5天游旅游跟团多少钱,重庆五日游最佳旅游路线攻略 作为一名热爱探索的旅行者,我一直对重庆这座充满...
宜昌三峡3天旅游攻略,宜昌三峡... 宜昌三峡3天旅游攻略,宜昌三峡纯玩3天人均花多少钱? 作为一名热爱自然风光的旅行爱好者,我一直对长江...
宜昌三峡3日游省钱攻略,这一篇... 宜昌三峡3日游省钱攻略,这一篇攻略够你玩转宜昌三峡! 一直对宜昌三峡的美景心心念念,那壮丽的三峡风光...