鸿蒙AI功能开发【hiai引擎框架-主体分割】 基础视觉服务

news2024/11/14 20:34:30

hiai引擎框架-主体分割

介绍

本示例展示了使用hiai引擎框架提供的主体分割能力。

本示例模拟了在应用里,选择一张图片,识别其图片中的显著性主体并展示出来主体的边界框的数据。

需要使用hiai引擎框架通用文字识别接口@hms.ai.vision.subjectSegmentation.d.ts。

效果预览

1

使用说明:

  1. 在手机的主屏幕,点击”imageSegmentationDemo“,启动应用。
  2. 点击“选择图片”按钮,默认自带一张图片,用户可以在图库中选择图片,或者通过相机拍照(请先在图库中确定已开启图库权限)。
  3. 点击“主体分割”按钮,识别图片中的显著性主体,结果通过主体边界框的坐标显示。

具体实现

本示例展示的控件在@hms.ai.vision.subjectSegmentation.d.ts定义了主体分割API:

  • function doSegmentation(visionInfo: VisionInfo, config?: SegmentationConfig): Promise;

业务使用时,需要先进行import导入subjectSegmentation 调用通用主体分割接口,并传入想要识别的图片,接收处理返回的结果(文字信息)。参考:

import image from '@ohos.multimedia.image'
import hilog from '@ohos.hilog'
import subjectSegmentation from '@hms.ai.vision.subjectSegmentation';
import { mContext } from '../entryability/EntryAbility';
import picker from '@ohos.file.picker'
import fs from '@ohos.file.fs';
import { BusinessError } from '@ohos.base'

const TAG: string = "ImageSegmentationSample";

class PictureUtil {
  private constructor() {
  }
  /**
   * class to string.
   *
   * @param data the class to be converted
   * @return the result string
   */
  public static async getPixelMap(picPath: Resource): Promise<image.PixelMap> {
    let resourceM = mContext.resourceManager;
    const value = await resourceM.getMediaContent(picPath);
    const imageSourceApi = image.createImageSource(value.buffer);
    return imageSourceApi.createPixelMap();
  }
}

@Entry
@Component
struct Index {
  @State chooseImage: PixelMap | undefined = undefined
  @State dataValues: string = ''
  @State segmentedImage: PixelMap | undefined = undefined
  @State maxNum: string = '20'

  aboutToAppear() {
    PictureUtil.getPixelMap($r("app.media.3cat")).then(data => {
      this.chooseImage = data
    })
  }

  build() {
    Column() {
      Image(this.chooseImage)
        .objectFit(ImageFit.Fill)
        .height('30%')
        .accessibilityDescription("待分割图片")

      Scroll() {
        Text(this.dataValues)
          .copyOption(CopyOptions.LocalDevice)
          .margin(10)
          .width('100%')
      }
      .height('20%')  // 设置Scroll组件的高度

      Image(this.segmentedImage)
        .objectFit(ImageFit.Fill)
        .height('30%')
        .accessibilityDescription("分割后的主体图像")

      Row() {
        Text('最大主体数:')
          .fontSize(16)
        TextInput({ placeholder: '请输入最大主体数', text: this.maxNum })
          .type(InputType.Number)
          .placeholderColor(Color.Gray)
          .fontSize(16)
          .backgroundColor(Color.White)
          .onChange((value: string) => {
            this.maxNum = value
          })
      }
      .width('80%')
      .margin(10)

      Button('选择图片')
        .type(ButtonType.Capsule)
        .fontColor(Color.White)
        .alignSelf(ItemAlign.Center)
        .width('80%')
        .margin(10)
        .onClick(() => {
          // 拉起图库
          this.selectImage()
        })

      Button('图像分割')
        .type(ButtonType.Capsule)
        .fontColor(Color.White)
        .alignSelf(ItemAlign.Center)
        .width('80%')
        .margin(10)
        .onClick(async () => {
          if (!this.chooseImage) {
            hilog.error(0x0000, 'testTag', "imageSegmentation not have chooseImage");
            return
          }
          // 调用图像分割接口
          let visionInfo: subjectSegmentation.VisionInfo = {
            pixelMap: this.chooseImage,
          };
          let config: subjectSegmentation.SegmentationConfig = {
            maxCount: parseInt(this.maxNum),
            enableSubjectDetails: true,
            enableSubjectForegroundImage: true,
          };
          let data: subjectSegmentation.SegmentationResult = await subjectSegmentation.doSegmentation(visionInfo, config);
          let outputString = `主体数量: ${data.subjectCount}\n`;
          outputString += `最大主体数: ${config.maxCount}\n`;
          outputString += `是否需要每个主体: ${config.enableSubjectDetails ? '是' : '否'}\n\n`;
          let segBox : subjectSegmentation.Rectangle = data.fullSubject.subjectRectangle;
          let segBoxString = `整体主体框:\nLeft: ${segBox.left}, Top: ${segBox.top}, Width: ${segBox.width}, Height: ${segBox.height}\n\n`;
          outputString += segBoxString;

          if (config.enableSubjectDetails) {
            outputString += '每个主体框:\n';
            if (data.subjectDetails) {
              for (let i = 0; i < data.subjectDetails.length; i++) {
                let detailSegBox: subjectSegmentation.Rectangle = data.subjectDetails[i].subjectRectangle;
                outputString += `主体 ${i + 1}:\nLeft: ${detailSegBox.left}, Top: ${detailSegBox.top}, Width: ${detailSegBox.width}, Height: ${detailSegBox.height}\n\n`;
              }
            }
          }

          hilog.info(0x0000, 'testTag', "Segmentation result: " + outputString);
          this.dataValues = outputString;
        })
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
  }

  private async selectImage() {
    let uri = await this.openPhoto()
    if (uri === undefined) {
      hilog.error(0x0000, 'imageSegmentation', "uri is undefined");
    }
    this.loadImage(uri);
  }

  private openPhoto(): Promise<Array<string>> {
    return new Promise<Array<string>>((resolve, reject) => {
      let PhotoSelectOptions = new picker.PhotoSelectOptions();
      PhotoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE;
      PhotoSelectOptions.maxSelectNumber = 1;
      let photoPicker = new picker.PhotoViewPicker();
      console.error(TAG, 'PhotoViewPicker.select successfully, PhotoSelectResult uri: ');
      photoPicker.select(PhotoSelectOptions).then((PhotoSelectResult) => {
        console.error(TAG, 'PhotoViewPicker.select successfully, PhotoSelectResult uri: ' + JSON.stringify(PhotoSelectResult));
        resolve(PhotoSelectResult.photoUris)
      }).catch((err: BusinessError) => {
        console.error(TAG, 'PhotoViewPicker.select failed with err: ' + err);
        reject();
      });
    })
  }

  private loadImage(names: string[]) {
    setTimeout(async () => {
      let imageSource: image.ImageSource | undefined = undefined
      let f = await fs.open(names[0], fs.OpenMode.READ_ONLY)
      imageSource = image.createImageSource(f.fd)
      this.chooseImage = await imageSource.createPixelMap()
      hilog.info(0x0000, 'imageSegmentation', `this.chooseImage===${JSON.stringify(this.chooseImage)}`);
    }, 100
    )
  }
}

以上就是本篇文章所带来的鸿蒙开发中一小部分技术讲解;想要学习完整的鸿蒙全栈技术。可以在结尾找我可全部拿到!
下面是鸿蒙的完整学习路线,展示如下:
1

除此之外,根据这个学习鸿蒙全栈学习路线,也附带一整套完整的学习【文档+视频】,内容包含如下

内容包含了:(ArkTS、ArkUI、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、鸿蒙南向开发、鸿蒙项目实战)等技术知识点。帮助大家在学习鸿蒙路上快速成长!

鸿蒙【北向应用开发+南向系统层开发】文档

鸿蒙【基础+实战项目】视频

鸿蒙面经

在这里插入图片描述

为了避免大家在学习过程中产生更多的时间成本,对比我把以上内容全部放在了↓↓↓想要的可以自拿喔!谢谢大家观看!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1989699.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

加密软件有哪些常见的安全特性

1. 数据加密 核心功能&#xff1a;加密软件的核心在于对数据进行加密处理&#xff0c;通过复杂的加密算法&#xff08;如AES、RSA等&#xff09;将明文数据转换为密文&#xff0c;确保数据在存储和传输过程中的安全性。 透明加密&#xff1a;部分加密软件支持透明加密功能&am…

函数实例讲解(六)

文章目录 如何加密电话号码&#xff1f;&#xff08;SUBSTITUTE、REPLACE&#xff09;1、SUBSTITUTE2、REPLACE 用REPT函数做图表学生的考试成绩用A、B、C表示&#xff0c;如何找出哪个等级的学生最多呢&#xff1f;&#xff08;CHAR、CODE、MODE&#xff09;1、CHAR2、CODE3、…

【数据结构】顺序结构实现:特殊完全二叉树(堆)+堆排序

二叉树 一.二叉树的顺序结构二.堆的概念及结构三.堆的实现1.堆的结构2.堆的初始化、销毁、打印、判空3.堆中的值交换4.堆顶元素5.堆向上调整算法&#xff1a;实现小堆的插入6.堆向下调整算法&#xff1a;实现小堆的删除7.堆的创建1.堆向上调整算法&#xff1a;建堆建堆的时间复…

使用Go语言绘制折线统计图教程

使用Go语言绘制折线统计图教程 在本教程中&#xff0c;我们将学习如何使用Go语言及gg包绘制折线统计图&#xff0c;并将图表保存为PNG格式的图片。折线图适用于展示数据的变化趋势&#xff0c;并能直观地展示数据随时间或其他指标的变化。 安装gg包 首先&#xff0c;确保你已…

⌈ 传知代码 ⌋ 改进表情识别

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

Unity入门2——编辑器常用功能

点击文件夹&#xff0c;右键&#xff0c;选择showInExplorer可以在文件管理器中打开 选中多个图片素材&#xff0c;在Inspector里将Texture Type设置为Sprite(2D and UI)即可将图片素材用于UI 右键Hierachy面板的空白区&#xff0c;点击UI->Panel可以创建UI面板&#xf…

GPT-SoVITS-文本转语音(你的声音不再是唯一)

本文将要介绍GPT-SoVITS的安装和使用方法 首先感谢花儿不哭大佬带来的RVC声音克隆 花儿不哭&#xff1a; 花儿不哭的个人空间-花儿不哭个人主页-哔哩哔哩视频 (bilibili.com) GPT-SoVITS下载地址 GitHub - RVC-Boss/GPT-SoVITS: 1 min voice data can also be used to train a …

网络药理学:分子对接之pocasa/proteins.plus/Deepsite网站预测蛋白口袋

前言 配体的结合需要疏水作用&#xff0c;通常来说&#xff0c;疏水性空腔&#xff08;开口小、肚子大、能容纳一定体积的分子结构&#xff09;更有可能成为口袋。当我们复现网络药理学文章时可能经过前面的筛选&#xff0c;依旧有数个乃至数十个蛋白需要做分子对接验证。此时如…

算法——动态规划:基础

文章目录 一、基本介绍二、案例——斐波那契数列1. 基本介绍2. 递归实现3. 动态规划3.1 重叠子问题3.2 最优子结构3.3 无后效性3.4 性质的总结 4. 使用 动态规划 的思想实现4.1 自顶向下 的 递归4.2 自底向上 的 递推4.3 两种思路的简单比较 三、总结 一、基本介绍 动态规划&a…

python语言day4 函数 生成器yield、next关键字 装饰器

一、 函数 定义&#xff1a; def info(): print("执行info()函数") 直接调用方法和封装一个函数&#xff1a; 使用信息发送的功能为例 登录163网易免费邮-你的专业电子邮局 1&#xff09;开启POP3/SMTP服务&#xff0c;会得到对应的授权码&#xff0c;也就是登陆…

2024年旗舰骨传导耳机大对比:南卡、韶音和墨觉,哪款最值得购买?

作为专注于数码产品的博主&#xff0c;我对骨传导耳机的迅猛发展深有感触。这类耳机以其与众不同的技术和设计风格&#xff0c;成功捕捉了消费者的兴趣。它们独特的工作原理不仅保留了使用者对周围环境的感知&#xff0c;还能提供清晰的音乐播放和通话体验&#xff0c;特别适合…

第三方软件检测机构服务类型

在信息技术飞速发展的今天&#xff0c;软件产品的质量已成为企业竞争力的重要组成部分。卓码软件测评这家第三方软件检测机构致力于提供一流的软件测试服务&#xff0c;帮助企业确保其软件产品的可靠性和安全性。 一、项目验收测试&#xff1a;确保交付质量   项目验收测试是…

力扣-240.搜索二维矩阵(2)

刷力扣热题–第二十七天:240.搜索二维矩阵(2) 新手第二十七天 奋战敲代码&#xff0c;持之以恒&#xff0c;见证成长 1.题目简介 2.题目解答 这道题的想法就是,整体遍历,在遇到比target还大的,就停止这行的遍历,然后转过去继续遍历下一行,如果有一行的开头大于target,直接返回…

嘉盛平台的代理返佣机制:一份详细的说明书

在金融市场合作模式的多样性中&#xff0c;嘉盛平台的代理返佣机制无疑是一个引人注目的亮点。想了解更多关于嘉盛平台的代理返佣机制吗&#xff1f;本文将为您详细解答。嘉盛开户MT4平台开户链接 &#xff1a;https://application.jszhanghao.com/cn-meta/step/1?ibcodeFXAMM…

Windows--WSL2--Ubuntuon--Docker

编写目的&#xff1a; 在Windows上安装Docker&#xff0c;用Docker安装Gitlab、Jenkins等软件。 文章记录一下Windows上安装Docker的过程。 参考文档&#xff1a; 旧版 WSL 的手动安装步骤 | Microsoft Learn 下面用"参考文档"代替 目录 第一步&#xff1a;启…

RK3568平台开发系列讲解(文件系统篇)FLASH 均衡擦写(UBI)

🚀返回专栏总目录 文章目录 一、UBI均衡二、日志打印三、常见打印四、erase_worker四、ensure_wear_leveling五、wear_leveling_worker上层应用通过逻辑地址来访问存储设备,FTL把不同的逻辑地址映射到Nand Flash中的不同位置。 一、UBI均衡 Ubi擦写均衡在ubi驱动中c 处理,u…

66 函数精彩案例

1 编写函数&#xff0c;接收任意多个实数&#xff0c;返回一个元组&#xff0c;其中第一个元素为所有参数的平均值&#xff0c;其他元素为所有参数中大于平均值的实数。 def func(*parameter):avg sum(parameter) / len(parameter) # 平均值g [i for i in parameter if i &…

哈萨克语驾考学习软件求推荐?

哈语驾考APP专门为哈萨克族考驾照的学员提供了科目一科目四题库在线练习和模拟考试&#xff0c;是一款哈汉双语版本的驾考学习APP。软件内可同时切换哈萨克语题库和语言文字&#xff0c;有多种学习模式。题库同步车管所考题&#xff0c;通过率高。包含了科一、科四模拟考试、路…

PP 8 创建工艺路线

事务代码&#xff1a;CA01(注&#xff1a;定额工艺路线&#xff1a;CA21(重复制造)) 组和组计数器确定唯一工艺路线 创建一个组 把组分配给物料 物料有多个工艺路线 可以把组分给多个物料 如果打上删除标识&#xff0c;工艺路线无效

前端(四):前后端分离开发(YAPI的使用)

一、引入 1、前后端混合开发&#xff08;早期&#xff09;&#xff1a;将前端、后端、数据库混杂在一起写&#xff0c;前后前全部在一个工程中。沟通成本高、分工不明确、不便于管理、不便于维护和扩展。 2、前后端分离开发&#xff1a;前端工程和后端工程&#xff0c;为了前…