多核架构中,RTOS小核跑sensor 的normal模式,大核linux核跑WDR模式,将小核的曝光时间映射到WDR模式中的曝光时间的方法

目录

核心思路

一、数学映射模型(核心公式)

基础映射公式

联立求解

硬件限制修正

[二、完整代码实现(C 语言,可直接移植到 Linux 大核)](#二、完整代码实现(C 语言,可直接移植到 Linux 大核))

代码关键说明

三、调优建议

总结


在多核架构下,将小核(Sensor Normal 模式)算出的单帧曝光时间 ,合理映射到大核 Linux 系统中 WDR(宽动态范围)模式所需的长曝光时间短曝光时间,确保两种模式的曝光参数在视觉效果上保持一致性。

核心思路

WDR 模式的核心是通过长短曝光帧合成实现宽动态,映射的关键原则是:

  1. 长短曝光的总光通量要与 Normal 模式的单帧光通量等效(保证整体亮度一致);
  2. 长短曝光的比例要符合 WDR 的动态范围需求(通常短曝光为长曝光的 1/4~1/16,具体看 Sensor 支持);
  3. 所有曝光时间必须在 Sensor 的硬件限制范围内(最小 / 最大曝光时间、帧频约束)。

以下是可直接落地的映射算法和实现方案:


一、数学映射模型(核心公式)

假设:

  • Tnormal:小核 Normal 模式算出的目标曝光时间(单位:us,微秒);
  • Tlong:WDR 模式的长曝光时间;
  • Tshort:WDR 模式的短曝光时间;
  • k:长短曝光比例系数(k=Tshort/Tlong,通常取 1/8 或 1/16,需根据 Sensor 规格调整);
  • α:光通量等效系数(考虑 WDR 合成算法的增益,通常取 0.8 1.0,保证亮度匹配)。

基础映射公式

  1. 光通量等效约束:长短曝光的加权和等于 Normal 模式的光通量(忽略增益差异时):Tlong+Tshort=α×Tnormal
  2. 长短曝光比例约束:Tshort=k×Tlong

联立求解

将公式 2 代入公式 1,

可得:Tlong​=(α×Tnormal​​)/(1+k)

Tshort​=k×Tlong​=(α×k×Tnormal​​)/(1+k)

硬件限制修正

Sensor 的曝光时间有硬件边界,需对结果做钳位:

  • Tlong∈[Tmin,Tmax](Sensor 支持的最小 / 最大长曝光时间);
  • Tshort≥Tmin(短曝光不能小于硬件最小值);
  • 需满足帧频约束:1/(Tlong+Tshort+行消隐时间)<=目标帧频(避免帧率不达标)。
  • 更一般的约束是(Tlong+Tshort+offset)<=VTS

二、完整代码实现(C 语言,可直接移植到 Linux 大核)

cpp 复制代码
#include <stdint.h>
#include <math.h>

// Sensor硬件参数配置(需根据实际Sensor规格修改)
#define SENSOR_EXP_MIN_US    100     // 最小曝光时间(us)
#define SENSOR_EXP_MAX_US    50000   // 最大长曝光时间(us)
#define WDR_K_RATIO         (1.0/8) // 短曝光/长曝光 = 1/8
#define ALPHA_COEFF         0.9     // 光通量等效系数(可微调)
#define TARGET_FPS          30      // 目标帧频(fps)
#define ROW_BLANKING_US     1000    // 行消隐时间(us,需查Sensor手册)

/**
 * @brief 将Normal模式曝光时间映射为WDR的长短曝光时间
 * @param t_normal: 小核传入的Normal模式曝光时间(us)
 * @param t_long: 输出WDR长曝光时间(us)
 * @param t_short: 输出WDR短曝光时间(us)
 * @return 0:成功, -1:参数无效
 */
int map_normal_to_wdr_exp(uint32_t t_normal, uint32_t *t_long, uint32_t *t_short) {
    // 入参校验
    if (t_normal == 0 || t_long == NULL || t_short == NULL) {
        return -1;
    }

    // 1. 基础公式计算
    double temp_long = (ALPHA_COEFF * t_normal) / (1 + WDR_K_RATIO);
    double temp_short = WDR_K_RATIO * temp_long;

    // 2. 硬件边界钳位(优先保证长曝光在合理范围)
    // 长曝光下限
    if (temp_long < SENSOR_EXP_MIN_US) {
        temp_long = SENSOR_EXP_MIN_US;
        temp_short = SENSOR_EXP_MIN_US; // 短曝光不小于最小值
    }
    // 长曝光上限
    if (temp_long > SENSOR_EXP_MAX_US) {
        temp_long = SENSOR_EXP_MAX_US;
        // 短曝光按比例同步调整,避免比例失衡
        temp_short = WDR_K_RATIO * temp_long;
    }
    // 短曝光下限兜底
    if (temp_short < SENSOR_EXP_MIN_US) {
        temp_short = SENSOR_EXP_MIN_US;
    }

    // 3. 帧频约束校验(总曝光时间+消隐时间 <= 1/FPS)
    uint32_t max_total_exp = 1000000 / TARGET_FPS - ROW_BLANKING_US; // 总曝光时间上限(us)
    if ((temp_long + temp_short) > max_total_exp) {
        // 按比例缩减排总曝光时间,满足帧频
        double scale = (double)max_total_exp / (temp_long + temp_short);
        temp_long *= scale;
        temp_short *= scale;
    }

    // 4. 转换为整数(Sensor曝光时间为整数)
    *t_long = round(temp_long);
    *t_short = round(temp_short);

    return 0;
}

// 测试示例
int main() {
    uint32_t t_normal = 20000; // 小核传入Normal模式曝光时间20ms
    uint32_t t_long, t_short;

    if (map_normal_to_wdr_exp(t_normal, &t_long, &t_short) == 0) {
        printf("Normal曝光时间: %d us\n", t_normal);
        printf("WDR长曝光时间: %d us\n", t_long);
        printf("WDR短曝光时间: %d us\n", t_short);
    }

    return 0;
}

代码关键说明

  1. 参数配置区 :所有大写宏定义都是 Sensor 相关的硬件参数,你需要根据实际 Sensor 的 datasheet 修改(比如SENSOR_EXP_MAX_USROW_BLANKING_US);
  2. 核心计算:先通过数学公式算出理论值,再依次做硬件边界和帧频约束的修正,避免参数超出 Sensor 能力;
  3. 帧频约束:WDR 模式需要连续采集长短两帧,总曝光时间 + 消隐时间不能超过帧频对应的单帧时长(比如 30fps 对应单帧最大时长≈33333us);
  4. 整数转换 :Sensor 的曝光时间只能是整数微秒,最后用round()取整保证精度。

三、调优建议

  1. α 系数微调 :如果 WDR 合成后画面偏亮 / 偏暗,可调整ALPHA_COEFF(0.8~1.2),偏亮则减小,偏暗则增大;
  2. k 比例调整:动态范围要求高(如逆光场景),可将 k 调小(如 1/16);普通场景可调大(如 1/4),减少运动拖影;
  3. 平滑滤波 :大核计算出的T_long/T_short不要突变,可加一阶低通滤波(如T_long = 0.8*T_long_prev + 0.2*T_long_curr),避免画面亮度抖动;
  4. 硬件校准:不同 Sensor 的光电转换效率不同,建议在实际场景中做灰度卡校准,修正 α 系数。

总结

  1. 核心映射逻辑:以 "光通量等效" 为原则,通过长短曝光比例系数 k,将 Normal 模式的单曝光时间拆分为 WDR 的长短曝光时间;
  2. 工程约束:必须校验 Sensor 硬件边界(最小 / 最大曝光)和帧频约束,避免参数无效;
  3. 多核通信:优先用共享内存传递 Normal 曝光参数,加锁 + 时间戳保证数据有效性,大核计算后建议做平滑滤波。
相关推荐
全栈测试笔记2 小时前
异步函数与异步生成器
linux·服务器·前端·数据库·python
weixin_462446232 小时前
Linux 下使用 xfreerdp3 远程连接 Windows(从安装到实战使用)
linux·运维·windows
EndingCoder2 小时前
配置 tsconfig.json:高级选项
linux·前端·ubuntu·typescript·json
爱丶狸2 小时前
Linux三剑客之sed
linux·运维·服务器
仗剑恬雅人3 小时前
LINUX数据库高频常用命令
linux·运维·服务器·数据库·ssh·运维开发
Getgit4 小时前
Linux系统的特点有哪些
java·linux·运维·网络·sql
壮哥_icon4 小时前
Ubuntu 虚拟机中编译 Android 源码完整指南(含分卷合并、虚拟内存配置、复制粘贴设置及依赖库安装)
linux·运维·ubuntu
Maggie_ssss_supp5 小时前
Linux-Percona XtraDB Cluster (PXC)集群部署实战
linux·运维·服务器
a程序小傲6 小时前
国家电网面试被问:FactoryBean与BeanFactory的区别和动态代理生成
java·linux·服务器·spring boot·spring·面试·职场和发展