目录

在开始API开发工作之前,您需要完成必要的开发准备工作,同时请确保您的工程中已经配置HMS Core SDK的maven仓地址,并且完成了本服务的SDK集成。

静态图片分割

1. 创建图像分割器。

  1. // 方式一:使用默认参数配置图像分割检测器。
  2. // 默认模式为:人像分割模式 + 精度模式,返回人像分割的所有分割结果(像素级标记信息、背景透明的人像图、人像为白色,背景为黑色的灰度图以及被分割的原图)。
  3. MLImageSegmentationAnalyzer analyzer = MLAnalyzerFactory.getInstance().getImageSegmentationAnalyzer();
  4. // 方式二:使用自定义参数MLImageSegmentationSetting配置图像分割检测器。
  5. MLImageSegmentationSetting setting = new MLImageSegmentationSetting.Factory()
  6.    // 设置分割精细模式,true为精细分割模式,false为速度优先分割模式。
  7.    .setExact(false)
  8.    // 设置分割模式为人像分割。
  9.    .setAnalyzerType(MLImageSegmentationSetting.BODY_SEG)
  10.    // 设置返回结果种类,
  11.    // MLImageSegmentationScene.ALL: 返回所有分割结果,包括:像素级标记信息、背景透明的人像图和人像为白色,背景为黑色的灰度图以及被分割的原图。
  12.    // MLImageSegmentationScene.MASK_ONLY: 只返回像素级标记信息。
  13.    // MLImageSegmentationScene.FOREGROUND_ONLY: 只返回背景透明的人像图。
  14.    // MLImageSegmentationScene.GRAYSCALE_ONLY: 只返回人像为白色,背景为黑色的灰度图。
  15.    .setScene(MLImageSegmentationScene.FOREGROUND_ONLY)
  16.    .create();
  17. MLImageSegmentationAnalyzer analyzer = MLAnalyzerFactory.getInstance().getImageSegmentationAnalyzer(setting);

使用多类型分割模型包对图像进行多类别分割时,只支持通过图像分割检测配置器MLImageSegmentationSetting创建图像分割检测器。

  1. MLImageSegmentationSetting setting = new MLImageSegmentationSetting
  2.    .Factory()
  3.    // 设置分割精细模式,true为精细分割模式,false为速度优先分割模式。
  4.    .setExact(true)
  5.    // 设置分割模式为图像分割。
  6.    .setAnalyzerType(MLImageSegmentationSetting.IMAGE_SEG)
  7.    .create();
  8. MLImageSegmentationAnalyzer analyzer = MLAnalyzerFactory.getInstance().getImageSegmentationAnalyzer(setting);

2. 通过android.graphics.Bitmap创建MLFrame对象用于分析器检测图片,支持的图片格式包括:jpg/jpeg/png,建议图片尺寸不小于224*224像素。

  1. // 通过bitmap创建MLFrame,bitmap为输入的Bitmap格式图片数据。  
  2. MLFrame frame = MLFrame.fromBitmap(bitmap);

3. 调用“asyncAnalyseFrame ”方法进行图像分割。

  1. // 创建一个task,处理图像分割检测器返回的结果。  
  2. Task<MLImageSegmentation> task = analyzer.asyncAnalyseFrame(frame);  
  3. // 异步处理图像分割检测器返回结果。
  4. task.addOnSuccessListener(new  
  5. OnSuccessListener<MLImageSegmentation>() {  
  6.    @Override  
  7.    public void onSuccess(MLImageSegmentation segmentation) {  
  8.        // 检测成功处理。
  9.    }})  
  10.    .addOnFailureListener(new OnFailureListener() {  
  11.    @Override  
  12.    public void onFailure(Exception e) {  
  13.        // 检测失败处理。
  14.    }  
  15. });

4. 检测完成,停止分析器,释放检测资源。

  1. if (analyzer != null) {  
  2.    try {  
  3.        analyzer.stop();  
  4.    } catch (IOException e) {  
  5.        // 异常处理。
  6.    }  
  7. }

以上示例代码中使用了异步调用方式,图像分割还支持同步调用使用analyseFrame函数获取检测结果:

  1. SparseArray<MLImageSegmentation> segmentations = analyzer.analyseFrame(frame);

视频流分割(仅人像分割模型包支持)

开发者可以自行处理视频流,将视频帧转换为MLFrame对象,再按上文中静态图像检测的方法进行对象检测。开发者也可以使用SDK内置的LensEngine类实现视频流图像分割,无需自己处理视频流,示例代码如下:

1. 创建图像分割检测器。

  1. // 使用自定义参数MLImageSegmentationSetting配置图像分割检测器。
  2. MLImageSegmentationSetting setting = new MLImageSegmentationSetting
  3.    .Factory()
  4.    // 设置分割精细模式,true为精细分割模式,false为速度优先分割模式。
  5.    .setExact(false)
  6.    // 设置返回结果种类,
  7.    // MLImageSegmentationScene.ALL: 返回所有分割结果,包括:像素级标记信息、背景透明的人像图和人像为白色,背景为黑色的灰度图以及被分割的原图。
  8.    // MLImageSegmentationScene.MASK_ONLY: 只返回像素级标记信息和被分割的原图。
  9.    // MLImageSegmentationScene.FOREGROUND_ONLY: 只返回背景透明的人像图和被分割的原图。
  10.    // MLImageSegmentationScene.GRAYSCALE_ONLY: 只返回人像为白色,背景为黑色的灰度图和被分割的原图。
  11.    .setScene(MLImageSegmentationScene.FOREGROUND_ONLY)
  12.    // 设置分割模式,视频流分割时,仅支持设置MLImageSegmentationSetting.BODY_SEG(只分割人体和背景)。
  13.    .setAnalyzerType(MLImageSegmentationSetting.BODY_SEG)
  14.    .create();
  15. MLImageSegmentationAnalyzer analyzer = MLAnalyzerFactory.getInstance().getImageSegmentationAnalyzer(setting);

2. 开发者创建识别结果处理类“ImageSegmentAnalyzerTransactor”,该类实现MLAnalyzer.MLTransactor<T>接口,使用该接口中的transactResult方法获取检测结果并实现具体业务。

  1. public class ImageSegmentAnalyzerTransactor implements MLAnalyzer.MLTransactor<MLImageSegmentation> {
  2.    @Override
  3.    public void transactResult(MLAnalyzer.Result<MLImageSegmentation> results) {
  4.        SparseArray<MLImageSegmentation> items = results.getAnalyseList();
  5.        // 开发者根据需要处理识别结果,需要注意,这里只对检测结果进行处理
  6.        // 不可调用ML Kit提供的其他检测相关接口。
  7.    }
  8.    @Override
  9.    public void destroy() {
  10.        // 检测结束回调方法,用于释放资源等。
  11.    }
  12. }

3. 设置识别结果处理器,实现分析器与结果处理器的绑定。

  1. analyzer.setTransactor(new ImageSegmentAnalyzerTransactor());

4. 创建LensEngine,该类由ML SDK提供,用于捕捉相机动态视频流并传入分析器。

  1. Context context = this.getApplicationContext();
  2. LensEngine lensEngine = new LensEngine.Creator(context,analyzer)
  3.    // 设置摄像头前后置模式,LensEngine.BACK_LENS为后置,LensEngine.FRONT_LENS为前置。
  4.    .setLensType(LensEngine.FRONT_LENS)
  5.    .applyDisplayDimension(1280, 720)
  6.    .applyFps(20.0f)
  7.    .enableAutomaticFocus(true)
  8.    .create();

5. 调用run方法,启动相机,读取视频流,进行识别。

  1. // 请自行实现SurfaceView控件的其他逻辑。
  2. SurfaceView mSurfaceView = new SurfaceView(this);
  3. try {
  4.    lensEngine.run(mSurfaceView.getHolder());
  5. } catch (IOException e) {
  6.    // 异常处理逻辑。
  7. }

6. 检测完成,停止分析器,释放检测资源。

  1. if (analyzer != null) {
  2.    try {
  3.    analyzer.stop();
  4.    } catch (IOException e) {
  5.      // 异常处理。
  6.    }
  7. }
  8. if (lensEngine != null) {
  9.    lensEngine.release();
  10. }

使用视频流检测,继承MLAnalyzer.MLTransactor<T>完成检测处理结果时,如果需要实现检测到特定结果后停止检测,待特定结果处理完后继续检测的功能,可以参考视频流检测模式多次识别场景开发。