品果视频美肤引擎iOS版
品果视频美肤引擎(PGSkinPrettifyEngine)的总体使用步骤分为四个部分:
以下对这四个部分分别进行详细的介绍。
/**
* 描述:初始化引擎
* 参数:pKey,字符串
* 返回值:成功返回 YES,失败或已经初始化过返回 NO
* 参数:无
*/
- (BOOL) InitEngineWithKey:(NSString*) pKey;
此接口会初始化引擎必须的所有组件,包括创建 OpenGL ES 上下文及各种缓冲区等等。
// 创建美肤引擎对象
PGSkinPrettifyEngine* m_pPGSkinPrettifyEngine = [[PGSkinPrettifyEngine alloc] init];
// 初始化美肤引擎
NSString *pKey = @"KDpbdC/aXRvikWVkD1bT6FB/+dCAFt67nHDFut3P+q+c8YeFVh79PWntsGq0JfVGXLHaODWjq+n2h9EgX4FRw4oHuq6GiuV6LL3p0/55rJ9uWBRV+P/Uo5XJuNWz7CEdl6Ebs9CiCFaghqxgfvswFkpt+ah1C427XLs7PQGcaM0=";
[m_pPGSkinPrettifyEngine InitEngineWithKey:pKey];
/**
* 描述:设置输入帧
* 返回值:无
* 参数:pInputPixel - 相机回调所给的预览帧,sFaceRect - 帧所对应的人脸信息,用于人形虚化及基准肤色计算,若没有人脸则置为(0,0,0,0),此时会对全图进行美肤,并关闭人形虚化
*/
- (void) SetInputFrameByCVImage:(CVPixelBufferRef)pInputPixel FaceRect:(CGRect)sFaceRect;
/**
* 描述:设置一个方向,用于校正输入的预览帧
* 返回值:无
* 参数:eAdjustInputOrient - 方向值
*/
- (void) SetOrientForAdjustInput:(PGOrientation)eAdjustInputOrient;
/**
* 描述:设置一个尺寸,用于调整输入帧的宽高,也是最终输出帧的宽高
* 返回值:无
* 参数:sSize - 宽和高
*/
- (void) SetSizeForAdjustInput:(CGSize)sSize;
/**
* 描述:设置美肤步骤中磨皮的强度
* 返回值:无
* 参数:iSoftenStrength - 磨皮强度,范围 0 - 100
*/
- (void) SetSkinSoftenStrength:(int)iSoftenStrength;
/**
* 描述:设置人形虚化的强度
* 返回值:无
* 参数:iBlurStrength - 虚化强度,范围 0 - 100,videoOrientation 当前相机的预览方向
*/
- (void) SetPortraitBlurStrength:(int)iBlurStrength VideoOrient:(AVCaptureVideoOrientation)videoOrientation;
/**
* 描述:设置美肤步骤中的肤色调整参数
* 返回值:无
* 参数:fPinking - 粉嫩程度, fWhitening - 白晰程度,fRedden - 红润程度,范围都是0.0 - 1.0
*/
- (void) SetSkinColor:(float)fPinking Whitening:(float)fWhitening Redden:(float)fRedden;
/**
* 描述:设置美肤结果的输出方向
* 返回值:无
* 参数:eOutputOrientation - 方向值
*/
- (void) SetOutputOrientation:(PGOrientation)eOutputOrientation;
/**
* 描述:设置美肤结果的输出方向
* 返回值:无
* 参数:eOutFormat - 输出的色彩格式
*/
- (void) SetOutputFormat:(PGPixelFormat)eOutFormat;
/**
* 描述:根据所设置的参数,运行引擎
* 返回值:成功返回 YES, 失败返回 NO
* 参数:无
*/
- (BOOL) RunEngine;
为了更细致和精确的美肤效果,所以在使用 SetInputFrameByCVImage 接口设置输入图像时,引擎需要使用当前输入帧中的人脸信息,iOS 系统本身有提供人脸框检测的功能,具体使用方法可参考完整 Demo 源码,也可以使用第三方人脸识别库进行识别,但需要转换为 iOS 系统所给的人脸坐标格式后再传给引擎。
引擎提供了两个用于调整方向的接口,SetOrientForAdjustInput 用于调整输入帧的方向,此接口会影响到 PGOglView 所显示的内容,及输出缓冲区中的内容。另外,由于坐标系原点的不同,输出缓冲区中的帧可能和显示的不一样,所以要想显示的和输出的一致,还需要使用 SetOutputOrientation 接口对输出缓冲区进行调整。这两个接口的参数类型为方向枚举,引擎目前提供了如下七个方向:
// 用于控制输出旋转方向的枚举
typedef enum
{
PGOrientationNormal = 0, // 原样输出
PGOrientationRightRotate90, // 右旋90度输出(注意改变输出宽高)
PGOrientationRightRotate180, // 右旋180度输出
PGOrientationRightRotate270, // 右旋270度输出(注意改变输出宽高)
PGOrientationFlippedMirrored, // 翻转并镜像输出
PGOrientationFlipped, // 上下翻转输出
PGOrientationMirrored // 左右镜像输出
} PGOrientation;
引擎目前支持3种输出格式,以方便后续的视频编码,分别为如下三种格式
// 用于控制输出帧数据格式的枚举
typedef enum
{
PGPixelFormatRGBA = 0, // 输出 kCVPixelFormatType_32BGRA 格式的 PixelBuffer, 内部数据为 RGBA
PGPixelFormatBGRA, // 输出 kCVPixelFormatType_32BGRA 格式的 PixelBuffer, 内部数据为 BGRA
PGPixelFormatYUV420 // 输出 kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange, 内部数据为 YUV420
} PGPixelFormat;
// 设置美肤引擎输出的帧宽高
[m_pPGSkinPrettifyEngine SetSizeForAdjustInput:CGSizeMake(size.width, size.height)];
// 将原始输入帧右旋(顺时针)90 度
[m_pPGSkinPrettifyEngine SetOrientForAdjustInput:PGOrientationRightRotate90];
// 设置美肤引擎的输出格式为BGRA
[m_pPGSkinPrettifyEngine SetOutputFormat:PGPixelFormatBGRA];
// 设置美肤引擎输出方向为翻转并镜像
[m_pPGSkinPrettifyEngine SetOutputOrientation:PGOrientationFlippedMirrored];
// 设置美肤强度为80
[m_pPGSkinPrettifyEngine SetSkinSoftenStrength:80];
// 设置背景模糊强度为80,此时需要同时告诉引擎目前的视频相机方向,用于引擎修正人脸坐标
[m_pPGSkinPrettifyEngine SetPortraitBlurStrength:80 VideoOrient:AVCaptureVideoOrientationLandscapeLeft];
// 设置输入图像,以及图像上的人脸信息
[m_pPGSkinPrettifyEngine SetInputFrameByCVImage:imageBuffer FaceRect:m_sOrigFaceRect];
// 启用肤色红润效果
[m_pPGSkinPrettifyEngine SetSkinColor:0.5 Whitening:0.5 Redden:0.5];
// 运行引擎,进行美肤处理
[m_pPGSkinPrettifyEngine RunEngine];
/**
* 描述:设置美肤结果的输出回调
* 返回值:无
* 参数:outputCallback - 委托
*/
- (void) SetSkinPrettifyResultDelegate:(id <PGSkinPrettifyDelegate>)outputCallback;
/**
* 描述:主动获取美肤结果
* 返回值:无
* 参数:pResultBuffer - 指向 CVPixelBufferRef 的指针
*/
- (void) GetSkinPrettifyResult:(CVPixelBufferRef *)pResultBuffer;
/**
* 描述:创建一个预览美肤效果的 View ,返回的 View 会在 DestroyEngine 时销毁,不需要外部销毁
* 返回值:所创建的 PGOglView 指针
* 参数:View 的尺寸
*/
- (PGOglView *) PGOglViewCreateWithFrame:(CGRect)sFrame;
/**
* 描述:将美肤结果刷新到 PGOglView
* 返回值:成功返回 YES,引擎未初始化,或 View 未成功创建返回 NO
* 参数:View 的尺寸
*/
- (BOOL) PGOglViewPresent;
/**
* 描述:将显示内容左右镜像
* 返回值:无
* 参数:无
*/
- (void) PGOglViewMirrored;
/**
* 描述:外部更改了 PGOglView 的 Size 后通过调用此方法通知引擎更新 PGOglView 相关的组件
* 返回值:无
* 参数:无
*/
- (void) PGOglViewSizeChanged;
/**
* 描述:设置一个矩阵用于调整输入帧,使用此方法意味着将输入的预处理变换操作交由调用者控制,调用此方法后会影响SetOrientForAdjustInput产生的设置
* 返回值:无
* 参数:pMatrix - MVP矩阵
*/
- (void) SetMatrixForAdjustInput:(float *)pMatrix;
/**
* 描述:设置一个矩阵用于调节输出,使用此方法意味着将输出的变换操作交由调用者控制,调用此方法后会影响SetOutputOrientation产生的设置
* 返回值:无
* 参数:pMatrix - MVP矩阵
*/
- (void) SetMatrixForAdjustOutput:(float *)pMatrix;
/**
* 描述:设置一个矩阵用于控制显示画面的变换
* 返回值:成功返回 YES
* 参数:pMatrix - MVP矩阵
*/
- (BOOL) PGOglViewSetMVPMatrix:(float *)pMatrix;
引擎提供了两种获取美肤输出的方式,一种是通过 SetSkinPrettifyResultDelegate 接口设置一个回调,当引擎完成了一帧美肤后,会调用所设置的回调,传入美肤结果。另一种是通过 GetSkinPrettifyResult 主动获取美肤结果缓冲区,此缓冲区的具体格式通过 SetOutputFormat 接口设置,外部无需释放所返回的缓冲区,引擎会自行管理。
预览美肤的方式也有两种,一种是通过引擎提供的 PGOglViewCreateWithFrame 接口创建一个 UIView ,并添加到 App 的 View 层级中,当有美肤结果后,调用 PGOglViewPresent 可将美肤结果呈现到 View 中,外部也无需释放此 View,引擎会自行管理。另一种方式是,通过 4.2.1 中的方式获取到缓冲区,然后开发者自行将此缓冲区显示出来。
CVPixelBufferRef pResultBuffer;
// 主动获取输出结果
[m_pPGSkinPrettifyEngine GetSkinPrettifyResult:&pResultBuffer];
// 设置美肤引擎的输出回调
[m_pPGSkinPrettifyEngine SetSkinPrettifyResultDelegate:self];
// 将美肤结果呈现到 PGOglView
[m_pPGSkinPrettifyEngine PGOglViewPresent];
/**
* 描述:销毁引擎
* 返回值:无
* 参数:无
*/
- (void) DestroyEngine;
销毁引擎时,会释放和删除引擎所创建一切组件,包括各种缓冲区,以及预览 View,所以销毁引擎后,不应该再对这些对象进行任何操作。
// 销毁美肤引擎
[m_pPGSkinPrettifyEngine DestroyEngine];