当前位置: 首页 > news >正文

鸿蒙AI功能开发【hiai引擎框架-人脸比对】 基础视觉服务

hiai引擎框架-人脸比对

介绍

本示例展示了使用hiai引擎框架提供的人脸比对能力。

本示例模拟了在应用里,选择两张图片,计算两个图中最大人脸的相似度

需要使用hiai引擎框架人脸比对接口@hms.ai.face.faceComparator。

效果预览

1

使用说明:

  1. 在手机的主屏幕,点击”faceComparatorDemo“,启动应用。
  2. 点击“选择图片”按钮,默认自带一张图片,用户可以在图库中选择图片,或者通过相机拍照。
  3. 点击“人脸比对”按钮,比对人脸信息,结果通过文本展示。

具体实现

本示例展示的控件在@hms.ai.face.faceComparator.d.ets定义了文字比对API:

    function compareFaces(visionInfo1: VisionInfo, visionInfo2: VisionInfo): Promise<FaceCompareResult>;

业务使用时,需要先进行import导入faceComparator 调用通用人脸比对接口,并传入想要比对的图片,接收处理返回的结果(文字信息)。参考:

import { faceComparator } from '@kit.CoreVisionKit';
import { image } from '@kit.ImageKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { picker, fileIo } from '@kit.CoreFileKit';@Entry
@Component
struct Index {@State chooseImage: PixelMap | undefined = undefined@State chooseImage1: PixelMap | undefined = undefined@State dataValues: string = ''build() {Column() {Image(this.chooseImage).objectFit(ImageFit.Fill).height('30%').accessibilityDescription("默认图片1")Image(this.chooseImage1).objectFit(ImageFit.Fill).height('30%').accessibilityDescription("默认图片2")Text(this.dataValues).copyOption(CopyOptions.LocalDevice).height('15%').margin(10).width('60%')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 || !this.chooseImage1) {hilog.error(0x0000, 'FaceCompareSample', `Failed to choose image. chooseImage: ${this.chooseImage}`);;return;}// 调用人脸比对接口let visionInfo: faceComparator.VisionInfo = {pixelMap: this.chooseImage,};let visionInfo1: faceComparator.VisionInfo = {pixelMap: this.chooseImage1,};try {let data:faceComparator.FaceCompareResult = await faceComparator.compareFaces(visionInfo, visionInfo1);let faceString = "相似度:"+ this.toPercentage(data.similarity)+((data.isSamePerson)?"。 是":"。 不是")+"同一个人";hilog.info(0x0000, 'FaceCompareSample', `Succeeded in face detect:${faceString}`);this.dataValues = faceString;} catch (error) {hilog.error(0x0000, 'FaceCompareSample', `人脸比对出错: ${error}`);this.dataValues = "人脸比对出错,请确保两张图片中都有人脸。";}})}.width('100%').height('100%').justifyContent(FlexAlign.Center)}private toPercentage(num: number): string {return `${(num * 100).toFixed(2)}%`;}private async selectImage() {let uri = await this.openPhoto()if (uri === undefined) {hilog.error(0x0000, 'FaceCompareSample', "Failed to defined uri.");}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 = 2;let photoPicker = new picker.PhotoViewPicker();photoPicker.select(PhotoSelectOptions).then((PhotoSelectResult) => {resolve(PhotoSelectResult.photoUris)}).catch((err:BusinessError) => {hilog.error(0x0000, 'faceDetectorSample', `Failed to get photo image uri. code:${err.code},message:${err.message}`);reject();});})}private loadImage(names: string[]) {setTimeout(async () => {let imageSource: image.ImageSource | undefined = undefined;let fileSource = await fileIo.open(names[0], fileIo.OpenMode.READ_ONLY);imageSource = image.createImageSource(fileSource.fd);this.chooseImage = await imageSource.createPixelMap();fileSource = await fileIo.open(names[1], fileIo.OpenMode.READ_ONLY);imageSource = image.createImageSource(fileSource.fd);this.chooseImage1 = await imageSource.createPixelMap();}, 100)}
}

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

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

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

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

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

鸿蒙面经

在这里插入图片描述

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

相关文章:

  • 【OpenCV C++20 学习笔记】霍夫圆形变换-Hough Circle Transform
  • Can‘t import openai in Node
  • 2024 某公司python 面试真题
  • C# Unity 面向对象补全计划 泛型约束
  • 代码随想录算法训练营第三十九天 | 322. 零钱兑换、279.完全平方数、139.单词拆分、多重背包理论基础、背包问题总结
  • 到底是低度还是高度的白酒对身体的伤害更大?
  • Linux网络编程3
  • 20240807 每日AI必读资讯
  • UNI-APP_点击,长按,触摸,结束触摸事件
  • 【C/C++笔记】:易错难点3 (二叉树)
  • Redis哨兵集群部署 一主两从三哨兵以及持久化
  • 动态规划之——背包DP(进阶篇)
  • 网络原理(2)——封装和分用
  • 鸿蒙图形开发【3D引擎接口示例】
  • 数据结构——排序(1):插入排序
  • ----------
  • 【前端学习】-粗谈选择器
  • Android框架之Volley
  • Angular6错误 Service: No provider for Renderer2
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • ES6 学习笔记(一)let,const和解构赋值
  • ES6--对象的扩展
  • iOS | NSProxy
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • JavaScript类型识别
  • JavaScript新鲜事·第5期
  • js对象的深浅拷贝
  • js继承的实现方法
  • Python进阶细节
  • SpringBoot几种定时任务的实现方式
  • vagrant 添加本地 box 安装 laravel homestead
  • Web标准制定过程
  • 成为一名优秀的Developer的书单
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • #android不同版本废弃api,新api。
  • #HarmonyOS:基础语法
  • #QT(一种朴素的计算器实现方法)
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • ${ }的特别功能
  • (C语言)逆序输出字符串
  • (ros//EnvironmentVariables)ros环境变量
  • (SpringBoot)第二章:Spring创建和使用
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (回溯) LeetCode 131. 分割回文串
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (实战篇)如何缓存数据