HarmonyOS 开发:图像识别全栈实战
从超市扫码支付到机场登机牌核验,从快递单号录入到电子发票识别,图像识别早已融入日常生活的毛细血管。而在 HarmonyOS 生态中,这一能力被封装为ScanKit,一套高性能、低功耗、端侧运行的视觉识别服务。与传统依赖云端 API 的方案不同,ScanKit 支持纯本地识别,无需网络连接,既保障了用户隐私,又提升了响应速度。更重要的是,它原生支持一图多码、倾斜码、模糊码、反光码等复杂场景,极大降低
目录
- 前言
- 图像识别技术介绍
- 关于图像识别
- 使用场景
- 实现图像识别
- 图像识别功能扩展与工程优化
- 结束语
前言
从超市扫码支付到机场登机牌核验,从快递单号录入到电子发票识别,图像识别早已融入日常生活的毛细血管。而在 HarmonyOS 生态中,这一能力被封装为 ScanKit ,一套高性能、低功耗、端侧运行的视觉识别服务。与传统依赖云端 API 的方案不同,ScanKit 支持纯本地识别,无需网络连接,既保障了用户隐私,又提升了响应速度。更重要的是,它原生支持 一图多码、倾斜码、模糊码、反光码 等复杂场景,极大降低了开发门槛。那么本文就来详细介绍如何在HarmonyOS应用中识别图像数据,包括图像的获取、预处理、识别和结果处理。无论你是开发零售收银系统、智慧物流 App,还是企业内部资产管理工具,本文都能将为你提供可直接落地的技术方案。
图像识别技术介绍
图像识别技术涉及从图像中提取信息、识别对象和特征。在HarmonyOS中,可以通过集成华为机器学习服务(HMS Machine Learning Service)中的图像识别服务来实现这一功能,该服务提供了包括但不限于人脸检测、图像分类、对象识别等多种能力。虽然早期图像识别依赖云端模型,但随着 NPU(神经网络处理器)在移动设备的普及,端侧 AI 成为主流趋势。HarmonyOS 的 ScanKit 正是这一理念的体现:
- 离线可用:所有识别逻辑在设备本地完成;
- 低延迟:识别速度 < 100ms(中高端机型);
- 高兼容:支持 NV21、YUV、RGB 等多种图像格式;
- 多码并发:单帧图像可同时识别多个不同类型码(如 QR + Code128)。
这里需需注意:本文示例主要是在于 条码/二维码识别(属于“图像识码”子集),而非通用图像分类或目标检测,如果想要使用非通用图像分类需要使用 Vision Kit 或 ML Kit。
关于图像识别
其实图像数据识码能力支持对相机预览流数据中的码图进行扫描识别,并获取信息。在HarmonyOS中,图像识别通常涉及以下步骤:
1.获取图片:从本地存储或应用资源中获取图片。
2.预处理:对图片进行必要的预处理,如调整大小、增强对比度等。
3.处理结果:根据识别结果执行后续操作。
⚙️ 关于能力边界说明:
- 输入源灵活:支持image.PixelMap、byteBuffer(如相机预览流)、本地文件路径;
- 输出丰富:除码值(rawValue)外,还返回码类型(format)、置信度、角点坐标、变焦比等;
- 不支持自定义模型:ScanKit 为封闭式服务,无法加载第三方训练模型;
- 仅限码类识别:不适用于文字识别(OCR)、人脸、商品等非码类目标。
使用场景
关于图像识别的使用场景,图像数据识码能力支持对相机预览流数据中的条形码、二维码、MULTIFUNCTIONAL CODE进行识别,并获得码类型、码值、码位置信息和相机变焦比。该能力可用于一图单码和一图多码的识别,比如条形码、付款码等。关于行业场景深化:
| 行业 | 应用场景 | 技术价值 |
|---|---|---|
| 零售 | 扫码支付、商品溯源 | 提升收银效率,防伪验证 |
| 物流 | 快递单号扫描、包裹分拣 | 自动化录入,减少人工错误 |
| 交通 | 电子票务、登机牌核验 | 无接触通行,提升体验 |
| 政务 | 健康码、身份证二维码 | 快速身份核验,保障隐私 |
| 办公 | 发票报销、文档归档 | 自动提取结构化数据 |
需要注意:支付类场景需额外安全加固,如结合活体检测、设备指纹、交易限额等风控策略。
实现图像识别
图像数据识码能力支持对相机预览流数据中的条形码、二维码、MULTIFUNCTIONAL CODE进行识别,并返回码图的值、类型、码的位置信息(码图最小外接矩形左上角和右下角的坐标,QR码支持返回四个点坐标)和相机变焦比。下面介绍一个为调用detectBarcode.decodeImage接口获取码图信息的示例,具体如下所示。
1、导入接口模块
导入图像识码接口和相关接口模块,该模块提供了图像识码参数和方法,导入方法如下。
import { detectBarcode, scanBarcode, scanCore } from '@kit.ScanKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { camera } from '@kit.CameraKit';
import { image } from '@kit.ImageKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
2、使用Camera Kit
使用Camera Kit启动相机能力,实现双路预览功能。
3、实时获取预览图像数据
通过ImageReceiver实时获取预览图像数据,调用detectBarcode.decodeImage接口解析图像数据。但是需要在识别完成后再释放图像数据,具体示例如下所示:
// 从ImageReceiver获取imgComponent: image.Component,预览流设置的宽高: width, height
function decodeImageBuffer(imgComponent: image.Component, width: number, height: number) {
let byteImg: detectBarcode.ByteImage = {
byteBuffer: imgComponent.byteBuffer,
// 相机预览流数据旋转90°
width: height,
height: width,
format: detectBarcode.ImageFormat.NV21
};
let options: scanBarcode.ScanOptions = {
scanTypes: [scanCore.ScanType.ALL],
enableMultiMode: true,
enableAlbum: false
};
try {
detectBarcode.decodeImage(byteImg, options).then((result: detectBarcode.DetectResult) => {
}).catch((error: BusinessError) => {
})
} catch (error) {
}
}
4、处理识别结果
detectBarcode.DetectResult中返回的cornerPoints可参考以下说明使用,具体如下所示:
- 因为屏幕自然方向和摄像头传感器方向不同,所以cornerPoints四个点的坐标需按屏幕自然方向对应的坐标系转换,其中,四个点的对应转换逻辑如下(假设创建的相机预览流宽高为1080 * 1920)。
- 右下角(x, y):(1080 - cornerPoints[0].y, cornerPoints[0].x)
- 左下角(x, y):(1080 - cornerPoints[1].y, cornerPoints[1].x)
- 左上角(x, y):(1080 - cornerPoints[2].y, cornerPoints[2].x)
- 右上角(x, y):(1080 - cornerPoints[3].y, cornerPoints[3].x)
- 当创建的相机预览流宽高和实际预览组件XComponent的宽高不一致时,cornerPoints四个点的坐标需按缩放比例转换,比如相机预览流宽高为1080 * 1920,Xcomponent的宽高为width * height,则坐标缩放比例ratio为:width / 1080, 最终转换后的坐标为(x * ratio, y * ratio)。
图像识别功能扩展与工程优化
虽然 ScanKit 提供了基础识别能力,但在生产环境中,还需考虑以下优化点:
1. 动态对焦与曝光优化
通过 Camera Kit 设置对焦点为码图区域,提升模糊场景下的识别率:
cameraManager.setAfMode(camera.AF_MODE_CONTINUOUS_PICTURE);
cameraManager.triggerAf(camera.AF_TRIGGER_START);
2. 连续识别 vs 单次识别
- 连续模式:适合扫码枪类应用,持续识别直至成功;
- 单次模式:适合点击“扫码”按钮触发,识别一次即停。
3. 结果缓存与去重
同一码图可能被连续多帧识别,需缓存rawValue并设置 2 秒去重窗口,避免重复回调。
4. 无障碍支持
为视障用户提供语音反馈:“已识别二维码,内容为 https://...”。
5. 性能监控
通过hilog记录识别耗时,用于线上性能分析:
const start = Date.now();
detectBarcode.decodeImage(...).then(() => {
hilog.info(0x0001, 'Scan', `识别耗时: ${Date.now() - start}ms`);
});
结束语
本文不仅完整复现了 HarmonyOS 图像识码的标准流程,更深入剖析了坐标转换、性能优化、工程落地等关键问题。ScanKit 作为 HarmonyOS 生态的重要基础设施,正以“开箱即用、安全高效”的特性,赋能千行百业的数字化转型。经过上面的介绍,不难看到图像识别是HarmonyOS开发中的一项强大功能,它为应用带来了更多的可能性和创新空间,而且带来的功能也是非常强大的。通过本文的介绍,想必大家都应该了解了如何在HarmonyOS应用中实现对图像数据的识别,在后面的鸿蒙开发中也能很好的运用这些技能。随着技术的不断发展,图像识别技术将在HarmonyOS生态中扮演越来越重要的角色,给用户带来更加丰富和便捷的体验。作为开发者,我们不仅要会调用 API,更要理解其背后的坐标系、内存模型、性能边界。唯有如此,才能构建出既流畅又可靠的扫码体验,真正让技术服务于人。现在,就将本文的方案集成到你的 HarmonyOS 应用中,开启高效、精准、安全的图像识别之旅!
更多推荐



所有评论(0)