目录

  • 前言
  • 图像识别概述
  • 使用场景
  • 业务流程逻辑
  • 实现图像识别
  • 结束语

    前言

    在移动应用开发中,图像处理和识别是一项常见而重要的功能,而且随着移动开发的技术革新,越来越多的好用的功能都在被推出来。而HarmonyOS提供了强大的图像识别能力,允许开发者轻松实现对本地图片的识别和处理。那么本文就来详细介绍如何在HarmonyOS应用中识别本地图片,包括图片的加载、处理和识别流程,方便大家了解和学习使用。

    图像识别概述

    图像识别技术涉及从图像中提取信息、识别对象和特征。在HarmonyOS中,可以通过集成华为机器学习服务中的图像识别服务来实现这一功能,该服务提供了包括但不限于人脸检测、图像分类、对象识别等多种能力。图片识码能力支持对图库中的码图进行扫描识别,并获取信息。在HarmonyOS中,图像识别通常涉及以下步骤:
    1.获取图片:从本地存储或应用资源中获取图片。
    2.预处理:对图片进行必要的预处理,如调整大小、增强对比度等。
    3.处理结果:根据识别结果执行后续操作。

    使用场景

    在日常开发和实际使用过程中,图片识码能力支持对图库中的条形码、二维码、MULTIFUNCTIONAL CODE进行识别,并获得码类型、码值、码位置信息,该能力可用于一图单码和一图多码的识别,比如条形码、付款码等。

    业务流程逻辑

    接下来分享一下关于图像识别的业务流程逻辑,具体流程图如下所示:
    image.png
    通过上图可以看到,用户向开发者的应用发起图片识码请求,具体如下所示:
    1.应用通过调用Scan Kit的decode接口启动图片识码。
    2.Scan Kit通过回调返回图片识码结果。
    3.应用向用户返回扫码结果。

    实现图像识别

    关于实现图像识别,图片识码接口支持识别图库中的条形码,二维码以及MULTIFUNCTIONAL CODE,并返回图片中码图的值,类型以及码的位置信息(码图最小外接矩形左上角和右下角的坐标)。那么下面就通过一个完整的示例来分享,下面示例为调用图片识码的detectBarcode.decode接口获取码图信息,具体实现步骤如下所示。

    1、导入图片识码接口和相关接口模块

    导入图片识码接口和相关接口模块,这个接口提供了图片识码参数和方法,导入方法如下所示:

// 导入图片识码需要的日志和picker模块
import { scanCore, scanBarcode, detectBarcode } from '@kit.ScanKit';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';

2、调用detectBarcode.decode接口

接着是通过Promise回调函数得到扫码结果,InputImage对象中uri参数推荐通过picker方式获取,具体示例如下所示:

@Entry
@Component
struct DetectPage {
  build() {
    Column() {
      Button('Promise with options')
        .backgroundColor('#0D9FFB')
        .fontSize(20)
        .fontColor('#FFFFFF')
        .fontWeight(FontWeight.Normal)
        .align(Alignment.Center)
        .type(ButtonType.Capsule)
        .width('90%')
        .height(40)
        .margin({ top: 5, bottom: 5 })
        .onClick(() => {
          // 定义识码参数options
          let options: scanBarcode.ScanOptions = {
            scanTypes: [scanCore.ScanType.ALL],
            enableMultiMode: true,
          }
          // 通过picker拉起图库的图片
          let photoOption = new photoAccessHelper.PhotoSelectOptions();
          photoOption.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;
          photoOption.maxSelectNumber = 1;
          let photoPicker = new photoAccessHelper.PhotoViewPicker();
          photoPicker.select(photoOption).then((result) => {
            // 定义识码参数inputImage,其中uri为picker选择图片
            let inputImage: detectBarcode.InputImage = { uri: result.photoUris[0] };
            try {
              // 调用图片识码接口
              detectBarcode.decode(inputImage, options).then((result: Array<scanBarcode.ScanResult>) => {
               }).catch((error: BusinessError) => {
              });
            } catch (error) {
             }
          })
        });
    }
    .width('100%')
    .height('100%')
    .alignItems(HorizontalAlign.Center)
    .justifyContent(FlexAlign.Center)
  }
}

然后是通过Callback回调函数得到扫码结果,InputImage对象中uri参数推荐通过picker方式获取,具体示例代码如下所示:

@Entry
@Component
struct DetectPage {
  build() {
    Column() {
      Button('Callback with options')
        .backgroundColor('#0D9FFB')
        .fontSize(20)
        .fontColor('#FFFFFF')
        .fontWeight(FontWeight.Normal)
        .align(Alignment.Center)
        .type(ButtonType.Capsule)
        .width('90%')
        .height(40)
        .margin({ top: 5, bottom: 5 })
        .onClick(() => {
          // 定义识码参数options
          let options: scanBarcode.ScanOptions = {
            scanTypes: [scanCore.ScanType.ALL],
            enableMultiMode: true,
            enableAlbum: true
          }
          // 通过选择模式拉起photoPicker界面,用户可以选择一个图片
          let photoOption = new photoAccessHelper.PhotoSelectOptions();
          photoOption.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;
          photoOption.maxSelectNumber = 1;
          let photoPicker = new photoAccessHelper.PhotoViewPicker();
          photoPicker.select(photoOption).then((result) => {
            // 定义识码参数inputImage,其中uri为picker选择图片
            let inputImage: detectBarcode.InputImage = { uri: result.photoUris[0] };
            try {
              // 调用图片识码接口
              detectBarcode.decode(inputImage, options,
                (error: BusinessError, result: Array<scanBarcode.ScanResult>) => {
                  if (error && error.code) {
                    return;
                  }
                 });
            } catch (error) {
             }
          })
        });
    }
    .width('100%')
    .height('100%')
    .alignItems(HorizontalAlign.Center)
    .justifyContent(FlexAlign.Center)
  }
}

3、关于模拟器使用

关于识别本地图片的测试,是支持模拟器开发的,使用指导请参见使用模拟器运行应用/服务:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides...

结束语

通过本文的详细介绍,可以看到图像识别是HarmonyOS开发中的一项强大功能,它为应用带来了更多的可能性和创新空间。通过上面的详细介绍,大家想必应该了解了如何在HarmonyOS应用中实现对本地图片的识别。然而随着技术的不断发展,个人觉得图像识别技术将在HarmonyOS生态中扮演越来越重要的角色,给所有用户带来更加丰富和便捷的体验,非常不错的技术。


灵芸小骏
4.7k 声望307 粉丝

移动开发者。