HarmonyOS 6 轻相机应用开发1:功能介绍与框架搭建
引言
之前基于Android、iOS端的gpuimage项目灵感实现了HarmonyOS端的滤镜效果,后面又基于google的tflite模型进行了实时视频的检测等效果,想着基于这些单点能力做一个完善的独立应用,名字还是轻系列的,就叫轻相机。
本系列文章将带实战开发"轻相机"应用。它不仅整合了高性能的 gpuimage 框架来实现电影级实时滤镜,还深度集成了 MindSpore Lite 引擎,支持人脸、物品的实时检测与动态贴纸属性叠加。通过这一过程,我们将深度掌握 HarmonyOS 6 在多路流并发处理及 Native 渲染方面的硬核能力。
功能展示
在开始敲代码之前,我们先来明确"轻相机"的核心能力矩阵:
- 高级实时滤镜:基于 GLSL 着色器,提供 30+ 种实时预览效果(黑白、复古、胶片、素描等)。
- AI 动态贴纸:实时追踪面部 100+ 关键点,让贴纸(如猫耳、眼镜)与人物完美贴合。
- 智慧识别检测:毫秒级的响应速度,支持人脸识别、物品分类及场景感知。
- AI 特效 & 水印:支持实时背景虚化(浅景深效果)及动态地理位置/时间水印叠加。
AI 模型矩阵
我们的"轻相机"应用搭载了多重模型,确保各种场景下的智慧化表现:
| 模型名称 | 核心能力 (中文含义) | 适用场景 |
|---|---|---|
| BlazeFace | 极速人脸检测模型 | 用于毫秒级的面部定位与范围计算,支持实时贴纸定位。 |
| MobileNetV2 | 轻量级骨干网络 | 极低功耗下实现精准的图像分类与通用物品识别。 |
| MoveNet | 高精度姿态估计模型 | 实时追踪人体 17 个关键骨骼点,支持肢体特效触发。 |
| YOLO (v5s/v8n) | 端侧目标检测引擎 | 在复杂环境下快速锁定并识别画面中的多类物品。 |
技术架构:双路流融合方案
在单一相机采集实例的前提下,为了兼顾渲染性能与推理速度,我们采用了**"预览渲染 + 异构推理"的双路流方案**。
系统架构图:

业务处理流程:
AI 任务路 (AI Path)
渲染主路 (Rendering Path)
OK
NAPI 高速回传
切换滤镜
退出
应用启动
权限与引擎初始化
相机与 NDK 引擎准备就绪
双路流并发执行
PreviewOutput 帧数据抵达
NativeImage 纹理映射
GLSL 实时滤镜渲染
送显至 XComponent Surface
ImageReceiver 采样帧抵达
Native 内存指针直接映射
MindSpore 异步推理计算
人脸锚点/物体标签输出
UI 视觉层融合
ArkTS Canvas 叠加层绘制
用户查看效果
关闭采集会话

- 渲染路 (Rendering Path) :
- 使用
PreviewOutput将数据流输出到XComponent的 Surface。 - 接入
gpuimageNDK 控制器,直接在 Native 层通过 OpenGL ES 环境拦截此 Surface。 - 在录入显存后,应用自定义着色器(Fragment Shader)实现动态滤镜。
- 使用
- AI 推理路 (AI Path) :
- 在同一个
CaptureSession中额外添加一个ImageReceiver输出流。 - 该流专门接收低分辨率(如 1:1 比例)的 YUV 原始数据,实时触发
onImageAvailable回调。 - 结合 NAPI 技术,将原生指针传递给
MindSpore Lite推理引擎,计算出面部坐标、识别结果或姿态属性。
- 在同一个
- UI 融合层 :
- AI 推理所得的离散数据回传至 ArkTS 环境。
- 使用
Canvas组件叠加在预览层上方,以极短延迟绘制动态识别框、贴纸及文字水印。
项目搭建与子模块划分
由于功能点较多,代码工程采用了模块化的架构:
entry模块:主应用入口,处理 UI 布局、用户交互及 AI 检测结果的绘制。gpuimagelib(HarmonyOS Library):封装了 NDK 形式的滤镜引擎、相机管理及 Native 录制能力。mindspore_lite(NDK 集成):负责推理环境的初始化、模型加载及 NAPI 接口绑定。
gpuimage 接入与 CMake 配置
实时相机滤镜的底层依赖于 OpenGL 和系统的相机驱动库。在 gpuimagelib 的 CMakeLists.txt 中,我们需要链接核心系统库以支持 Native 渲染:
cmake
# gpuimagelib/src/main/cpp/CMakeLists.txt 核心配置
target_link_libraries(gpuimagelib PUBLIC
libohcamera.so # 系统相机库
libace_napi.z.so # NAPI 接口
libnative_buffer.so # 原生 Buffer 管理
libEGL.so # EGL 环境管理
libGLESv3.so # OpenGL ES 3.0 环境
libnative_image.so # Native Image 处理
libnative_window.so # Native Window 绘制
# 其他音视频编解码库
libnative_media_venc.so
libnative_media_avmuxer.so
)
基础预览框架搭建
在首页 Index.ets 中,我们首先构建基础的 Stack 层级,将播放与检测层分离:
typescript
@Entry
@Component
struct Index {
private xComponentController: XComponentController = new XComponentController();
private canvasContext: CanvasRenderingContext2D = new CanvasRenderingContext2D(new RenderingContextSettings(true));
build() {
Stack({ alignContent: Alignment.Top }) {
// 1. 底层:高效预览渲染层 (接入 gpuimage)
XComponent({
id: 'cameraPreview',
type: 'surface',
controller: this.xComponentController
})
.onLoad(async () => {
let surfaceId = this.xComponentController.getXComponentSurfaceId();
// 初始化相机并绑定 Native 渲染器
CameraController.initCamera(surfaceId, 1.0);
})
.width('100%')
.height('70%')
// 2. 中层:AI 绘制叠加层 (Canvas)
Canvas(this.canvasContext)
.width('100%')
.height('70%')
.hitTestBehavior(HitTestMode.None)
// 3. 上层:UI 控件层 (功能切换、快门等)
FilterSelector()
.position({ x: 0, y: '70.5%' })
}
.width('100%')
.height('100%')
.backgroundColor(Color.Black)
}
}
总结
本文我们确定了"轻相机"应用的产品定位与核心技术架构。通过"单采集+双路径"的思路,完美解决了实时渲染与端侧 AI 推理在高并发下的性能冲突。在接下来的章节中,我们将深入 gpuimage 内部,详解如何通过 GLSL 实现各种绚烂的实时滤镜效果。