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

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 = undefinedlet 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.ppmy.cn/news/1507512.html

相关文章

Npm使用教程(详细讲解)

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言 npm&#xff08;Node Package Manager&#xff09;是世界上最大的包管理器和软件注册表&#xff0c;专为 Node.js 生态系统设计。它是Node.js 的默认包管理工具&#xff0c;用于管理 JavaScript 项目的依赖项和包的安装、…

R 语言学习教程,从入门到精通,R 数据类型(6)

1、R 数据类型 数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。 变量的类型决定了变量存储占用的空间&#xff0c;以及如何解释存储的位模式。 R 语言中的最基本数据类型主要有三种&#xff1a; 数字 逻辑 文本 数字常量主要有两种&#xff1a; 逻辑类型在许多…

Python知识点:使用Transformers进行预训练语言模型应用

使用Transformers库&#xff08;Hugging Face提供&#xff09;进行预训练语言模型的应用涉及几个步骤&#xff1a;安装库、加载预训练模型、进行文本生成或分类任务。以下是一个详细的示例流程。 安装依赖 首先&#xff0c;确保你安装了Transformers和其他必要的库&#xff1…

从数据分析到智能生产:AI在工业中的应用与未来

导语 | 人工智能技术的迅猛发展&#xff0c;正在引领第四次工业革命悄然而至。尽管 AI 技术在工业领域的部署仍有诸多难题亟待解决&#xff0c;但这并不能阻挡历史趋势的车轮滚滚向前&#xff0c;AI 正在为工业领域带来新的变革。今天&#xff0c;我们特邀了上海腾展长融董事 &…

iOS ------ 事件响应链

响应者链 响应者链是由一系列链接在一起的响应者&#xff08;UIResponser之类&#xff1a;UIApplication&#xff0c;UIViewController&#xff0c;UIView&#xff09;注组成的。一般情况下&#xff0c;一条响应链开始于第一响应者&#xff0c;结束于application对象。如果一个…

【生成式人工智能-七-大型语言模型的可解释性】

大型语言模型的可解释性 语言模型是如何工作的1.把文字变成Token2.将Token表示成向量3.考虑上下文Attention4.编码器和解码器 语言模型无法解释体现在那些方面&#xff1f;语言模型通过什么方法可以获得解释性通过语言模型的神经网络进行分析找出哪些是影响输出的关键输入分析a…

某永PM2项目管理系统ExcelIn接口任意文件上传漏洞复现 [附POC]

文章目录 某永PM2项目管理系统ExcelIn接口任意文件上传漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现某永PM2项目管理系统ExcelIn接口任意文件上传漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相…

cpp笔记07:STL

STL 基本概念 STL&#xff08;Standard Template Library&#xff0c;标准模板库&#xff09; STL从广义上分为&#xff1a;容器&#xff08;container&#xff09;算法&#xff08;algorithm&#xff09;迭代器&#xff08;iterator&#xff09; 容器和算法之间通过迭代器…

Postgresql数据库密码忘记的解决方法

如果你忘记了PostgreSQL数据库的密码&#xff0c;可以通过以下方法重置密码&#xff1a; 方法一&#xff1a;修改 pg_hba.conf 文件 找到 pg_hba.conf 文件&#xff1a; 这个文件通常位于 PostgreSQL 数据目录中。你可以通过以下命令找到该文件的位置&#xff1a; 复制代码 …

【前端】NodeJS:NodeJS模块化

文章目录 1 NodeJS模块化1.1 模块化与模块1.2 模块化项目1.3 模块化好处 2 模块暴露数据2.1 模块初体验2.2 暴露数据 3 导入&#xff08;引入&#xff09;模块4 导入模块的基本流程5 CommonJS规范 1 NodeJS模块化 1.1 模块化与模块 将一个复杂的程序文件依据一定规则&#xf…

leetcode数论(836. 矩形重叠)

前言 经过前期的基础训练以及部分实战练习&#xff0c;粗略掌握了各种题型的解题思路。现阶段开始专项练习。 数论包含最大公约数(>2个数)、最大公约数性质、最小公倍数、区间范围质因素计数(最下间隔)、质因素分解、判断质数、平方根、立方根、互质、同余等等。 描述 矩…

RK3399平台开发系列讲解(内核入门篇)module_init 的加载过程

🚀返回专栏总目录 文章目录 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本文要研究的内容为编译进内核的驱动系统是如何运行的? 在驱动程序中,module_init 宏定义了驱动的入口函数,在模块加载时被内核自动调用, 该宏定义在内核源码目录下的“include/linux/…

rabbitmq出现Management API returned status code 500 -

我们在使用rabbitMq点击交换机时会发现提示以下错误&#xff1a; 解决方案&#xff1a; 1、进入容器中 docker exec -it rabbitmq的镜像id /bin/bash2、cd到目录/etc/rabbitmq/conf.d/ cd /etc/rabbitmq/conf.d/ 3、执行该命令 echo management_agent.disable_metrics_co…

【C++ 面试 - 基础题】每日 3 题(九)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

React 条件判断

在 React 中&#xff0c;可以通过 JavaScript 的条件语句来动态渲染组件或元素。 以下是几种常用的在 React 中处理条件渲染的方法&#xff1a; 1. 使用 if 语句 在 render 方法或函数组件的返回值中使用 if 语句来决定渲染内容。 实例 import React from react; import R…

使用线上电子签合同靠谱吗?被国家认可的8款

盘点国内外安全靠谱的8大电子签合同工具&#xff1a;E签宝、上上签、法大大、DocuSign、腾讯电子签、爱签、Adobe Acrobat Sign、契约锁。 在互联网金融快速发展的今天&#xff0c;电子签合同已经成为新常态&#xff0c;它不仅简化了传统的文档处理流程&#xff0c;也提高了交易…

vue的diff算法的【双端比较】策略

Vue 的 diff 算法中的双端比较策略是一种高效的节点比较方法&#xff0c;通过同时从新旧节点列表的两端进行比较&#xff0c;尽可能减少节点的移动操作&#xff0c;从而提高性能。以下是详细的步骤和解释&#xff1a; 双端比较策略的步骤 初始化指针&#xff1a; 设置四个指针…

MySQL运维-读写分离

介绍 读写分离&#xff0c;简单地说是把对数据库的读和写操作分开&#xff0c;以对应不同的数据库服务器。主数据库提供写操作&#xff0c;从数据库提供读操作&#xff0c;这样能有效地减轻单台数据库的压力 通过MyCat即可轻易实现上述功能&#xff0c;不仅可以支持MySQL&…

[Qt][QWidget]详细讲解

目录 1.概述2.QWidget核心属性1.简介2.核心属性概览 3.QWidget常用属性1.enabled2.geometry1.是什么&#xff1f;2.Window Frame的影响3.相关API4.注意 3.windowTitile4.windowIcon5.windowOpacity6.cursor8.font9.toolTip10.focusPolicy11.styleSheet 1.概述 Widget是Qt中的核…

Allegro创建Xnet操作指导

1.Analyze–Model Assigment 点击OK 3.点击是 4.选中器件&#xff0c;点击Create Model 5.点击OK 6.填写参数 点击OK&#xff0c;设置成功&#xff01;&#xff01;