1. 从零开始:为什么选择HarmonyOS Core Vision Kit?
最近在捣鼓一个娱乐向的小应用,核心功能是想让用户上传两张照片,看看里面的人脸有多像,比如“测测你和明星的相似度”或者“看看你和朋友是不是失散多年的兄弟姐妹”这种。一开始我琢磨着,这不得找个成熟的人脸识别SDK,再找个特征比对算法,说不定还得处理活体检测(虽然娱乐应用可能不需要),想想就头大。后来偶然翻看HarmonyOS的文档,发现了Core Vision Kit里的faceComparator模块,试了一下,简直是为这种轻量级、娱乐化的需求量身定做的。
简单来说,HarmonyOS Core Vision Kit把之前需要好几步才能完成的事情,打包成了一个开箱即用的“瑞士军刀”。你不用再分别去集成人脸检测、特征点提取、特征向量计算和相似度比对这些独立的库或服务。它提供了一个统一的faceComparator对象,你只需要给它两张图片(以特定的数据格式),它就能在设备本地(对,完全不用联网!)完成从检测人脸到给出相似度分数的全过程。这对于注重用户隐私的娱乐应用来说是个巨大优势,因为所有照片数据都在用户自己的手机上处理,压根不会上传到任何服务器。
我实测下来,整个流程非常“稳”。从调用API到拿到结果,在主流HarmonyOS设备上基本都在150毫秒以内,用户体验很流畅。而且,因为它底层调用的是系统级的AI能力,所以在功耗和性能优化上比我们自己集成第三方SDK要省心得多。对于想快速验证想法、或者构建一个趣味性功能的开发者来说,这大大降低了门槛。你不需要是计算机视觉专家,只要会用JavaScript/TypeScript(ArkUI-X开发框架),就能把强大的AI能力集成到你的应用里。
2. 动手前的准备:环境与权限一步到位
光说好没用,咱们得能跑起来才行。第一步就是把开发环境搭好。这里我强烈推荐使用DevEco Studio,版本最好在4.0以上,它对ArkUI-X的支持更完善。创建一个新的“Empty Ability”项目,模板选择“ArkTS”就行,这就是我们开发ArkUI-X应用的基础。
项目创建好后,关键的一步是添加依赖。我们需要用到两个核心的Kit:一个是处理图像的@ohos.image,另一个就是今天的主角@ohos.ai.cv.face。打开项目根目录下的package.json文件,在dependencies部分添加它们。这里有个小细节要注意,版本号最好和你的HarmonyOS SDK版本保持一致,避免兼容性问题。我用的SDK是5.0.3.15,所以配置如下:
"dependencies": {
"@ohos.ai.cv.face": "5.0.3.15",
"@ohos.image": "5.0.3.15"
}
保存后,IDE通常会提示你进行同步(Sync),点击执行,它就会自动下载这些依赖包。
接下来是权限配置。我们的应用需要从相册选择图片,如果未来想扩展相机拍照功能,也需要相机权限。这些都需要在module.json5文件里声明。找到你的模块(entry)下的这个文件,在module字段里添加requestPermissions:
"requestPermissions": [
{
"name": "ohos.permission.READ_MEDIA",
"reason": "$string:reason_media", // 记得在strings.json里定义这个原因
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "always"
}
},
{
"name": "ohos.permission.CAMERA",
"reason": "$string:reason_camera",
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "always"
}
}
]
这里我多申请了一个相机权限,为后续功能扩展留个余地。权限的reason字段很重要,它会在系统向用户弹窗申请权限时显示,所以一定要在resources/base/element/string.json里用通俗的语言写清楚,比如“需要访问您的相册来选取用于人脸比对的照片”或“需要使用相机拍摄照片进行实时比对”。
2.1 真机调试的必要性
人脸比对这类涉及AI推理和相机硬件的功能,在模拟器上运行可能会有问题,或者无法完全模拟真实性能。所以,我强烈建议准备一台搭载HarmonyOS 5.0或以上版本的华为真机进行调试。用数据线连接电脑,在DevEco Studio中选择你的设备,就可以直接运行和调试了。这是确保所有功能正常工作的最快方式。
3. 打造核心:双图比对功能的实现
环境准备好了,我们就开始撸代码。首先来设计一个最简单的界面:能展示两张图片,有两个按钮分别用于“选择图片”和“开始比对”,还有一个区域用来显示结果。
3.1 构建基础界面
我们用ArkUI的声明式语法来构建页面。创建一个FaceCompare组件,里面用Column纵向布局,依次放上图片展示区、按钮区和结果区。图片展示我用了一个Grid组件,设置两列,这样两张图就能并排显示了。
import { faceComparator, VisionInfo, FaceCompareResult, BusinessError } from '@kit.CoreVisionKit';
import { image, ImageFormat } from '@ohos.image';
import { photoPicker } from '@ohos.file.picker';
import { common } from '@kit.ArkUI';
@Entry
@Component
struct FaceCompare {
// 存储用户选择的图片,用PixelMap格式
@State images: Array<image.PixelMap> = [];
// 存储比对结果文本
@State result: string = '请选择两张人脸图片进行比对';
// 控制加载状态,防止重复点击
@State isComparing: boolean = false;
build() {
Column({ space: 20 }) {
// 1. 图片展示区
Grid({ columns: 2, gap: 10 }) {
ForEach(this.images, (img: image.PixelMap, index: number) => {
Image(img)
.width('100%')
.height(200)
.objectFit(common.ImageFit.Cover)
.borderRadius(10)
}, (img: image.PixelMap) => img.hashCode.toString())
}
.width('100%')
.height(220)
.padding(10)
// 2. 操作按钮区
Row({ space: 30 }) {
Button('选择图片')
.onClick(() => this.se

1242

被折叠的 条评论
为什么被折叠?



