HarmonyOS

文章40 |   阅读 26845 |   点赞0

来源:https://blog.csdn.net/forever_wj/category_11128883.html

HarmonyOS之AI能力·文字图像超分

x33g5p2x  于2022-03-07 转载在 其他  
字(3.8k)|赞(0)|评价(0)|浏览(702)
一、简介
  • 文字图像超分辨率可以对包含文字内容的图像进行 9 倍放大(高宽各放大 3 倍),同时增强图像内文字的清晰度,称为“文字图像超分辨率”,简称“文字图像超分”。
  • 本超分算法 SDK 基于深度神经网络开发,使用本 SDK 可以节省算法开发的时间,节省算法模型占用的 ROM 空间,让应用更加轻便。
  • 文字图像超分辨率支持处理的图片格式包括 JPEG、JPG、PNG,最终输出的图片仅支持 JPEG 格式。
  • 文字图像超分辨率输入图片分辨率(长宽之积)应不大于 134 万像素,并且宽高均不小于 506 像素。
二、应用场景
  • 拍照效果增强:增加拍摄内容里文字的清晰度。
  • 文字档案翻拍:翻拍字迹模糊的文字档案,提升文字的可识别度。
三、API 说明
  • 文字图像超分提供了 setVisionConfiguration() 和 doSuperResolution() 两个函数接口。
  • setVisionConfiguration 是 ITxtImageSuperResolution 接口的成员,通过传入的 TxtImageSuperResolutionConfiguration,选择进程调用模式。
  1. void setVisionConfiguration(TxtImageSuperResolutionConfiguration configuration);
  • TxtImageSuperResolutionConfiguration 的常用设置:
接口参数名类型参数说明
setProcessMode()modein进程模式定义:<br>VisionConfiguration.MODE_IN(同进程调用)<br>VisionConfiguration.MODE_OUT(跨进程调用)<br>默认值为VisionConfiguration.MODE_OUT
  • 调用 ITxtImageSuperResolution 的 doSuperResolution() 方法,获取文字图像超分辨率后的图片结果:
  1. int doSuperResolution(VisionImage image, ImageResult result, VisionCallback<ImageResult> visionCallback);
  • 其中:
    • image 为待超分的输入图片。
    • 如果 visionCallback 为 null,执行同步调用,结果码由方法返回,检测及识别结果由 result 中返回。
    • 如果 visionCallback 为有效的回调函数,则该函数为异步调用,函数返回时 result 中的值无效,实际识别结果由回调函数返回。
    • 同步模式调用成功时,该函数返回结果码0。异步模式调用请求发送成功时,该函数返回结果码700。
四、开发流程
  • 在使用文字图像超分辨率时,将实现文字图像超分的相关的类添加至工程:
  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;
  • 定义 ConnectionCallback 回调,实现连接能力引擎成功与否后的操作:
  1. ConnectionCallback connectionCallback = new ConnectionCallback() {
  2. @Override
  3. public void onServiceConnect() {
  4. // 定义连接能力引擎成功后的操作。
  5. }
  6. @Override
  7. public void onServiceDisconnect() {
  8. // 定义连接能力引擎失败后的操作。
  9. }
  10. };
  • 调用 VisionManager.init() 方法,将此工程的 context 和已经定义的 connectionCallback 作为入参,建立与能力引擎的连接。context 应为 ohos.aafwk.ability.Ability 或 ohos.aafwk.ability.AbilitySlice 的实例或子类实例:
  1. int result = VisionManager.init(context, connectionCallback);
  • 实例化 VisionImage 对象 image,并传入待超分图片 pixelMap:
  1. VisionImage image = VisionImage.fromPixelMap(pixelMap);
  • 实例化 ImageResult 对象 imageResult,该类在同步模式下用于存放调用 txtImageSuperResolution.doSuperResolution() 方法的超分结果:
  1. ImageResult imageResult = new ImageResult();
  • (可选) 定义 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. };
  • 通过 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);
  • (可选)调用 ITxtImageSuperResolution 的 prepare() 方法启动引擎。
    ITxtImageSuperResolution 的 doSuperResolution() 方法中会首先调用 prepare() 启动引擎,如果引擎已经启动则不会再次启动,因此本步骤为可选步骤:
  1. result = txtImageSuperResolution.doSuperResolution(image, imageResult, null); // 同步
  2. // 或
  3. result = txtImageSuperResolution.doSuperResolution(image, null, visionCallback); // 异步
  • 说明:
    • 同步模式调用完成时,该函数立即返回结果码;
    • 异步模式调用请求发送成功时,该函数返回结果码700。如果返回其他的值,说明异步调用请求不成功,需要先处理错误,回调函数不会被调用。
    • 如果异步模式调用请求发送成功,则文字超分完成后,相应的回调函数会被自动调用。
      • 如果onResult()回调被调用,说明超分成功,相当于同步模式结果码为0的情况。
      • 如果onError()方法被调用,则说明文字超分发生了错误,具体的调用结果码将由onError()的参数接收。
  • 结果码定义如下表:
结果码说明
0成功
-1未知错误
-2不支持的功能或接口
-3内存分配失败或创建对象失败
-4所需库加载失败
-10引擎开关已经关闭
101失败
102超时
200输入参数不合法(图片尺寸错误)
201输入参数不合法(为空)
210输入参数合法
500服务绑定异常
521服务绑定异常断开
522服务已连接
600模型文件异常
601模型文件不存在
602模型加载失败
700异步调用请求发送成功
1001神经网络处理单元错误
  • 调用 ITxtImageSuperResolution 的 release() 方法,释放资源,调用 pixelMap 的 release() 方法,释放图片内存:
  1. txtImageSuperResolution.release();
  2. if (pixelMap != null) {
  3. pixelMap.release();
  4. pixelMap = null;
  5. }
  • 调用 VisionManager.destroy() 方法,断开与能力引擎的连接:
  1. VisionManager.destroy();

相关文章