标签: #HarmonyOS #VisionKit #CameraKit #人脸识别 #安防监控 #NPU


⚡ 前言:系统级 AI 的降维打击

为什么推荐用 Vision Kit 而不是 OpenCV?

  • 零体积:无需打包模型文件,APK 体积立减 50MB+。
  • 低功耗:直接调用麒麟芯片 NPU,而不是用 CPU 硬算,手机不发烫。
  • 隐私安全:数据流不出系统内核,完全离线处理。

🏗️ 一、 架构设计:双路预览流

要实现“一边预览画面,一边分析人脸”,我们需要利用鸿蒙 Camera Kit 的 双路输出 能力。

数据流向图 (Mermaid):

双路输出

采集光信号

60fps 渲染

抽帧 (15fps)

NPU 加速

绘制矩形框

物理摄像头 (Camera Device)

Camera Session (会话)

预览流 (XComponent)

分析流 (ImageReceiver)

手机屏幕

Vision Kit (人脸检测)

人脸坐标 (Rect)


🛠️ 二、 准备工作

module.json5 中申请相机权限:

"requestPermissions": [
  { "name": "ohos.permission.CAMERA" }
]

(注意:真机运行需动态申请权限,此处省略申请代码)


💻 三、 核心实战:Vision Kit 极速接入

我们跳过繁琐的 Camera 初始化代码(那属于 Camera Kit 的范畴),直接聚焦于 如何从视频流中检测人脸

1. 导入核心能力
import { faceDetector } from '@kit.CoreVisionKit'; // 核心视觉库
import { image } from '@kit.ImageKit';
import { AsyncCallback } from '@kit.BasicServicesKit';

2. 初始化检测器

在页面加载时,创建一个 Face Detector 实例。

let faceDetectorInstance: faceDetector.FaceDetector | undefined = undefined;

async function initAI() {
  // 1. 创建人脸检测器
  // 这里的 resource 需要初始化,通常传 null 即可使用默认模型
  faceDetectorInstance = await faceDetector.createFaceDetector(null);
}

3. 实时检测逻辑 (ImageReceiver 监听)

当相机产生新的一帧数据时,将其喂给 NPU。

// 假设这是 Camera Kit 的 ImageReceiver 监听回调
// 每当摄像头捕获一帧,这个函数就会触发
async function onImageArrival(receiver: image.ImageReceiver) {
  let imgComponent = await receiver.readNextImage();
  
  if (!imgComponent || !faceDetectorInstance) {
    return;
  }

  try {
    // 1. 构建 VisionInfo 对象
    let visionInfo: faceDetector.VisionInfo = {
      pixelMap: await imgComponent.getPixelMap(), // 获取位图
    };

    // 2. 调用检测 (核心代码只有这一行!)
    // data 包含了人脸的坐标、概率、偏转角度等
    let faces = await faceDetectorInstance.detect(visionInfo);

    // 3. 处理结果
    if (faces.length > 0) {
      console.info(`检测到 ${faces.length} 张人脸`);
      
      // 拿到第一张人脸的坐标框 (Bounding Box)
      let rect = faces[0].boundingBox;
      
      // TODO: 在 UI 层根据 rect 绘制一个绿色的框
      // drawFaceBox(rect); 
      
      // 🚪 门禁逻辑:如果人脸够大(靠近了),触发开门检查
      if (rect.width > 300) {
          checkAccessPermission();
      }
    }
    
  } catch (err) {
    console.error('检测失败:', err);
  } finally {
    // 记得释放图片资源,否则会 OOM
    await imgComponent.release(); 
  }
}


🎨 四、 UI 绘制:把“框”画出来

在 ArkTS 中,我们可以使用 Canvas 组件覆盖在 XComponent (相机预览) 之上,实现 AR 般的效果。

Stack() {
  // 1. 底层:相机预览画面
  XComponent({ id: 'cameraPreview', type: 'surface', controller: this.mXComponentController })
    .onLoad(() => {
        // 启动相机逻辑...
    })

  // 2. 顶层:画布,用于画人脸框
  Canvas(this.context)
    .width('100%')
    .height('100%')
    .onReady(() => {
        // 保存 canvas context 用于后续绘图
    })
}


🆚 五、 性能对比:Vision Kit vs OpenCV

指标 HarmonyOS Vision Kit OpenCV Mobile (Java/C++)
接入难度 🟢 极低 (纯 ArkTS) 🔴 高 (需配置 NDK/JNI)
检测速度 🟢 < 10ms (NPU) 🟡 30-50ms (CPU)
APK 增量 🟢 0 KB 🔴 10-50 MB
发热情况 🟢 几乎不热 🔴 持续运算发热

🎯 总结

通过 HarmonyOS 的 Vision Kit,我们在没有任何算法基础的情况下,仅用几十行代码就实现了工业级的人脸检测功能。

对于门禁、考勤、甚至“不用手翻页”的电子书应用来说,这套方案是目前的最优解。它不需要你懂卷积神经网络,只需要你懂调用 API。

Next Step:
人脸检测只是第一步。
如果要实现“刷脸支付”或“特定人员开门”,你需要进一步调用 Face Recognition (人脸比对) 接口(注意:这通常涉及更高的安全等级和权限)。现在,先试试把上面的代码跑通,看看你的手机能不能框住你的脸吧!

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐