美颜sdk基础技术讲解、代码分析——人脸检测篇

目前,短视频、直播一类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

猜你喜欢

转载自blog.csdn.net/q2404274722/article/details/129591823