人像分割是MNNKit提供的移动端AI解决方案SDK,在端上提供了实时的人像分割能力。
异步创建PortraitSegmentor实例,主线程中回调。
-
context:上下文环境
-
listener:创建完成后的回调
public static void createInstanceAsync (Context context, InstanceCreatedListener<PortraitSegmentor> listener)
通用数据的推理,支持多种数据格式输入。视频流检测场景中,可以使用摄像头的回调数据作为该接口的输入。
- data:输入的数据,如Camera回调的NV21数据
- width:数据宽
- height:数据高
- format:data的数据格式
- inAngle:输入角度,使输入图像顺时针旋转的角度,旋转后人像变为正向,请参考接入指南&Demo示例
- flipType:结果关键点镜像类型,目前只支持沿Y轴左右镜像(FLIP_Y),其他值设置无效
返回值是一个216*384的mask二维数组,数组中的每个值代表在人像区域的得分值,score(0.0~1.0)越大代表在人像区域内的概率越高。
上层可能需要对这个固定大小的mask以及原图做一些图像处理操作,来达到自己的目的,Demo中为演示调用API方便,使用了一种比较简单的方式实现了人像背景替换,实际运用中,不同的图像处理方案最终达到的效果也不同,这是应用开发者需要考虑的。
public synchronized float[] inference(byte[] data, int width, int height, MNNCVImageFormat format, int inAngle, MNNFlipType flipType)
人像分割API暂不支持outAngle,因为相对于耗时可忽略的关键点坐标变换,mask图变换会消耗较多的时间,考虑到大部分应用都支持手机竖屏的场景,暂时不支持mask图的角度变换。因此人像分割只适合在自动旋转关闭、手机竖屏的应用场景中使用。
Bitmap检测接口,除了输入数据为bitmap,其余参数和返回值含义一样。
public synchronized float[] inference(Bitmap bitmap, MNNFlipType flipType)
HandGestureDetector实例用完之后需要手动释放,否则会产生native的内存泄露。
public synchronized void release()
#####支持输入的数据格式
public enum MNNCVImageFormat {
RGBA(0),
RGB(1),
BGR(2),
GRAY(3),
BGRA(4),
YUV_NV21(11);
...
}
异步创建MNNPortraitSegmentor实例
- block:创建完成后的回调
- callbackQueue:指定回调的线程,如设置nil默认主线程中回调
+ (void)createInstanceAsync:(void(^)(NSError *error, MNNPortraitSegmentor *portraitSegmentor))block CallbackQueue:(dispatch_queue_t)callbackQueue;
默认主线程中回调,其他参数一样
+ (void)createInstanceAsync:(void(^)(NSError *error, MNNPortraitSegmentor *portraitSegmentor))block;
使用系统相机作为输入检测时可使用该接口
- pixelBuffer:输入数据,CVPixelBufferRef格式
- inAngle:输入角度,使输入图像顺时针旋转的角度,旋转后人脸变为正向,请参考接入指南&Demo示例
- outputFlipType:结果关键点镜像类型,目前只支持沿Y轴左右镜像(FLIP_Y),其他值设置无效
- error:错误信息,如果是nil代表推理成功
返回值是一个216*384的mask二维数组,数组中的每个值代表在人像区域的得分值,score(0.0~1.0)越大代表在人像区域内的概率越高。
上层可能需要对这个固定大小的mask以及原图做一些图像处理操作,来达到自己的目的,Demo中为演示调用API方便,使用了一种比较简单的方式实现了人像背景替换,实际运用中,不同的图像处理方案最终达到的效果也不同,这是应用开发者需要考虑的。
- (NSArray<NSNumber*> *)inference:(CVPixelBufferRef)pixelBuffer Angle:(float)inAngle FlipType:(MNNFlipType)outputFlipType error:(NSError *__autoreleasing *)error;
人像分割API暂不支持outAngle,因为相对于耗时可忽略的关键点坐标变换,mask图变换会消耗较多的时间,考虑到大部分应用都支持手机竖屏的场景,暂时不支持mask图的角度变换。因此人像分割只适合在自动旋转关闭、手机竖屏的应用场景中使用。
图片检测接口,除了输入数据为UIImage,其余参数一样。
- (NSArray<NSNumber*> *)inferenceImage:(UIImage*)image Angle:(float)inAngle FlipType:(MNNFlipType)outputFlipType error:(NSError *__autoreleasing *)error;
通用数据的推理接口
- data:输入数据,通用数据表示为unsigned char数组
- w:数据宽
- h:数据高
- format:data的数据格式
- inAngle:输入角度,使输入图像顺时针旋转的角度,旋转后人脸变为正向,请参考接入指南&Demo示例
- outputFlipType:结果关键点镜像类型,目前只支持沿Y轴左右镜像(FLIP_Y),其他值设置无效
- error:错误信息,如果是nil代表推理成功
返回值是一个216*384的mask二维数组,数组中的每个值代表在人像区域的得分值,score(0.0~1.0)越大代表在人像区域内的概率越高。
- (NSArray<NSNumber*> *)inference:(unsigned char*)data Width:(float)w Height:(float)h Format:(MNNCVImageFormat)format Angle:(float)inAngle FlipType:(MNNFlipType)outputFlipType error:(NSError *__autoreleasing *)error;
MNNPortraitSegmentor实例生命周期结束后会自动触发相关内存的释放,无需调用方手动释放
#####支持输入的数据格式
typedef NS_ENUM(NSUInteger, MNNCVImageFormat) {
RGBA = 0,
RGB = 1,
BGR = 2,
GRAY = 3,
BGRA = 4,
YUV_NV21 = 11,
};