HarmonyOS-鸿蒙app开发 —基于javaAI图像超分辨率开发指导

HarmonyOS-鸿蒙app开发 —基于javaAI图像超分辨率开发指导

场景介绍

图像超分在实际应用中有广泛的前景,比如提升网络图片的画质,在阅读新闻时获得更加清晰的大图等等。

图像超分可能的应用场景包括但不限于:

  • 抑制压缩噪声:1x的超分可以去除高压缩率图片的压缩噪声。
  • 节省存储和流量:可加大图片压缩率,有助于存储及传送高压缩率的图片。
  • 高质量放大:3x超分将图片放大3倍,还能有效抑制压缩噪声。

开放能力介绍

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

  • setVisionConfiguration是IImageSuperResolution接口的成员,通过传入的SisrConfiguration,选择具体的超分参数。
    1. void setVisionConfiguration(SisrConfiguration config);

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

    接口

    参数名

    类型

    参数说明

    setScale()

    scale

    float

    设置超分倍数。目前支持SisrConfiguration.SISR_SCALE_1X和SisrConfiguration.SISR_SCALE_3X。

    setScale()

    void

    void

    设置超分倍数为默认值SisrConfiguration.SISR_SCALE_1X。

    setQuality()

    quality

    int

    设置超分质量。目前支持的参数类别为SisrConfiguration.SISR_QUALITY_LOW、

    SisrConfiguration.SISR_QUALITY_MEDIUM和

    SisrConfiguration.SISR_QUALITY_HIGH。

    但该入参目前并未实际使用,无论如何设置都会执行当前能力下的最高质量超分。

    setQuality()

    void

    void

    设置返回图片的超分质量为SisrConfiguration.SISR_QUALITY_HIGH。

  • 调用IImageSuperResolution的doSuperResolution()方法,执行图像超分。
    1. int doSuperResolution(VisionImage image, ImageResult result, VisionCallback<ImageResult> visionCallback);

    其中:

    image为待超分的输入图片。

    如果visionCallback为null,执行同步调用,结果码由方法返回,超分结果由result返回。

    如果visionCallback为有效的回调函数,则该函数为异步调用,函数返回时result中的结果无效,实际超分结果由回调函数返回。

    同步模式调用成功时,该函数返回结果码0;异步模式调用请求发送成功时,该函数返回结果码700。

开发步骤

    1. 在使用图像超分SDK时,先将相关的类添加至工程。

import ohos.ai.cv.common.ConnectionCallback;
import ohos.ai.cv.common.VisionCallback;
import ohos.ai.cv.common.VisionImage;
import ohos.ai.cv.common.VisionManager;
import ohos.ai.cv.common.ImageResult;
import ohos.ai.cv.sr.IImageSuperResolution;
import ohos.ai.cv.sr.SisrConfiguration;
import ohos.app.Context;
import ohos.media.image.PixelMap;

定义ConnectionCallback回调,实现连接能力引擎成功与否后的操作。

ConnectionCallback connectionCallback = new ConnectionCallback() {
@Override
public void onServiceConnect() {
// 定义连接能力引擎成功后的操作。
}

@Override
public void onServiceDisconnect() {
// 定义连接能力引擎失败后的操作。
}
};

 

调用VisionManager.init()方法,将此工程的context和和已经定义的connectionCallback回调作为入参,建立与能力引擎的连接,context应为ohos.aafwk.ability.Ability或ohos.aafwk.ability.AbilitySlice的实例或子类实例。

int result = VisionManager.init(context, connectionCallback);

在收到onServiceConnect回调连接服务成功后,实例化IImageSuperResolution接口,将此工程的context作为入参,context应为ohos.aafwk.ability.Ability或ohos.aafwk.ability.AbilitySlice的实例或子类实例。

IImageSuperResolution imageSuperResolution = VisionManager.getSisr(context);

实例化VisionImage对象image,并传入待超分图片pixelMap。

VisionImage image = VisionImage.fromPixelMap(pixelMap);

实例化ImageResult对象imageResult,该对象用于在同步模式下存放doSuperResolution()方法传出的超分后图片结果。

ImageResult imageResult = new ImageResult();

(可选)定义VisionCallback<ImageResult>回调。

VisionCallback<ImageResult> callback= new VisionCallback<ImageResult>() {
@Override
public void onResult(ImageResult imageResult) {
// 对正确获得图片超分结果进行处理。
}
@Override
public void onError(int i) {
// 处理错误返回码。
}
@Override
public void onProcessing(float v) {
// 返回处理进度。
}
};

说明
  • 在异步模式下,该类的onResult()方法用于获得超分的结果imageResult(内含超分后图片结果);onError()方法用于处理错误返回码;onProcessing()方法用于返回处理进度,目前没有实现此接口的功能。
  • 同步与异步模式区别在于doSuperResolution()的最后一个参数visionCallback是否为空。若非空则为异步模式,此时会忽略自定义的ImageResult输入result,接口调用结果一律从回调类visionCallback获得。

通过SisrConfiguration配置超分参数,可选择超分倍数、质量、调用模式(推荐使用MODE_IN同进程模式)等。跨进程模式(MODE_OUT)下调用方与能力引擎处于不同进程;同进程模式(MODE_IN)下,能力引擎在调用方进程中实例化,调用方通过反射的方式调用引擎里的图像超分能力。以下以同进程调用,3x最高质量超分为例:

SisrConfiguration.Builder builder = new SisrConfiguration.Builder();
builder.setProcessMode(VisionConfiguration.MODE_IN);
SisrConfiguration config = builder.build();
config.setScale(SisrConfiguration.SISR_SCALE_3X);
config.setQuality();
imageSuperResolution.setVisionConfiguration(config);

(可选)调用IImageSuperResolution的prepare方法。

result = imageSuperResolution.prepare();

说明

如果返回的result不为0,说明当前超分能力准备失败,需要处理错误,不再执行之后的动作。在doSuperResolution()方法中会首先调用prepare()启动引擎,如果引擎已经启动则不会再次启动。

调用IImageSuperResolution的doSuperResolution方法。

result = imageSuperResolution.doSuperResolution(image, imageResult, null); // 同步

或者:

result = imageSuperResolution.doSuperResolution(image, null, callback); // 异步

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

    结果码

    说明

    0

    成功

    -1

    未知错误

    -2

    不支持的功能或接口

    -3

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

    -4

    所需库加载失败

    -10

    引擎开关已经关闭

    101

    失败

    102

    超时

    200

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

    201

    输入参数不合法(为空)

    210

    输入参数合法

    500

    服务绑定异常

    521

    服务绑定异常断开

    522

    服务已连接

    600

    模型文件异常

    601

    模型文件不存在

    602

    模型加载失败

    700

    异步调用请求发送成功

    1001

    神经网络处理单元错误

    调用IImageSuperResolution的release()方法,释放模型资源;调用pixelMap的release()方法,释放图片内存。

result = imageSuperResolution.release();
if (pixelMap != null) {
pixelMap.release();
pixelMap = null;
}

说明

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

调用VisionManager.destroy()方法,断开与能力引擎的连接。

VisionManager.destroy();

🚀 如未找到文章请搜索栏搜素 | Ctrl+D收藏本站 | 联系邮箱:15810050733@qq.com