赞
踩
针对图片分辨率不足的问题,传统的解决方案是使用双线性或双三次插值的方法来放大图像;而针对图片压缩噪声的问题,传统的解决方案则是通过各种算法实现平滑、去噪。
本SDK使用智能的方法,基于深度神经网络,依托硬件的神经网络加速器,提供适用于移动终端的1x和3x超分能力;1x超分可以去除图片的压缩噪声,3x超分在有效抑制压缩噪声的同时,提供3倍的边长放大能力。
“超分”,即单张图片空间域超分辨率(SISR:Single Image Super-Resolution),指给定单张图片,使用智能方法将其放大,令其分辨率更高,得到比传统放大更加清晰的细节纹理;或者在分辨率不变的情况下,去除压缩噪声,获得更加锐利、干净的图片。
图像超分引擎内置于手机中,应用程序可以通过本SDK访问超分能力,降低图片超分应用的开发门槛,减小应用程序大小。
超分类型 | 效果 | 支持图片较长边最大像素数 | 支持图片较短边最大像素数 |
---|---|---|---|
1x | 不改变图片的尺寸,但可以智能识别、抑制图片本身的压缩噪声,令图片更加干净清晰。 | 1920 | 1080 |
3x | 图片的边长放大3倍。 | 1024 | 768 |
图像超分在实际应用中有广泛的前景,比如提升网络图片的画质,在阅读新闻时获得更加清晰的大图等等。
图像超分可能的应用场景包括但不限于:
图像超分提供了setVisionConfiguration()和doSuperResolution()两个函数接口。
void setVisionConfiguration(SisrConfiguration config);
int doSuperResolution(VisionImage image, ImageResult result, VisionCallback<ImageResult> visionCallback);
其中:
image为待超分的输入图片。
如果visionCallback为null,执行同步调用,结果码由方法返回,超分结果由result返回。
如果visionCallback为有效的回调函数,则该函数为异步调用,函数返回时result中的结果无效,实际超分结果由回调函数返回。
同步模式调用成功时,该函数返回结果码0;异步模式调用请求发送成功时,该函数返回结果码700。
在使用图像超分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) {
- // 返回处理进度。
- }
- };
说明
通过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); // 异步
说明
结果码定义如下表:
结果码 | 说明 |
---|---|
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();
最后,为了能让大家更好的去学习提升鸿蒙 (Harmony OS) 开发技术,小编连夜整理了一份30个G纯血版学习资料(含视频、电子书、学习文档等)以及一份在Github上持续爆火霸榜的《纯血版华为鸿蒙 (Harmony OS)开发手册》(共计890页),希望对大家有所帮助。
需要以上视频学习资料小伙伴
这份手册涵盖了当前鸿蒙 (Harmony OS) 开发技术必掌握的核心知识点
HarmonyOS 概念:
如何快速入门?
开发基础知识:
基于ArkTS 开发:
获取以上文中提到的这份纯血版鸿蒙 (Harmony OS) 开发资料的小伙伴
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。