目录
[二、完整代码实现(C 语言,可直接移植到 Linux 大核)](#二、完整代码实现(C 语言,可直接移植到 Linux 大核))
在多核架构下,将小核(Sensor Normal 模式)算出的单帧曝光时间 ,合理映射到大核 Linux 系统中 WDR(宽动态范围)模式所需的长曝光时间 和短曝光时间,确保两种模式的曝光参数在视觉效果上保持一致性。
核心思路
WDR 模式的核心是通过长短曝光帧合成实现宽动态,映射的关键原则是:
- 长短曝光的总光通量要与 Normal 模式的单帧光通量等效(保证整体亮度一致);
- 长短曝光的比例要符合 WDR 的动态范围需求(通常短曝光为长曝光的 1/4~1/16,具体看 Sensor 支持);
- 所有曝光时间必须在 Sensor 的硬件限制范围内(最小 / 最大曝光时间、帧频约束)。
以下是可直接落地的映射算法和实现方案:
一、数学映射模型(核心公式)
假设:
- Tnormal:小核 Normal 模式算出的目标曝光时间(单位:us,微秒);
- Tlong:WDR 模式的长曝光时间;
- Tshort:WDR 模式的短曝光时间;
- k:长短曝光比例系数(k=Tshort/Tlong,通常取 1/8 或 1/16,需根据 Sensor 规格调整);
- α:光通量等效系数(考虑 WDR 合成算法的增益,通常取 0.8 1.0,保证亮度匹配)。
基础映射公式
- 光通量等效约束:长短曝光的加权和等于 Normal 模式的光通量(忽略增益差异时):Tlong+Tshort=α×Tnormal
- 长短曝光比例约束: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;
}
代码关键说明
- 参数配置区 :所有大写宏定义都是 Sensor 相关的硬件参数,你需要根据实际 Sensor 的 datasheet 修改(比如
SENSOR_EXP_MAX_US、ROW_BLANKING_US); - 核心计算:先通过数学公式算出理论值,再依次做硬件边界和帧频约束的修正,避免参数超出 Sensor 能力;
- 帧频约束:WDR 模式需要连续采集长短两帧,总曝光时间 + 消隐时间不能超过帧频对应的单帧时长(比如 30fps 对应单帧最大时长≈33333us);
- 整数转换 :Sensor 的曝光时间只能是整数微秒,最后用
round()取整保证精度。
三、调优建议
- α 系数微调 :如果 WDR 合成后画面偏亮 / 偏暗,可调整
ALPHA_COEFF(0.8~1.2),偏亮则减小,偏暗则增大; - k 比例调整:动态范围要求高(如逆光场景),可将 k 调小(如 1/16);普通场景可调大(如 1/4),减少运动拖影;
- 平滑滤波 :大核计算出的
T_long/T_short不要突变,可加一阶低通滤波(如T_long = 0.8*T_long_prev + 0.2*T_long_curr),避免画面亮度抖动; - 硬件校准:不同 Sensor 的光电转换效率不同,建议在实际场景中做灰度卡校准,修正 α 系数。
总结
- 核心映射逻辑:以 "光通量等效" 为原则,通过长短曝光比例系数 k,将 Normal 模式的单曝光时间拆分为 WDR 的长短曝光时间;
- 工程约束:必须校验 Sensor 硬件边界(最小 / 最大曝光)和帧频约束,避免参数无效;
- 多核通信:优先用共享内存传递 Normal 曝光参数,加锁 + 时间戳保证数据有效性,大核计算后建议做平滑滤波。