查看: 88|回复: 3

鸿蒙6.1.1 Camera Kit自定义OIS偏置与多轴调优实战

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式
光学防抖(OIS)是移动影像中抵消手抖、提升暗光成片率的关键能力。在过去,OIS 通常被系统底层 ISP 封装成固定能力,开发者只能控制开关。而在 HarmonyOS 6.1.1(API 24)中,Camera Kit 开放了更底层的 OIS 控制权:通过 OISQuery 和 OIS 接口组,你可以查询相机在俯仰轴(Pitch)和偏航轴(Yaw)上的硬件偏置范围与步长,甚至注入自定义偏置值,让镜头根据你的算法产生物理位移,实现像素级防抖补偿。

本次 Camera Kit 将防抖能力拆分为 OISQuery(查询模块)和 OIS(设置模块),均在 Stage 模型下使用。查询侧主要接口包括:isOISModeSupported(mode) 检测指定模式是否可用;getSupportedOISBiasRange(oisAxis) 返回指定轴的硬件偏置极值;getSupportedOISBiasStep(oisAxis) 返回电机的最小步长;getCurrentOISMode() 和 getCurrentCustomOISBias(oisAxis) 用于回读当前状态。设置侧接口则有 setOISMode(mode) 切换普通模式或自定义模式,以及 setOISModeCustom(pitch, yaw) 直接注入偏置值。对于 C/C++ 开发者,还可以使用 OH_CaptureSession_SetOISModeCustom(session, pitchBias, yawBias) 直接向 CaptureSession 推送防抖参数,避免跨语言桥接损耗。

在 Demo 工程中,新增了 CameraOISDemo 页面,包含三块功能:能力勘测面板、参数注入引擎、状态回溯与校验。下面是一段 ArkTS 示例,演示从探测到注入的主要流程。
  1. import { router } from '@kit.ArkUI';
  2. // 真实开发中应解构 @kit.CameraKit 获取 OISMode / OISAxes
  3. // import { camera } from '@kit.CameraKit';
  4. @Entry
  5. @Component
  6. struct CameraOISDemo {
  7.     @State logs: string[] = [];
  8.     @State pitchValue: number = 0;
  9.     @State yawValue: number = 0;
  10.     // 模拟枚举
  11.     private OISAxes_X = 0; // X轴 / Pitch
  12.     private OISAxes_Y = 1; // Y轴 / Yaw
  13.     private OISMode_CUSTOM = 2; // 模拟 CUSTOM 模式
  14.     private appendLog(msg: string): void {
  15.         let now = new Date();
  16.         let timeStr = `${now.getHours()}:${now.getMinutes()}:${now.getSeconds()}.${now.getMilliseconds()}`;
  17.         this.logs.unshift(`[${timeStr}] ${msg}`);
  18.     }
  19.     checkOISCapabilities(): void {
  20.         this.appendLog('🔍 开始对当前主摄镜头进行 OIS 硬件勘测...');
  21.         // 真实业务中: let isCustomSupported = photoSession.isOISModeSupported(camera.OISMode.CUSTOM);
  22.         let isCustomSupported = true; // 模拟通过
  23.         if (isCustomSupported) {
  24.             this.appendLog('✅ 设备支持自定义 OIS 偏置模式 (CUSTOM)');
  25.             // 真实业务中: photoSession.getSupportedOISBiasRange(camera.OISAxes.OIS_PITCH);
  26.             let pitchRange = [-1.5, 1.5];
  27.             let pitchStep = 0.1;
  28.             this.appendLog(`📊 Pitch 轴支持范围: [${pitchRange[0]}, ${pitchRange[1]}], 步进: ${pitchStep}`);
  29.         } else {
  30.             this.appendLog('⚠️ 设备不支持 OIS CUSTOM 模式。');
  31.         }
  32.     }
  33.     enableCustomOISMode(): void {
  34.         this.appendLog('⚙️ 正在调用 PhotoSession.setOISMode(CUSTOM)...');
  35.         // 真实业务中: photoSession.setOISMode(camera.OISMode.CUSTOM);
  36.         this.appendLog('✅ 已成功挂载自定义防抖模式');
  37.     }
  38.     injectCustomBias(): void {
  39.         this.appendLog(`🚀 正在向底层注入防抖补偿参数 -> Pitch: ${this.pitchValue.toFixed(2)}, Yaw: ${this.yawValue.toFixed(2)}`);
  40.         // 真实业务中: photoSession.setOISModeCustom(this.pitchValue, this.yawValue);
  41.         this.appendLog('✅ 参数注入成功,镜片已产生物理位移补偿。');
  42.     }
  43.     build() {
  44.         Column() {
  45.             // 详见工程源码中滑动条等交互 UI 的实现...
  46.         }
  47.         .width('100%').height('100%').backgroundColor(Color.White)
  48.     }
  49. }
复制代码

代码中,checkOISCapabilities 先确认设备是否支持 CUSTOM 模式,并取得 Pitch 轴范围与步长;enableCustomOISMode 切换防抖模式;injectCustomBias 注入参数。注意真实业务中需要从 @kit.CameraKit 解构 camera 对象,通过 photoSession 调用相应 API。运行后,控制台会输出日志,展示当前设备的 OIS 能力与注入过程。

需要特别留意三点:第一,OIS 是硬件能力,不同设备支持情况不同,调用 set 前必须先执行 isOISModeSupported 等探测,否则容易抛出 7400102(Operation not allowed)。第二,注入偏置值不能超出 getSupportedOISBiasRange 返回的范围,否则轻则报错,重则影响对焦算法。第三,所有 OIS 设置都依附于 CaptureSession 或 PhotoSession,Session 未 commitConfig() 之前调用会返回 7400103(Session not config)。

HarmonyOS 6.1.1 将 OIS 底层操纵能力开放给应用层,对专业影像工具、稳定器、运动相机等场景意义重大。开发者可以结合陀螺仪数据与 setOISModeCustom 接口,实现超越系统原生的防抖效果。
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: 鸿蒙6.1.1 Camera Kit自定义OIS偏置与多轴调优实战

感谢楼主的实战分享!HarmonyOS 6.1.1 把 OIS 底层控制权开放出来确实很有价值,尤其是自定义偏置注入这一块,对做专业影像或算法优化的开发者来说非常实用。有几个问题想请教一下: 1. 自定义 OIS 偏置注入后,对预览流和成片分别生效吗?还是说只影响静态照片? 2. 如果开发者注入的偏置值超出硬件范围,SDK 是会直接报错还是自动 clamp 到边界? 3. 多轴调优时,Pitch 和 Yaw 之间是否存在机械耦合或温漂补偿?实际调参时需要额外做校准吗? 另外,C/C++ 的 `OH_CaptureSession_SetOISModeCustom` 接口可以和 ArkTS 的 `setOISModeCustom` 混用吗?期待后续能有更详细的性能对比或调参案例。
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: 鸿蒙6.1.1 Camera Kit自定义OIS偏置与多轴调优实战

楼主这个 OIS 自定义偏置的实战太实用了!之前只知道系统封装好的开关,没想到 Camera Kit 已经开放到能直接注入 Pitch/Yaw 偏置了,这样确实可以做像素级补偿,感觉给第三方算法留了很大空间。 想请教两个实操细节:一是如果注入的偏置值超过了 getSupportedOISBiasRange 返回的硬件极限,接口是会报错还是自动截断?二是长时间保持大偏置注入,会不会导致镜头模组发热或者机械疲劳?官方有没有推荐的安全使用时长或阈值?另外,楼主在状态回读校验时,是每次注入后都重新查询确认当前偏置,还是只靠接口返回值判断?如果方便的话,希望后续能讲讲和算法联调时的时序控制,比如是每帧注入还是拍摄前设置一次就好。感谢分享!
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: 鸿蒙6.1.1 Camera Kit自定义OIS偏置与多轴调优实战

楼主这篇实战分享很及时,正好在调研鸿蒙相机的新能力。Camera Kit 开放 OIS 偏置控制确实给了开发者不少想象空间,特别是多轴调优这块,对算法验证很有价值。 想请教一下,自定义偏置注入后,系统的稳像算法是不是完全停用?还是说偏置会和系统 EIS 做融合?还有,如果设备不支持 CUSTOM 模式,回退到普通 OIS 时需要注意什么?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-8-10 12:37 , Processed in 0.025764 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部