照片主体提取技术在裸眼3D相框项目中的应用

一、项目背景

"裸眼3D相框"是一款基于 HarmonyOS NEXT 开发的图片美化应用。用户选择一张主体突出的照片后,应用能够自动识别出画面中的主体(如人物、动物、静物等),将主体从背景中"抠"出来,再配合边框合成,实现主体探出相框的裸眼3D立体效果。

整个功能的核心,正是 HarmonyOS 系统提供的**主体分割(Subject Segmentation)**能力。本文将介绍这项技术在本项目中是如何落地运用的。
在这里插入图片描述

二、核心技术选型

项目使用 @kit.CoreVisionKit(核心视觉套件)中提供的 subjectSegmentation 模块来完成主体提取。该模块通过 doSegmentation 接口对一张图片进行语义级分割,能够返回两类关键数据:

  1. 前景主体图(foregroundImage):去除了背景、只保留主体的透明 PNG 图像,用于"破框"叠加;
  2. 主体矩形框(subjectRectangle):主体在原图中的坐标范围,用于后续的定位与排版计算。

相比自行训练模型,调用系统内置视觉能力大大降低了开发成本,同时依托系统端侧推理,无需联网、保护用户隐私,处理速度也足以满足即时预览的交互需求。

三、在项目中的具体运用

3.1 图片预处理

主体分割对超大分辨率图片耗时高且有内存溢出(OOM)风险。SegUtil.loadPixelMap 在解码时按原图宽高比将最长边压缩到 1440px 以内,保证分割既有足够清晰度,又不会拖慢页面:

const k: number = Math.min(1, 1440 / Math.max(sw, sh));
const opts: image.DecodingOptions = {
  desiredSize: { width: Math.round(sw * k), height: Math.round(sh * k) }
};

3.2 调用主体分割

SegUtil.segment 是核心封装。它把原图 PixelMap 交给分割接口,并开启前景图输出:

const visionInfo = { pixelMap: pm };
const config = { enableSubjectForegroundImage: true };
const seg = await subjectSegmentation.doSegmentation(visionInfo, config);

分割成功后即可拿到 seg.fullSubject.foregroundImage(前景主体)和 seg.fullSubject.subjectRectangle(主体框)。

3.3 分割结果的有效性校验

主体分割并不保证每次都能成功抠图。项目对结果做了两道严谨校验:

  • 透明度统计:逐像素读取前景图的 Alpha 通道,统计透明与不透明像素数量。若完全不透明(opaque == 0),说明"抠空"了,判定为无主体;
  • 像素格式归一化:若前景图不是 RGBA_8888 或 alpha 类型为 OPAQUE,统一转为 RGBA_8888 UNPREMUL,避免部分设备渲染不出抠图内容。
if (opaque == 0) {
  result.foreground = null; // 无主体
} else if (格式不合法) {
  result.foreground = await image.createPixelMap(buf, init); // 归一化
}

3.4 主体定位与"破框"计算

得到主体框坐标后,ResultFrame 组件据此精确控制画面合成,这是形成裸眼3D效果的关键:

  • 主体探出量(getPop):根据主体在画面中的高度,按一定比例计算主体"探出"相框上沿的高度,并限制不超过内框高度的 40%,避免画布过高;
  • 缩放(getScale):在 Cover 显示基础上进一步放大照片,确保主体能够顶到窗口上沿;
  • 偏移(getOx / getOy):通过坐标换算,让主体在画布中水平居中、顶部探出窗口,再让内框窗口按"切断主体"的位置裁切显示原图。

最终合成三层结构:背景画布 → 画框色块与内框窗口(裁切原图)→ 前景主体层。主体层与内图同比例同位置叠加,却不被内框裁剪,从而自然"压"在边框之上,形成破框而出的立体错觉。

3.5 兜底与体验优化

当分割失败或未识别到明显主体时,应用不会报错中断,而是保留普通画框效果,并提示"未识别到明显主体,已保留画框效果",保证流程可用性。同时页面提供"主体破框"开关和"长按预览主体层"的调试视图,便于用户自由控制与验证抠图质量。
在这里插入图片描述

四、技术价值总结

通过主体分割技术,本项目把复杂的图像语义理解能力封装成一次简洁的接口调用,配合像素级的结果校验与精细的坐标排版,实现了"自动抠主体 → 定位 → 破框合成"的完整链路。主体提取技术在这里不仅是"抠图"工具,更是驱动整个裸眼3D交互体验的核心引擎,充分体现了端侧 AI 视觉能力在图像创作类应用中的实用价值。

Logo

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

更多推荐