HarmonyOS鸿蒙基于Java开发: 文字图像超分

发布时间:2024年01月19日

目录

约束与限制

文字图像超分开发指导

场景介绍

接口说明

开发步骤


文字图像超分辨率可以对包含文字内容的图像进行9倍放大(高宽各放大3倍),同时增强图像内文字的清晰度,称为“文字图像超分辨率”,简称“文字图像超分”。

本超分算法SDK基于深度神经网络开发,使用本SDK可以节省算法开发的时间,节省算法模型占用的ROM空间,让应用更加轻便。

约束与限制

  • 支持处理的图片格式包括JPEG、JPG、PNG,最终输出的图片仅支持JPEG格式。
  • 输入图片分辨率(长宽之积)应不大于134万像素,并且宽高均不小于506像素。

文字图像超分开发指导

场景介绍

  • 拍照效果增强:增加拍摄内容里文字的清晰度。
  • 文字档案翻拍:翻拍字迹模糊的文字档案,提升文字的可识别度。

接口说明

文字图像超分提供了setVisionConfiguration()和doSuperResolution()两个函数接口。

  • setVisionConfiguration是ITxtImageSuperResolution接口的成员,通过传入的TxtImageSuperResolutionConfiguration,选择进程调用模式。
     
      
    1. void setVisionConfiguration(TxtImageSuperResolutionConfiguration configuration);

    下表列出了TxtImageSuperResolutionConfiguration的常用设置:

    接口

    参数名

    类型

    参数说明

    setProcessMode()

    mode

    int

    进程模式定义:

    VisionConfiguration.MODE_IN(同进程调用)

    VisionConfiguration.MODE_OUT(跨进程调用)

    默认值为VisionConfiguration.MODE_OUT。

  • 调用ITxtImageSuperResolution的doSuperResolution()方法,获取文字图像超分辨率后的图片结果。
     
      
    1. int doSuperResolution(VisionImage image, ImageResult result, VisionCallback<ImageResult> visionCallback);

    其中:

    • image为待超分的输入图片。
    • 如果visionCallback为null,执行同步调用,结果码由方法返回,检测及识别结果由result返回。
    • 如果visionCallback为有效的回调函数,则该函数为异步调用,函数返回时result中的值无效,实际识别结果由回调函数返回。
    • 同步模式调用成功时,该函数返回结果码0。异步模式调用请求发送成功时,该函数返回结果码700。

开发步骤

  1. 在使用文字图像超分辨率时,将实现文字图像超分的相关的类添加至工程。
     
      
    1. import ohos.ai.cv.common.ConnectionCallback;
    2. import ohos.ai.cv.common.ImageResult;
    3. import ohos.ai.cv.common.VisionCallback;
    4. import ohos.ai.cv.common.VisionConfiguration;
    5. import ohos.ai.cv.common.VisionImage;
    6. import ohos.ai.cv.common.VisionManager;
    7. import ohos.ai.cv.sr.ITxtImageSuperResolution;
    8. import ohos.ai.cv.sr.TxtImageSuperResolutionConfiguration;
    9. import ohos.app.Context;
    10. import ohos.media.image.PixelMap;
  2. 定义ConnectionCallback回调,实现连接能力引擎成功与否后的操作。
     
      
    1. ConnectionCallback connectionCallback = new ConnectionCallback() {
    2. @Override
    3. public void onServiceConnect() {
    4. // 定义连接能力引擎成功后的操作。
    5. }
    6. @Override
    7. public void onServiceDisconnect() {
    8. // 定义连接能力引擎失败后的操作。
    9. }
    10. };
  3. 调用VisionManager.init()方法,将此工程的context和已经定义的connectionCallback作为入参,建立与能力引擎的连接。context应为ohos.aafwk.ability.Ability或ohos.aafwk.ability.AbilitySlice的实例或子类实例。
     
      
    1. int result = VisionManager.init(context, connectionCallback);
  4. 在收到onServiceConnect回调连接服务成功后,实例化ITxtImageSuperResolution接口,将此工程的context作为入参,context应为ohos.aafwk.ability.Ability或ohos.aafwk.ability.AbilitySlice的实例或子类实例。
     
      
    1. ITxtImageSuperResolution txtImageSuperResolution = VisionManager.getTisr(context);
  5. 实例化VisionImage对象image,并传入待超分图片pixelMap。
     
      
    1. VisionImage image = VisionImage.fromPixelMap(pixelMap);
  6. 实例化ImageResult对象imageResult,该类在同步模式下用于存放调用txtImageSuperResolution.doSuperResolution()方法的超分结果。
     
      
    1. ImageResult imageResult = new ImageResult();
  7. (可选) 定义VisionCallback< ImageResult >回调。
     
      
    1. VisionCallback<ImageResult> callback= new VisionCallback<ImageResult>() {
    2. @Override
    3. public void onResult(ImageResult imageResult) {
    4. // 对正确获得的结果进行处理。
    5. }
    6. @Override
    7. public void onError(int i) {
    8. // 处理错误返回码。
    9. }
    10. @Override
    11. public void onProcessing(float v) {
    12. // 返回处理进度。
    13. }
    14. };

    说明

    在异步模式下,该类的onResult()方法用于获得文字超分结果ImageResult;onError()方法用于处理错误返回码;onProcessing()方法用于返回处理进度,目前没有实现此接口的功能。

    同步与异步模式区别在于doSuperResolution()的最后一个参数VisionCallback<ImageResult>是否为空。若非空则为异步模式,此时会忽略自定义的ImageResult输入(效果与传入null相同),接口调用结果一律从VisionCallback<ImageResult>获得,自定义的ImageResult输入不做更新。

  8. 通过TxtImageSuperResolutionConfiguration,选择进程调用模式:
    • 跨进程模式(MODE_OUT)下调用方与能力引擎处于不同进程;
    • 同进程模式(MODE_IN)下,能力引擎在调用方进程中实例化,调用方通过反射的方式调用引擎里的文字图像超分能力。
    以同进程调用为例:
     
      
    1. TxtImageSuperResolutionConfiguration.Builder builder = new TxtImageSuperResolutionConfiguration.Builder();
    2. builder.setProcessMode(VisionConfiguration.MODE_IN);
    3. TxtImageSuperResolutionConfiguration paras = builder.build();
    4. txtImageSuperResolution.setVisionConfiguration(paras);
  9. (可选)调用ITxtImageSuperResolution的prepare()方法启动引擎。

    10的doSuperResolution()方法中会首先调用prepare()启动引擎,如果引擎已经启动则不会再次启动。因此本步骤为可选步骤。

     
      
    1. result = txtImageSuperResolution.prepare();

    说明

    如果返回的result不为0,说明当前超分能力准备失败,需要处理错误,不再执行之后的动作。

  10. 调用ITxtImageSuperResolution的doSuperResolution()方法。
     
      
    1. result = txtImageSuperResolution.doSuperResolution(image, imageResult, null); // 同步

    或者:

     
      
    1. result = txtImageSuperResolution.doSuperResolution(image, null, visionCallback); // 异步

    说明

    1. 同步模式调用完成时,该函数立即返回结果码;
    2. 异步模式调用请求发送成功时,该函数返回结果码700。如果返回其他的值,说明异步调用请求不成功,需要先处理错误,回调函数不会被调用。
    3. 如果异步模式调用请求发送成功,则文字超分完成后,相应的回调函数会被自动调用。
      • 如果onResult()回调被调用,说明超分成功,相当于同步模式结果码为0的情况。
      • 如果onError()方法被调用,则说明文字超分发生了错误,具体的调用结果码将由onError()的参数接收。

    结果码定义如下表:

    结果码

    说明

    0

    成功

    -1

    未知错误

    -2

    不支持的功能或接口

    -3

    内存分配失败或创建对象失败

    -4

    所需库加载失败

    -10

    引擎开关已经关闭

    101

    失败

    102

    超时

    200

    输入参数不合法(图片尺寸错误)

    201

    输入参数不合法(为空)

    210

    输入参数合法

    500

    服务绑定异常

    521

    服务绑定异常断开

    522

    服务已连接

    600

    模型文件异常

    601

    模型文件不存在

    602

    模型加载失败

    700

    异步调用请求发送成功

    1001

    神经网络处理单元错误

  11. 调用ITxtImageSuperResolution的release()方法,释放资源。调用pixelMap的release()方法,释放图片内存。
     
      
    1. txtImageSuperResolution.release();
    2. if (pixelMap != null) {
    3. pixelMap.release();
    4. pixelMap = null;
    5. }

    说明

    不再使用文字图像超分能力时,调用release()方法释放资源。

  12. 调用VisionManager.destroy()方法,断开与能力引擎的连接。
     
      
    1. VisionManager.destroy();
文章来源:https://blog.csdn.net/m0_68036862/article/details/135611784
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。