目录

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

设备侧文本识别

1. 创建文本分析器MLTextAnalyzer用于识别图片中的文字,您可以通过MLLocalTextSetting设置识别的语种,不设置语言默认只能识别拉丁字符。

  1. //方式一:使用默认参数配置设备侧文本分析器,只能识别拉丁语系文字。
  2. MLTextAnalyzer analyzer = MLAnalyzerFactory.getInstance().getLocalTextAnalyzer();
  3. //方式二:使用自定义参数MLLocalTextSetting配置设备侧文本分析器。
  4. MLLocalTextSetting setting = new MLLocalTextSetting.Factory()
  5.    .setOCRMode(MLLocalTextSetting.OCR_DETECT_MODE)
  6.    // 设置识别语种。
  7.    .setLanguage("zh")
  8.    .create();
  9. MLTextAnalyzer analyzer = MLAnalyzerFactory.getInstance().getLocalTextAnalyzer(setting);

2. 通过android.graphics.Bitmap创建MLFrame,支持的图片格式包括:jpg/jpeg/png/bmp,建议输入图片长宽比范围是1:2到2:1。

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

3. 将生成的MLFrame对象传递给“asyncAnalyseFrame”方法进行文字识别。

  1. Task<MLText> task = analyzer.asyncAnalyseFrame(frame);
  2. task.addOnSuccessListener(new OnSuccessListener<MLText>() {
  3.    @Override
  4.    public void onSuccess(MLText text) {
  5.        // 识别成功处理。
  6.    }
  7. }).addOnFailureListener(new OnFailureListener() {
  8.    @Override
  9.    public void onFailure(Exception e) {
  10.        // 识别失败处理。
  11.    }
  12. });

4. 示例代码中使用了异步调用方式,本地文本识别还支持同步调用方式,识别结果以“MLText.Block”数组进行提供:

  1. Context context = getApplicationContext();
  2. MLTextAnalyzer analyzer = new MLTextAnalyzer.Factory(context).create();
  3. SparseArray<MLText.Block> blocks = analyzer.analyseFrame(frame);

5. 识别完成,停止分析器,释放识别资源。

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

云侧文本识别

1. 创建分析器。推荐通过创建MLRemoteTextSetting,设置需要识别的语种列表,创建分析器,以获取更加精确的文本识别结果。

  1. // 方式一:使用自定义参数配置。
  2. // 创建语言集合。
  3. List<String> languageList = new ArrayList();
  4. languageList.add("zh");
  5. languageList.add("en");
  6. // 设置参数。
  7. MLRemoteTextSetting setting = new MLRemoteTextSetting.Factory()
  8.    // 设置云侧文本检测模式:
  9.    // MLRemoteTextSetting.OCR_COMPACT_SCENE:文本密集场景的文本识别。
  10.    // MLRemoteTextSetting.OCR_LOOSE_SCENE:文本稀疏场景的文本识别。
  11.    .setTextDensityScene(MLRemoteTextSetting.OCR_LOOSE_SCENE)
  12.    // 设置识别语言列表,使用ISO 639-1标准。
  13.    .setLanguageList(languageList)
  14.    // 设置文本边界框返回格式,
  15.    // MLRemoteTextSetting.NGON:返回四边形的四个顶点坐标。
  16.    // MLRemoteTextSetting.ARC:返回文本排列为弧形的多边形边界的顶点,最多可返回多达72个顶点的坐标。
  17.    .setBorderType(MLRemoteTextSetting.ARC)
  18.    .create();
  19. MLTextAnalyzer analyzer = MLAnalyzerFactory.getInstance().getRemoteTextAnalyzer(setting);
  20. // 方式二:使用默认参数配置,自动检测语种进行识别,适用于文本稀疏场景,文本框返回格式为:MLRemoteTextSetting.NGON。
  21. MLTextAnalyzer analyzer = MLAnalyzerFactory.getInstance().getRemoteTextAnalyzer();

2. 通过Bitmap创建MLFrame,支持的图片格式包括:jpg/jpeg/png/bmp。

  1. MLFrame frame = MLFrame.fromBitmap(bitmap);

3. 将创建的MLFrame对象传递给分析器的“asyncAnalyseFrame”方法进行文字识别。

  1. Task<MLText> task = analyzer.asyncAnalyseFrame(frame);
  2. task.addOnSuccessListener(new OnSuccessListener<MLText>() {
  3.    @Override
  4.    public void onSuccess(MLText text) {
  5.        // 识别成功。
  6.    }
  7. }).addOnFailureListener(new OnFailureListener() {
  8.    @Override
  9.    public void onFailure(Exception e) {
  10.        // 识别失败,获取相关异常信息。
  11.            try {
  12.            MLException mlException = (MLException)e;
  13.            // 获取错误码,开发者可以对错误码进行处理,根据错误码进行差异化的页面提示。错误码信息可参见:机器学习服务错误码。
  14.            int errorCode = mlException.getErrCode();
  15.           // 获取报错信息,开发者可以结合错误码,快速定位问题。
  16.           String errorMessage = mlException.getMessage();
  17.       } catch (Exception error) {
  18.           // 转换错误处理。
  19.       }
  20.   }
  21. });

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

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

设备侧视频流文本识别

开发者可以自行处理视频流,将视频帧转换为MLFrame对象,再按上文中静态图像本地识别的方法识别文字。如果开发者调用的是同步识别接口,也可以使用SDK内置的LensEngine类实现视频流本地文本检测,创建并初始化一个LensEngine对象,具体实现请参考示例代码:

1. 创建分析器。

  1. MLTextAnalyzer analyzer = new MLTextAnalyzer.Factory(context).create();

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

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

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

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

4. 调用同步接口使用SDK内置LensEngine创建对象,并注册分析器,初始化相机参数。

  1. LensEngine lensEngine = new LensEngine.Creator(getApplicationContext(),analyzer)
  2.        .setLensType(LensEngine.BACK_LENS)
  3.        .applyDisplayDimension(1440, 1080)
  4.        .applyFps(30.0f)
  5.        .enableAutomaticFocus(true)
  6.        .create();

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

  1. // 请自行实现SurfaceView控件的其他逻辑。
  2. SurfaceView mSurfaceView = findViewById(R.id.surface_view);
  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>完成检测处理结果时,如果需要实现检测到特定结果后停止检测,待特定结果处理完后继续检测的功能,可以视频流检测模式多次识别场景开发。