华为创新赛获奖复盘:把手机变成“AI 哨兵”,Core Vision 实时物体检测开发实战(附危险品预警源码)
前言:在《智伴》的“智能看护”模块中,我们需要解决一个家长极其关注的痛点:孩子看屏幕是不是太近了? 传统的解决方案往往依赖专用的距离传感器,而《智伴》利用 HarmonyOS
Core Vision Kit的 多目标检测 (Object Detection) 能力,仅凭一颗普通的前置摄像头,就实现了精准的人体检测与距离预警。
一、 原理:AI 如何“看见”距离?
objectDetection 是 HarmonyOS 提供的一项端侧 AI 能力,它能从图像中识别出 80 多种常见物体(支持 15 类标签输出),包括人、猫、狗、植物等。
对于“距离监测”,我们并不需要测量精确的物理距离(如 30cm),而是通过**“人体/人脸在画面中的占比”**来估算相对距离。
- 当孩子离屏幕远时,人脸 BoundingBox 较小。
- 当孩子离屏幕近时,人脸 BoundingBox 变大。
通过设定一个阈值,当 BoundingBox 面积超过画面一定比例时,即可判定为“距离过近”。
二、 实战:构建后台监控组件 (MonitorComponent)
我们将深入 entry/src/main/ets/pages/look/MonitorComponent.ets,解析这一功能的实现。
1. 核心流程
- 开启相机:获取前置摄像头的预览流。
- 获取帧数据:通过
ImageReceiver实时获取图像帧。 - AI 推理:调用
ObjectDetector对图像进行分析。 - 业务判定:根据检测结果(Label, BoundingBox)触发警告。
2. 初始化检测器
import { objectDetection } from '@kit.CoreVisionKit';
private detector?: objectDetection.ObjectDetector;
async initDetector() {
try {
// 异步创建检测器实例
this.detector = await objectDetection.ObjectDetector.create();
} catch (error) {
console.error(`检测器创建失败: ${error.code}`);
}
}
3. 数据流转:从 Camera 到 AI
这是最关键的一步。我们需要将相机输出的 Image 对象转换为 AI 引擎可接受的 PixelMap,并进行必要的旋转处理(因为前置摄像头图像通常是旋转的)。
// 相机数据回调
private onImageArrivalCallback = async () => {
// 1. 获取最新一帧图像
let image = await this.imageReceiver.readNextImage();
if (!image) return;
// 2. 转换为 PixelMap
let component = await image.getComponent(image.ComponentType.JPEG);
let pixelMap = await image.createPixelMap(component.byteBuffer, ...);
// 3. 处理图像旋转 (前置摄像头通常需要旋转 270 度并镜像)
if (this.isFontCamera) {
await pixelMap.rotate(270);
await pixelMap.flip(true, false); // 镜像翻转
}
// 4. 构建 AI 请求
let request: visionBase.Request = {
inputData: { pixelMap: pixelMap }
};
// 5. 执行推理
if (this.detector) {
let response = await this.detector.process(request);
this.analyzeResult(response, pixelMap.getImageInfoSync().size);
}
image.release(); // 务必释放资源
}
4. 业务逻辑:你是谁?你在哪?
ObjectDetectionResponse 返回一个 objects 数组。我们需要从中筛选出“人”。
private analyzeResult(data: objectDetection.ObjectDetectionResponse, imgSize: image.Size) {
// 标签 ID 13 代表 "人体" (Human)
// 标签 ID 5 代表 "人脸" (Face) - 具体 ID 需查阅官方文档或枚举
const persons = data.objects.filter(item => item.labels.includes(13));
if (persons.length === 0) {
// 无人:暂停播放视频,节省电量并防止空放
this.onKidChange(KidType.NONE);
return;
}
// 获取置信度最高的目标
const person = persons[0];
if (person.score < 0.5) return; // 过滤低置信度结果
// 计算 BoundingBox 在画面中的占比
const box = person.boundingBox;
const boxArea = box.width * box.height;
const screenArea = imgSize.width * imgSize.height;
const ratio = boxArea / screenArea;
// 判定距离
if (ratio > 0.4) {
// 占比超过 40%,判定为距离过近 -> 触发全屏弹窗警告
this.showTooCloseWarning();
} else {
this.onKidChange(KidType.ONE);
}
}
三、 性能优化:平衡算力与功耗
在后台持续运行 AI 检测非常耗电。我们在 MonitorComponent 中做了一个重要的优化:降频检测。
const CHECK_INTERVAL = 250; // 检测间隔 250ms (即每秒 4 帧),注意如果设备不支持NPU则需要设置每秒3帧左右。
private lastTime: number = 0;
private onImageArrivalCallback = () => {
// ... 获取 image ...
// 只有当距离上次检测超过 250ms 时才进行 AI 处理
if (Date.now() - this.lastTime >= CHECK_INTERVAL) {
this.lastTime = Date.now();
// ... 执行 AI 检测 ...
}
// ... 释放 image ...
}
对于“看护”场景,每秒 4 次的检测频率完全足够判断坐姿变化,同时将 NPU 和 CPU 的负载降低了 80% 以上。
四、 总结
通过 objectDetection,《智伴》实现了一个隐形的“电子保姆”。它不需要昂贵的硬件,只需要调用几行 ArkTS API,就能利用设备自带的 AI 算力守护孩子的视力健康。
这种“软件定义硬件能力”的思路,正是 HarmonyOS 开发的魅力所在。
下一篇,我们将进入更具挑战性的领域——骨骼点检测,看看《智伴》是如何实现酷炫的体感游戏的。
1558



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



