本文完整整理 46 页英文 V1.1.0 原稿的技术正文(PDF p.5–46),并制作完整中文和俄文译文。没有对应中文 PDF,三语均使用英文 PDF 的 14 张独立原图,原图已有中文界面/标签如实保留。代码、注释、API、参数、寄存器值及示例常量保持来源文本,图注和自然语言说明本地化。
原文产品范围及系统支持状态见下表;这些是原文记录,不是当前所有版本的兼容性结论。本篇仅作 ArmSoM 平台参考,须核对实际板卡、RK3588、Sensor/VCM、ISP30、SDK/BSP、AIQ 及内核版本;未进行 ArmSoM 硬件验证。不能将 RK 库与定制库混合运行说明扩展到未经核实的版本。曝光、增益、对焦和马达控制可能改变采集效果或硬件状态;未执行任何代码、设备配置或马达操作。
原文疑点:部分接口描述和标题重复、uapi 与 uapi2 名称混用、ISP32 交叉引用、两项表格说明乱码以及若干窗口参数冲突均保留并注明;代码是原稿示例,不保证可直接编译。详见校对记录。
| SoC | 内核 |
|---|---|
| RK3588 | Linux 5.10 |
| SoC | BuildRoot | Debian | Yocto | Android |
|---|---|---|---|---|
| RK3588 | Y | N | N | Y |
原文与适配疑点见 EDITORIAL-NOTES. ArmSoM · Rockchip Linux
1 概述
本文主要介绍 3A 库的实现,指导用户实现定制的 3A 算法库。
3A 算法库依赖 AIQ。AIQ 已包含 RK 的 3A 算法库,并默认启用。用户可按需要依据本文实现定制的 3A 库。
1.1 设计思路
基本设计思路如下图:

英文原稿技术图, PDF p.5.
通过注册将 3A 库注册到 ISP 库。注意,RK 的 3A 库已隐式注册,用户无需显式注册。
3A 库注册到 ISP 库后,ISP 库从驱动取得 3A 统计数据,再回调 3A 库接口获得新的 3A 参数,最后由 ISP 库将新参数设置到驱动。
1.2 文件组织
文件组织如下图:

英文原稿技术图, PDF p.6.
ISP 固件分为应用层 librkaiq.so 和驱动层。驱动层包括 ISP 驱动以及 Sensor、VCM、Flashlight 等外设驱动。
librkaiq.so 包含 3A、HDR 等多个算法库。这些算法库以静态库形式存在,最终链接成 librkaiq.so。除了不提供源码的 librkaiq_ae/awb/af.a 3A 库,其他基础库源码均开放。
框架支持的所有模块算法库均可使用客户算法;但通常除需要定制的 3A 库外,其他基础库可使用 RK 提供的默认库。
1.3 开发模式
支持以下三种开发模式:
3A 库使用 RK 库。此时可使用 RK 的 3A 库 API,包括 rk_aiq_user_api2_ae.h、rk_aiq_user_api2_af.h 和 rk_aiq_user_api2_awb.h。
3A 库一部分使用 RK 库,另一部分使用自定义库。例如 AE 使用自定义库,AWB 使用 RK 库。
自定义 3A 库与 RK 库同时使用。例如 AE 自定义库与 RK 库同时运行时,先运行 RK AE 库,再运行自定义 AE 库;自定义库结果覆盖 RK AE 库结果。该模式用于简化自定义库开发:自定义库不必输出 AIQ 框架所需的全部结果,部分结果可由 RK AE 库提供。
1.4 软件流程
1.4.1 基本流程
RK 3A 算法已在 AIQ 框架内部隐式注册,用户无需显式注册。下面以自定义 AE 算法注册为例,给出伪代码:
// Initialize the usage scenario, not required, defaults to normal, day, which is used to select scene parameters in the JSON IQ file
if (work_mode == RK_AIQ_WORKING_MODE_NORMAL)
ret = rk_aiq_uapi2_sysctl_preInit_scene(sns_entity_name, "normal",
"day");
else
ret = rk_aiq_uapi2_sysctl_preInit_scene(sns_entity_name, "hdr", "day");
// Depending on whether the usage pattern is surround view or single camera, initialize Group Ctx or AIQ ctx
if (!group_mode)
ctx->aiq_ctx = rk_aiq_uapi2_sysctl_init(sns_entity_name, ctx->iqpath,
NULL, NULL);
else {
rk_aiq_camgroup_instance_cfg_t camgroup_cfg;
memset(&camgroup_cfg, 0, sizeof(camgroup_cfg));
camgroup_cfg.sns_num = 1;
camgroup_cfg.sns_num++;
camgroup_cfg.sns_ent_nm_array[0] = sns_entity_name;
camgroup_cfg.sns_ent_nm_array[1] = sns_entity_name2;
camgroup_cfg.config_file_dir = ctx->iqpath;
camgroup_cfg.overlap_map_file = "srcOverlapMap.bin";
ctx->camgroup_ctx = rk_aiq_uapi2_camgroup_create(&camgroup_cfg);
}
// If you need to register a custom AE algorithm, register a custom AE callback
rk_aiq_customeAe_cbs_t cbs = {
.pfn_ae_init = custom_ae_init,
.pfn_ae_run = custom_ae_run,
.pfn_ae_ctrl = custom_ae_ctrl,
.pfn_ae_exit = custom_ae_exit,
};
rk_aiq_uapi2_customAE_register((const rk_aiq_sys_ctx_t*)(ctx->camgroup_ctx),
&cbs);
// If you need to run a third-party AE algorithm, enable the custom AE algorithm. Third-party AE library registration interface, single camera and surround view shared.
//In the current AIQ version, both the default RK algorithm and the third-party algorithm will run, and if necessary, you can call rk_aiq_uapi2_sysctl_enableAxlib to force off RK AE.
rk_aiq_uapi2_customAE_enable((const rk_aiq_sys_ctx_t*)(ctx->camgroup_ctx),
true);
// Prepare the ISP pipeline and configure initialization parameters such as ISP and Sensor
// If necessary, you can call the module API before prepare to modify the module initialization parameters, otherwise the initialization parameters are specified by the IQ file, or are specified by hard code in AIQ, or the chip reset value
if (!group_mode) {
rk_aiq_uapi2_sysctl_prepare(ctx->aiq_ctx, ctx->width, ctx->height,
work_mode);
rk_aiq_uapi2_sysctl_start(ctx->aiq_ctx );
} else {
rk_aiq_uapi2_camgroup_prepare(ctx->camgroup_ctx, work_mode);
ret = rk_aiq_uapi2_camgroup_start(ctx->camgroup_ctx);
}
// Turn on the VI data flow and note that no AIQ library interfaces are called in this section.
start_capturing(ctx);
......
// AIQ internal thread loop work: obtain 3A statistics from the driver, call each algorithm library to calculate new ISP parameters, sensor parameters, etc., and issue new parameters to ISP drivers and sensor drivers.
// This procedure calls the API to set parameters for each algorithm module
......
// Stop the data flow first on exit
stop_capturing(ctx);
// Stop AIQ ctx or Group ctx
if (!group_mode)
rk_aiq_uapi2_sysctl_stop(ctx->aiq_ctx, false);
else
rk_aiq_uapi2_camgroup_stop(ctx->camgroup_ctx);
// Anti-register third-party AEs
rk_aiq_uapi2_customAE_unRegister(ctx->aiq_ctx);
// Deinitialize AIQ ctx or Group ctx
if (!group_mode)
rk_aiq_uapi2_sysctl_deinit(ctx->aiq_ctx);
else
rk_aiq_uapi2_camgroup_destroy(ctx->camgroup_ctx);
1.4.2 内部运行流程
AIQ 内部运行如下图:

英文原稿技术图, PDF p.9.
获取统计线程:持续从 ISP 驱动取得 3A 统计数据,并发送给 3A 计算线程。
3A 计算线程:收到统计数据后,开始调用模块算法(包括 第三方算法回调),计算新参数,再将新参数发送给 ISP 参数设置线程和 SOF 线程。
ISP 参数设置线程:收到新的 ISP 参数设置请求后,在适当时机将请求发送到 ISP 驱动。
SOF 线程:这是 Sensor 帧头事件的响应函数,接收新的曝光设置请求,从队列取出新的曝光参数设置并交给 Sensor 驱动。
2 开发指南
2.1 AE 算法注册
AE 算法注册流程包括注册、使能和注销:调用 rk_aiq_uapi_customAE_register 注册,调用 rk_aiq_uapi_customAE_enable 使能,调用 rk_aiq_uapi_customAE_unRegister 注销(本段接口名按原文保留,后文原型带 uapi2)。
2.1.1 rk_aiq_uapi2_customAE_register
【说明】注册 AE 算法库。
【语法】
XCamReturn
rk_aiq_uapi2_customAE_register(const rk_aiq_sys_ctx_t* ctx,
rk_aiq_customeAe_cbs_t* cbs)
【参数】
| 参数名 | 说明 | 输入/输出 |
|---|---|---|
| ctx | 单摄与环视应用的 AIQ 上下文指针 | 输入 |
| cbs | 回调函数指针 |
【返回值】
| 返回值 | 说明 |
|---|---|
| 0 | 成功 |
| 非 0 | 失败,见错误码表 |
2.1.2 rk_aiq_uapi2_customAE_enable
【说明】注册 AE 算法库。
【语法】
XCamReturn
rk_aiq_uapi2_customAE_enable(const rk_aiq_sys_ctx_t* ctx, bool enable);
【参数】
| 参数名 | 说明 | 输入/输出 |
|---|---|---|
| ctx | 单摄与环视应用的 AIQ 上下文指针 | 输入 |
| enable | AE 算法使能位 | 输入 |
【返回值】
| 返回值 | 说明 |
|---|---|
| 0 | 成功 |
| 非 0 | 失败,见错误码表 |
2.1.3 rk_aiq_uapi2_customAE_unRegister
【说明】注册 AE 算法库。
【语法】
XCamReturn
rk_aiq_uapi2_customAE_unRegister(const rk_aiq_sys_ctx_t* ctx);
【参数】
| 参数名 | 说明 | 输入/输出 |
|---|---|---|
| ctx | 单摄与环视应用的 AIQ 上下文指针 | 输入 |
【返回值】
| 返回值 | 说明 |
|---|---|
| 0 | 成功 |
| 非 0 | 失败,见错误码表 |
2.1.4 回调函数与数据类型
用户需要在自行开发的自定义 AE 库中实现以下回调函数:
rk_aiq_customeAe_cbs_t cbs = {
.pfn_ae_init = custom_ae_init,
.pfn_ae_run = custom_ae_run,
.pfn_ae_ctrl = custom_ae_ctrl,
.pfn_ae_exit = custom_ae_exit,
};
| 成员名 | 说明 |
|---|---|
| pfn_ae_init | 初始化 AE 的回调函数指针 |
| pfn_ae_run | 运行 AE 的回调函数指针 |
| pfn_ae_ctrl | 控制 AE 内部状态的回调函数指针(此参数暂时无效) |
| pfn_ae_exit | 销毁 AE 的回调函数指针 |
2.1.4.1 custom_ae_init
【说明】初始化 AE 算法库。
【语法】
int32_t custom_ae_init(void* ctx);
【参数】
| 参数名 | 说明 | 输入/输出 |
|---|---|---|
| ctx | 单摄与环视应用的 AIQ 上下文指针 | 输入 |
【返回值】
| 返回值 | 说明 |
|---|---|
| 0 | 成功 |
| 非 0 | 失败,见错误码表 |
2.1.4.2 custom_ae_run
【说明】运行 AE 算法库,计算 Sensor 曝光时间和增益、ISP 数字增益,并更新硬件配置参数。
【语法】
int32_t custom_ae_run(void* ctx, const rk_aiq_customAe_stats_t* pstAeInfo,
rk_aiq_customeAe_results_t* pstAeResult);
【参数】
| 参数名 | 说明 | 输入/输出 |
|---|---|---|
| ctx | 单摄与环视应用的 AIQ 上下文指针 | 输入 |
| pstAeInfo | 输入数据参数指针,包含 AE 硬件统计及与其同步的曝光信息;输入 | |
| pstAeResult | 输出算法结果指针,包含 Sensor 曝光结果参数及更新的硬件配置参数 | 输出 |
【返回值】
| 返回值 | 说明 |
|---|---|
| 0 | 成功 |
| 非 0 | 失败,见错误码表 |
2.1.4.3 custom_ae_ctrl
【说明】改变算法库内部状态,暂不可用。
【语法】
int32_t custom_ae_ctrl(void* ctx, uint32_t u32Cmd, void *pValue);
【参数】
| 参数名 | 说明 | 输入/输出 |
|---|---|---|
| ctx | 单摄与环视应用的 AIQ 上下文指针 | 输入 |
【返回值】
| 返回值 | 说明 |
|---|---|
| 0 | 成功 |
| 非 0 | 失败,见错误码表 |
2.1.4.4 custom_ae_exit
【说明】注销 AE 算法库。
【语法】
int32_t custom_ae_exit(void* ctx);
【参数】
| 参数名 | 说明 | 输入/输出 |
|---|---|---|
| ctx | 单摄与环视应用的 AIQ 上下文指针 | 输入 |
【返回值】
| 返回值 | 说明 |
|---|---|
| 0 | 成功 |
| 非 0 | 失败,见错误码表 |
2.1.5 输入数据参数
【说明】
第三方 AE 输入数据包括图像亮度统计及对应曝光参数值,兼容单摄与环视应用。【定义】
#define RK_AIQ_MAX_HDR_FRAME (3)
typedef struct rk_aiq_customAe_stats_s
{
//hw stats
Aec_Stat_Res_t rawae_stat[RK_AIQ_MAX_HDR_FRAME]; // before awb gain
Aec_Stat_Res_t extra; // after awb gain, lsc, TMO
//exposure
RkAiqExpParamComb_t linear_exp;
RkAiqExpParamComb_t hdr_exp[RK_AIQ_MAX_HDR_FRAME];
struct rk_aiq_customAe_stats_s* next; // for surround view(multiple cams)
} rk_aiq_customAe_stats_t;
【成员】
| 成员名 | 说明 |
|---|---|
| rawae_stat[RK_AIQ_MAX_HDR_FRAME] | 基于 RAW 图像的前级硬件统计,最多统计 3 帧。线性曝光仅 rawae_stat[0] 有效;HDR 模式下 rawae_stat[0-2] 分别表示短、中、长帧统计。 |
| extra | 基于 RAW 的后级硬件统计;HDR 模式表示合成帧统计。 |
| linear_exp | 线性模式曝光参数,与硬件统计同步。 |
| hdr_exp[RK_AIQ_MAX_HDR_FRAME] | HDR 曝光参数,与硬件统计同步;0~2 分别为短、中、长帧曝光参数。 |
| next | 仅环视多摄有效;指向下一摄像头输入数据,各摄像头对应输入成员相同。 |
【说明】
输入数据参数分为图像硬件统计数据和该图像对应的曝光参数两类。
输入参数兼容单摄与环视多摄应用,可通过 next 指针获取多摄数据。
图像硬件统计数据类型为 Aec_Stat_Res_t,曝光信息类型为 RkAiqExpParamComb_t,详细类型说明见 Rockchip_Development_Guide_ISP30。
RK_AIQ_MAX_HDR_FRAME 表示 RK 最多支持 3 帧 HDR。
2.1.6 输出算法结果参数
【说明】
第三方 AE 输出包括曝光参数、硬件参数等,兼容单摄与环视应用。
【定义】
#define RK_AIQ_MAX_HDR_FRAME (3)
typedef struct rk_aiq_i2c_data_s {
bool bValid;
unsigned int nNumRegs;
unsigned int* pRegAddr;
unsigned int* pRegValue;
unsigned int* pDelayFrames;
} rk_aiq_i2c_data_t;
typedef struct rk_aiq_customeAe_results_singel_s
{
//exposure result (including:reg value & real value)
RkAiqExpParamComb_t linear_exp;
RkAiqExpParamComb_t hdr_exp[RK_AIQ_MAX_HDR_FRAME];
rk_aiq_i2c_data_t exp_i2c_params;
//hw result
struct window meas_win;
unsigned char meas_weight[15 * 15];
struct rk_aiq_customeAe_results_singel_s* next; // for surround view(multiple
cams)
} rk_aiq_customeAe_results_single_t;
typedef struct rk_aiq_customeAe_results_s
{
//exposure result (including:reg value & real value)
RkAiqExpParamComb_t linear_exp;
RkAiqExpParamComb_t hdr_exp[RK_AIQ_MAX_HDR_FRAME];
rk_aiq_i2c_data_t exp_i2c_params;
//hw result
struct window meas_win;
unsigned char meas_weight[15 * 15];
RkAiqIrisParamComb_t Iris;
uint32_t frame_length_lines;
bool is_longfrm_mode;
struct rk_aiq_customeAe_results_singel_s* next; // for surround view(multiple
cams)
} rk_aiq_customeAe_results_t;
【成员】
| 成员名 | 子成员 | 说明 |
|---|---|---|
| linear_exp | exp_real_params exp_sensor_params |
线性曝光参数,包括实际曝光值 exp_real_params 和 RK 格式寄存器值 exp_sensor_params。 |
| hdr_exp[RK_AIQ_MAX_HDR_FRAME] | exp_real_params exp_sensor_params |
HDR 曝光参数,包括实际值 exp_real_params 与 RK 格式寄存器值 exp_sensor_params。0~2 分别为短、中、长帧;HDR2 合成时 0、1 有效,HDR3 时 0–2 有效。 |
| exp_i2c_params | bValid nNumRegs pRegAddr pRegValue pDelayFrames |
bValid 为 true 时使用 exp_i2c_params 设置 I2C 寄存器值;false 时使用上述 linear_exp 或 hdr_exp 中的 RK 格式寄存器参数。 |
| frame_length_lines | Sensor 的 VTS 值,与帧率设置相关。 | |
| is_longfrm_mode | 长帧模式使能位:true 启用,false 关闭;仅 HDR 模式有效。 | |
| Iris | PIris DCIris | 光圈设置参数,包括 P 光圈与 DC 光圈。 |
| meas_win | h_offs v_offs h_size v_size |
硬件统计窗口区域。h/v_offs 为窗口左上角相对感光区域左上角的水平/垂直偏移;h/v_size 为窗口水平/垂直尺寸。 |
| meas_weight | 硬件统计权重,包含 15X15 个参数,范围 0~32。 | |
| next | 非环视时指针应为空。环视各摄像头使用相同结果时也为空,仅设置 rk_aiq_customeAe_results_t,所有摄像头采用该结果;使用不同结果时,为 next 分配内存并添加下一摄像头算法结果。 |
【注意事项】
输出算法结果兼容单摄与环视多摄应用;环视应用既可使用一组算法结果,也可使用多组结果。
meas_win 为 AE 硬件统计的窗口区域参数;分块亮度、直方图等统计按该区域展开。HDR 多帧曝光应用中,默认各帧采用相同统计窗口。
meas_weight 为加权直方图统计所需的权重参数,通常与计算分块亮度加权均值时使用的软件权重一致。
设置曝光时,应同时配置实际曝光值及相应寄存器值。供其他算法模块使用的实际值包括曝光时间(秒)、曝光增益(倍数)、DCG 状态(0:LCG,1:HCG)。曝光寄存器值对接 Sensor,支持 RK 格式与第三方格式。
RK 格式的曝光寄存器值不需要客户设置,内部会按实际曝光值转换;exp_i2c_params 中 bValid 应为 false。第三方格式需用户设置所需寄存器值及对应地址,bValid 应为 true。
环视应用中,如果所有摄像头使用相同曝光与硬件值,只设置 rk_aiq_customeAe_results_t,next 为空;如果各摄像头需要不同曝光和硬件配置,则按顺序设置结果,并分配内存,使 next 指向下一摄像头的结果。注意 rk_aiq_customeAe_results_t 与 rk_aiq_customeAe_results_single_t 参数不同:前者多出个别结果参数,作为公共参数,默认所有摄像头设置为相同值。
图像硬件统计类型为 Aec_Stat_Res_t,RK 曝光信息类型为 RkAiqExpParamComb_t,RK 光圈参数类型为 RkAiqIrisParamComb_t。详见 Rockchip_Development_Guide_ISP30。
2.2 AWB 算法注册
RK AWB 算法提供 rk_aiq_uapi_customAWB_register 注册函数。用户调用它将自定义 AWB 注册到 ISP,示例与 AE 算法库注册类似;通过 rk_aiq_uapi_customAWB_enable 启用自定义 AWB。
注意:为顺利移植,建议先阅读:
(1) Rockchip_Color_Optimization_Guide 的下列内容:
(a) “2 AWB/2.1 功能说明”及 AWB 流程图。
(b) “2 AWB/2.2 关键参数/硬件白点检测流程”中的 AWB 白点检测流程图。
(2) Rockchip_Development_Guide_ISP30 的“统计数据/数据类型/rk_aiq_isp_awb_stats2_v3x_t”章节。
2.2.1 API
2.2.1.1 rk_aiq_uapi_customAWB_register
【说明】注册自定义 AWB 算法。
【语法】
XCamReturn
rk_aiq_uapi_customAWB_register(const rk_aiq_sys_ctx_t* ctx,
rk_aiq_customeAwb_cbs_t* cbs);
【参数】
| 参数名 | 说明 | 输入/输出 |
|---|---|---|
| ctx | AIQ 上下文指针 | 输入 |
| cbs | 自定义 AWB 向 ISP 库注册的回调函数,见下文 rk_aiq_customeAwb_cbs_t;输入。 |
【返回值】
| 返回值 | 说明 |
|---|---|
| 0 | 成功 |
| 非 0 | 失败,见错误码表 |
【注意】
必须先调用 rk_aiq_uapi_sysctl_init 初始化 AIQ 上下文指针 ctx。
【要求】
头文件:rk_aiq_user_api_custom_awb.h
库文件:librkaiq.so
2.2.1.2 rk_aiq_uapi_customAWB_enable
【说明】启用自定义 AWB 算法。
【语法】
XCamReturn
rk_aiq_uapi_customAWB_enable(const rk_aiq_sys_ctx_t* ctx, bool enable);
【参数】
| 参数名 | 说明 | 输入/输出 |
|---|---|---|
| ctx | AIQ 上下文指针 | 输入 |
| enable | 自定义 AWB 使能开关;取值 true / false;默认 false。 | 输入 |
【返回值】
| 返回值 | 说明 |
|---|---|
| 0 | 成功 |
| 非 0 | 失败,见错误码表 |
【注意】
在 rk_aiq_uapi_customAWB_register 完成自定义 AWB 注册后调用。
【要求】
头文件:rk_aiq_user_api_custom_awb.h
库文件:librkaiq.so
2.2.1.3 rk_aiq_uapi_customAWB_unRegister
【说明】注销自定义 AWB 算法。
【语法】
XCamReturn
rk_aiq_uapi_customAWB_unRegister(const rk_aiq_sys_ctx_t* ctx);
【参数】
| 参数名 | 说明 | 输入/输出 |
|---|---|---|
| ctx | AIQ 上下文指针 | 输入 |
【返回值】
| 返回值 | 说明 |
|---|---|
| 0 | 成功 |
| 非 0 | 失败,见错误码表 |
【注意】
在 rk_aiq_uapi_customAWB_register 完成自定义 AWB 注册后调用。
【要求】
头文件:rk_aiq_user_api_custom_awb.h
库文件:librkaiq.so
2.2.2 数据类型
2.2.2.1 向 ISP 库注册的回调函数
2.2.2.1.1 rk_aiq_customeAwb_cbs_t
【说明】定义自定义 AWB 算法向 ISP 库注册的回调函数。
【定义】
typedef struct rk_aiq_customeAwb_cbs_s
{
int32_t (*pfn_awb_init)(void* ctx);
int32_t (*pfn_awb_run)(void* ctx, const rk_aiq_customAwb_stats_t* pstAwbInfo,
rk_aiq_customeAwb_results_t* pstAwbResult);
int32_t (*pfn_awb_run)(void* ctx, uint32_t u32Cmd, void *pValue);
int32_t (*pfn_awb_exit)(void* ctx);
} rk_aiq_customeAwb_cbs_t;
【成员】
| 成员名 | 说明 |
|---|---|
| pfn_awb_init | 初始化;首次初始化由 AwbDemoPrepare 调用。 |
| pfn_awb_ctrl | 控制自定义 AWB 内部状态的回调,目前不支持。 |
| pfn_awb_run | 运行自定义 AWB 的回调,参见下文 rk_aiq_customAwb_stats_t 与 rk_aiq_customeAwb_results_t。原文称 pstAwbResult==nullptr 表示初始化,用于初始化配置 pstAwbResult;否则按统计 pstAwbInfo 计算 pstAwbResult。环视各摄像头参数相同时按上述实现;不同时配置 pstAwbResult->next(第 1 摄像头)、pstAwbResult->next->next(第 2 摄像头)等;pstAwbResult 对应第 0 摄像头。 |
| pfn_awb_exit | 释放申请的内存等,由 AwbDemoDestroyCtx 调用。 |
【注意】
用户需要在自定义 AWB 库中实现以上回调函数。
pfn_awb_run 的实现可参考 third_party_awb_algo.cpp 中 custom_awb_run 函数的伪代码。
2.2.2.2 统计数据
2.2.2.2.1 rk_aiq_customAwb_stats_t
【说明】定义自定义 AWB 获取的白平衡硬件统计数据。
【定义】
typedef struct rk_aiq_customAwb_stats_s
{
rk_aiq_awb_stat_wp_res_light_v201_t light[RK_AIQ_AWB_MAX_WHITEREGIONS_NUM];
int WpNo2[RK_AIQ_AWB_MAX_WHITEREGIONS_NUM];
rk_aiq_awb_stat_blk_res_v201_t blockResult[RK_AIQ_AWB_GRID_NUM_TOTAL];
rk_aiq_awb_stat_wp_res_light_v201_t multiwindowLightResult[4];
rk_aiq_awb_stat_wp_res_v201_t
excWpRangeResult[RK_AIQ_AWB_STAT_WP_RANGE_NUM_V201];
unsigned int WpNoHist[RK_AIQ_AWB_WP_HIST_BIN_NUM];
struct rk_aiq_customAwb_stats_s* next;
} rk_aiq_customAwb_stats_t;
【成员】
| 成员名 | 说明 |
|---|---|
| light | 主窗口各光源白点统计,最多 RK_AIQ_AWB_MAX_WHITEREGIONS_NUM 个光源。 |
| WpNo2 | 主窗口各光源下 XY 域与 UV 域交集内的白点数,无小数位。 |
| blockResult | 各块 RGB 累加值;图像均匀划为 15x15(RK_AIQ_AWB_GRID_NUM_TOTAL)块。 |
| multiwindowLightResult | 若干子窗口各光源白点统计,只记录前 4 个光源;可通过时分复用记录全部光源;最多 4 个子窗口。 |
| excWpRangeResult | 落入 excludeWpRange 的点统计,只记录前 4 个区域,最多 4 区域。 |
| WpNoHist | 白点直方图各 bin 的白点数,无小数位;统计 XY 域哪种框内白点由 xyRangeTypeForWpHist 决定(原文对框类型的描述重复,未猜改)。 |
| next | 仅环视多摄有效,指向下一摄像头白平衡硬件统计。 |
【注意】
各成员详情见 Rockchip_Development_Guide_ISP30 的“统计数据/数据类型”章节中 rk_aiq_isp_awb_stats2_v3x_t 结构体成员定义。
2.2.2.3 运算结果
2.2.2.3.1 rk_aiq_customeAwb_results_t
【说明】定义自定义 AWB 的配置参数与计算结果。
【定义】
typedef struct rk_aiq_customeAwb_results_s
{
bool IsConverged; true: converged; false: not converged
rk_aiq_wb_gain_t awb_gain_algo;
float awb_smooth_factor;
rk_aiq_customAwb_hw_cfg_t awbHwConfig;
rk_aiq_customeAwb_single_results_t *next;//defalut vaue is nullptr,which means all cameras with the same cfg;
} rk_aiq_customeAwb_results_t;
【成员】
| 成员名 | 说明 |
|---|---|
| IsConverged | 当前 AWBgain 是否收敛:true 收敛,false 未收敛;默认 false;必须配置。 |
| awb_gain_algo | 自定义 AWB 得到的 R、GR、GB、B 通道增益;默认 {1.0, 1.0, 1.0, 1.0},即不校正白平衡;必须配置。 |
| awb_smooth_factor | 提供给 CCM 和 LSC 的帧间平滑因子,越大则当前帧权重越小;范围 [0,1],默认 0.5;可不配置。 |
| awbHwConfig | 自定义 AWB 硬件配置;大部分及模组相关参数须正确配置,其他参数已有默认值,可不更新。详见下文 rk_aiq_customAwb_hw_cfg_t。 |
| next | 非环视无需关注。多摄使用相同结果时指针为空,所有摄像头采用 rk_aiq_customeAwb_results_t;使用不同 rk_aiq_customeAwb_single_results_t 成员结果时,为 next 分配内存并加入下一摄像头结果,其对应成员覆盖 rk_aiq_customeAwb_results_t 中的值。该类型定义见下文。 |
2.2.2.3.2 rk_aiq_customeAwb_single_results_t
【说明】定义自定义 AWB 环视模式下各摄像头的配置参数及计算结果;非环视模式无需关注。
【定义】
typedef struct rk_aiq_customeAwb_single_results_s
{
rk_aiq_wb_gain_t awb_gain_algo;//for each camera
rk_aiq_customAwb_single_hw_cfg_t awbHwConfig;//for each camera
struct rk_aiq_customeAwb_single_results_s *next;
} rk_aiq_customeAwb_single_results_t;
【成员】
| 成员名 | 说明 |
|---|---|
| awb_gain_algo | 含义同 rk_aiq_customeAwb_results_s 的 awb_gain_algo。 |
| awbHwConfig | 含义同 rk_aiq_customeAwb_results_s 内 awbHwConfig 结构的同名成员。 |
| next | 原文写“Useless”,并指向 rk_aiq_customeAwb_results_s 的 next(原文写 anext)成员含义,存在歧义。 |
2.2.2.3.3 rk_aiq_wb_gain_t
见 Rockchip_Development_Guide_ISP32 的“AWB/功能级 API/数据类型”中 rk_aiq_wb_gain_t 结构体定义(原文引用 ISP32)。
2.2.2.3.4 rk_aiq_customAwb_hw_cfg_t
【说明】定义自定义 AWB 的硬件配置,包括主窗口、多窗口配置及统计帧选择等。
【定义】
typedef struct rk_aiq_customAwb_hw_cfg_s {
bool awbEnable;
bool lscBypEnable;
uint8_t frameChoose;
unsigned short windowSet[4];
unsigned char lightNum;
unsigned short maxR;
unsigned short minR;
unsigned short maxG;
unsigned short minG;
unsigned short maxB;
unsigned short minB;
unsigned short maxY;
unsigned short minY;
bool uvDetectionEnable;
rk_aiq_awb_uv_range_para_t uvRange_param[RK_AIQ_AWB_MAX_WHITEREGIONS_NUM];
bool xyDetectionEnable;
rk_aiq_rgb2xy_para_t rgb2xy_param;
rk_aiq_awb_xy_range_para_t xyRange_param[RK_AIQ_AWB_MAX_WHITEREGIONS_NUM];
bool threeDyuvEnable;
unsigned short threeDyuvIllu[RK_AIQ_AWB_YUV_LS_PARA_NUM];
short icrgb2RYuv_matrix[12];
rk_aiq_awb_rt3dyuv_range_para_t
ic3Dyuv2Range_param[RK_AIQ_AWB_YUV_LS_PARA_NUM];
bool multiwindow_en;
unsigned short multiwindow[RK_AIQ_AWB_MULTIWINDOW_NUM_V201][4];
} rk_aiq_customAwb_hw_cfg_t;
【成员】
| 成员名 | 说明 |
|---|---|
| awbEnable | AWB 统计使能;true 开启,false 关闭;默认 true。 |
| lscBypEnable | AWB 统计通路的 LSC 旁路:true 旁路(不经过 LSC),false 不旁路(经过 LSC);默认 false。 |
| frameChoose | AWB 硬件统计输入帧,{0,1,2} 分别为短、中、长帧;线性模式默认 0,宽动态模式默认 1。 |
| windowSet | AWB 主统计窗口:windowSet=[h_offset,v_offset,h_size,v_size],h 水平、v 垂直;范围 [0x0, 0xfff];h_size* v_size 必须小于 5120*2880;默认 {0, 0, RawWidth, RawHeight} 为全窗口,不改变窗口时无需配置。 |
| lightNum | 统计光源数,范围 [0, 7],默认 7。应按校准所用光源数设置,由校准工具输出。 |
| maxR | RGB 域白点统计时,R 通道检测上限;范围 [0x0, 0xff];默认 230。 |
| minR | RGB 域白点统计时,R 通道检测下限;范围 [0x0, 0xff];默认 3。 |
| maxG | RGB 域白点统计时,G 通道检测上限;范围 [0x0, 0xff];默认 230。 |
| minG | RGB 域白点统计时,G 通道检测下限;范围 [0x0, 0xff];默认 3。 |
| maxB | RGB 域白点统计时,B 通道检测上限;范围 [0x0, 0xff];默认 230。 |
| minB | RGB 域白点统计时,B 通道检测下限;范围 [0x0, 0xff];默认 3。 |
| maxY | RGB 域白点统计时,Y 通道检测上限;范围 [0x0, 0xff];默认 230。 |
| minY | RGB 域白点统计时,Y 通道检测下限;范围 [0x0, 0xff];默认 3。 |
| uvDetectionEnable | UV 白点检测开关:true 时范围内的点为白点;false 时所有点为白点;默认 true。 |
| uvRange_param | UV 四边形白点区域限制,最多 7 光源。与模组相关;uvDetectionEnable=ture(原文拼写)时必须正确配置,未定点参数可由校准工具取得;见 rk_aiq_awb_uv_range_para_t。 |
| xyDetectionEnable | XY 白点检测开关:true 时区间内的点为白点;false 时所有点为白点;默认 true。 |
| rgb2xy_param | RGB 到 XY 转换参数,与模组相关;xyDetectionEnable=true 时须正确配置。校准工具可提供未定点参数,见 rk_aiq_rgb2xy_para_t。 |
| xyRange_param | XY 四边形白点区域限制,最多 7 光源;与模组相关,xyDetectionEnable=true 时须正确配置。未定点参数由校准工具取得,见 rk_aiq_awb_xy_range_para_t。 |
| threeDyuvEnable | YUV 白点检测使能:true 开启,false 关闭;默认 true。 |
| threeDyuvIllu | 范围 [0, 7];7 表示关闭 YUV 白点检测(所有点为白点),其他数字启用对应光源;默认 {7, 7, 7, 7}。 |
| icrgb2RYuv_matrix | RGB 到 YUV 旋转矩阵,与模组相关;原文条件写为“threeDyuvEnable and turethreeDyuvIllu is not 7”,须结合 API 核实。最后一列范围 [-2^12,2^12-1],其他为 [-2^9,2^9-1];未定点参数可由校准工具得到。 |
| ic3Dyuv2Range_param | YUV 白点限制参数,与模组相关;原文条件同上,未定点参数可由校准工具取得。详见 rk_aiq_awb_rt3dyuv_range_para_t。 |
| multiwindow_en | AWB 多窗口统计开关:true 开启,false 关闭;默认 false。 |
| multiwindow | AWB 多窗口配置,最多 4 窗口;multiwindow[i]=[h_offset,v_offset,h_size,v_size],h 水平、v 垂直;范围 [0x0, 0xfff]。 |
| excludeWpRange | 在 UV 或 XY 域最多配置 7 个白点/非白点区间,前 4 个可作附加白点区间;与模组相关。见 rk_aiq_awb_exc_range_v201_t。 |
| wpDiffWeiEnable | 白点亮度权重调整使能:true 开启,false 关闭;默认 false。 |
| wpDiffwei_y | 白点亮度直方图区间共 9 个端点,范围 [0x0, 0xff];wpDiffwei_y 相邻间隔必须为 2 的幂。 |
| wpDiffwei_w | wpDiffwei_y 各端点权重,范围 [0, 31],5 位小数,默认 31。 |
| xyRangeTypeForWpHist | 白点亮度直方图选择中框或大框:RK_AIQ_AWB_XY_TYPE_NORMAL_V201 对应中框,RK_AIQ_AWB_XY_TYPE_BIG_V201 对应大框;默认 RK_AIQ_AWB_XY_TYPE_NORMAL_V201。 |
| blkWeightEn | 分块权重配置开关;原文“rue enabled”,false 关闭;默认 false(拼写疑点保留)。 |
| blkWeight | 分块权重,范围 [0,63],6 位小数。 |
| blkMeasureMode | 选择块内全部点或仅白点参与统计:RK_AIQ_AWB_BLK_STAT_MODE_ALL_V201 为全部点,RK_AIQ_AWB_BLK_STAT_MODE_REALWP_V201 为白点;默认 RK_AIQ_AWB_BLK_STAT_MODE_ALL_V201。 |
| xyRangeTypeForBlkStatistics | 仅 blkMeasureMode=RK_AIQ_AWB_BLK_STAT_MODE_REALWP_V201 时有效。选择中框或大框白点,分别为 RK_AIQ_AWB_XY_TYPE_NORMAL_V201、RK_AIQ_AWB_XY_TYPE_BIG_V201;默认 RK_AIQ_AWB_XY_TYPE_NORMAL_V201。 |
| illIdxForBlkStatistics | 选择统计哪个光源的白点,仅 blkMeasureMode=RK_AIQ_AWB_BLK_STAT_MODE_REALWP_V201 时有效。可取 {RK_AIQ_AWB_BLK_STAT_REALWP_ILL0, RK_AIQ_AWB_BLK_STAT_REALWP_ILL1, RK_AIQ_AWB_BLK_STAT_REALWP_ILL2, RK_AIQ_AWB_BLK_STAT_REALWP_ILL3, RK_AIQ_AWB_BLK_STAT_REALWP_ILL4, RK_AIQ_AWB_BLK_STAT_REALWP_ILL5, RK_AIQ_AWB_BLK_STAT_REALWP_ILL6, RK_AIQ_AWB_BLK_STAT_REALWP_ALL}。 |
【注意】
注意,原文标为黑色的参数可配置默认值(该颜色标记表述按原文保留;应结合各参数说明核对)。
若需深入理解这些参数,请参考 Rockchip_Color_Optimization_Guide 中的下列内容:
(a) “2 AWB/2.1 功能说明”及 AWB 流程图。
(b) “2 AWB/2.2 关键参数/硬件白点检测流程”中的 AWB 白点检测流程图。
2.2.2.3.5 rk_aiq_customAwb_hw_cfg_t
【说明】定义环视模式下各摄像头的差异化硬件配置;非环视模式无需关注(本节标题重复上一结构名,代码定义以原文为准)。
【定义】
typedef struct rk_aiq_customAwb_single_hw_cfg_t {
unsigned short windowSet[4];
bool multiwindow_en;
unsigned short multiwindow[RK_AIQ_AWB_MULTIWINDOW_NUM_V201][4];
bool blkWeightEnable;
unsigned char blkWeight[RK_AIQ_AWB_GRID_NUM_TOTAL];
} rk_aiq_customAwb_single_hw_cfg_t;
【成员】
| 成员名 | 说明 |
|---|---|
| windowSet | 含义同 rk_aiq_customAwb_hw_cfg_t 中的 windowSet。 |
| multiwindow_en | 含义同 rk_aiq_customAwb_hw_cfg_t 中的 multiwindow_en。 |
| multiwindow | 含义同 rk_aiq_customAwb_hw_cfg_t 中的 multiwindow。 |
| blkWeightEnable | 原文为“Tongke_Ike_Kustomab_Hall_Cob_T-Bulkwertnabul meaning”,无法可靠还原,保留待核对。 |
| blkWeight | 原文为“Tongke_Ike_Coustomab_Hall_Cove_Tur in Burkwaite meaning”,无法可靠还原,保留待核对。 |
2.2.2.3.6 rk_aiq_awb_uv_range_para_t
【说明】定义自定义 AWB 在 UV 域的四边形白点区域限制参数。

英文原稿技术图, PDF p.30.
【定义】
typedef struct rk_aiq_awb_uv_range_para_s {
unsigned short pu_region[5];
unsigned short pv_region[5];
int slope_inv[4];
} rk_aiq_awb_uv_range_para_t;
【成员】
| 成员名 | 说明 |
|---|---|
| pu_region | UV 白点区域的 U 坐标组成闭环,如 [u0,u1,u2,u3,u0];范围 [0x0, 0x1ff],1 位小数。 |
| pv_region | UV 白点区域的 V 坐标组成闭环,如 [v0,v1,v2,v3,v0];范围 [0x0, 0x1ff],1 位小数。 |
| slope_inv | UV 白点区域四条边斜率的倒数,可取 10 位小数。 |
【注意】
依据 Rockchip_Color_Optimization_Guide_ISP30 的“AWB/UV 域白点检测”章节进行定点化或转换;参数由校准工具得到。
参数与模组相关;uvDetectionEnable 为 ture(原文拼写)时必须正确配置。
2.2.2.3.7 rk_aiq_rgb2xy_para_t
【说明】定义自定义 AWB 的 RGB 域到 XY 域转换参数。
【定义】
typedef struct rk_aiq_rgb2xy_para_s {
unsigned short pseudoLuminanceWeight[3];
short rotationMat[9];
} rk_aiq_rgb2xy_para_t;
【成员】
| 成员名 | 说明 |
|---|---|
| pseudoLuminanceWeight | RGB 到 XY 转换参数:[0, 2^12-1],12 位小数。 |
| rotationMat | RGB 到 XY 转换参数:[-2^14, 2^14-1],12 位小数。 |
【注意】
依据 Rockchip_Color_Optimization_Guide_ISP30 的“AWB/RGB2XY”章节对参数定点化;参数由校准工具得到。
参数与模组相关;xyDetectionEnable 为 ture(原文拼写)时必须正确配置。
2.2.2.3.8 rk_aiq_awb_xy_range_para_t
【说明】定义自定义 AWB 在 XY 域的四边形白点区域限制参数。

英文原稿技术图, PDF p.31.
【定义】
typedef struct rk_aiq_awb_xy_range_para_s {
int NorrangeX[2];
int NorrangeY[2];
int SperangeX[2];
int SperangeY[2];
int SmalrangeX[2];
int SmalrangeY[2];
} rk_aiq_awb_xy_range_para_t;
【成员】
| 成员名 | 说明 |
|---|---|
| NorrangeX | XY 白点区间水平起止坐标 [x0,x1],范围 [-2^13, 2^13-1],10 位小数。 |
| NorrangeY | XY 白点区间垂直起止坐标 [y0,y1],范围 [-2^13, 2^13-1],10 位小数。 |
| SperangeX | XY 白点区间水平起止坐标 [x0,x1],范围 [-2^13, 2^13-1],10 位小数。 |
| SperangeY | XY 白点区间垂直起止坐标 [y0,y1],范围 [-2^13, 2^13-1],10 位小数。 |
| SmalrangeX | XY 小框水平起止坐标 [x0,x1];当前版本不支持;范围 [-2^13, 2^13-1],10 位小数。 |
| SmalrangeY | XY 小框垂直起止坐标 [y0,y1];当前版本不支持;范围 [-2^13, 2^13-1],10 位小数。 |
【注意】
依据 Rockchip_Color_Optimization_Guide_ISP30 的“AWB/XY 域白点检测”章节对参数定点化;参数由校准工具得到。
参数与模组相关;xyDetectionEnable 为 ture(原文拼写)时必须正确配置。
2.2.2.3.9 rk_aiq_awb_rt3dyuv_range_para_t
【说明】定义自定义 AWB 在 YUV 域的白点限制参数。
【定义】
typedef struct rk_aiq_awb_rt3dyuv_range_para_s {
unsigned char thcurve_u[6];
unsigned short thcure_th[6];
unsigned short lineP1[3];
short vP1P2[3];
unsigned char disP1P2;
} rk_aiq_awb_rt3dyuv_range_para_t;
【成员】
| 成员名 | 说明 |
|---|---|
| thcurve_u | u-th 折线的 u 分量;范围 [0x0, 0xff];相邻两个 u 分量之差必须为 2 的幂。 |
| thcure_th | u-th 折线的 th 分量;范围 [0x0, 0xfff],4 位小数;折线必须单调递增。 |
| lineP1 | 计算理论白点 (y’,u0,v0) 所需的 YUV 域 p1 坐标;各分量范围 [0x0, 0xfff],4 位小数。 |
| vP1P2 | 计算理论白点 (y’,u0,v0) 所需的 YUV 域 p1 到 p2 向量;各分量范围 [-2^12, 2^12-1],4 位小数。 |
| disP1P2 | p1 与 p2 欧氏距离为 2^disP1P2;范围 [0,5]。 |
【注意】

英文原稿技术图, PDF p.33.
依据 Rockchip_Color_Optimization_Guide_ISP30 的“AWB/YUV 域白点检测”章节进行定点化或转换;参数由校准工具得到。
参数与模组相关;threeDyuvEnable 为 ture(原文拼写)且 threeDyuvIllu 不为 7 时必须正确配置。
2.2.2.3.10 rk_aiq_awb_exc_range_v201_t
【说明】定义自定义 AWB 在 UV 或 XY 域的白点排除/附加区域限制参数。
【定义】
typedef struct rk_aiq_awb_exc_range_v201_s {
rk_aiq_awb_exc_range_domain_t domain;
bool excludeEnable[RK_AIQ_AWB_XY_TYPE_MAX_V201];
bool measureEnable;
int xu[2];
int yv[2];
} rk_aiq_awb_exc_range_v201_t;
【成员】
| 成员名 | 说明 |
|---|---|
| rk_aiq_awb_exc_range_domain_t | 选择在 UV 或 XY 域排除/附加白点区间;RK_AIQ_AWB_EXC_RANGE_DOMAIN_UV 和 RK_AIQ_AWB_EXC_RANGE_DOMAIN_XY 分别代表 UV 与 XY 域。 |
| excludeEnable | 排除区域开关:true 开启,false 关闭;默认 true。 |
| measureEnable | 是否统计排除/附加区域的 RGain、BGain 通道和;true 统计,false 不统计;默认 false。 |
| xu | UV 或 XY 白点排除/附加区域水平起止坐标 xu={x0,x1};范围 -2^13, 2^13-1。 |
| yv | UV 或 XY 白点排除/附加区域垂直起止坐标 yv={y0,y1};范围 -2^13, 2^13-1。 |
【注意】
最多可配置 7 个窗口,但只有前 4 个的 measureEnable 可设为 true。
2.3 开发用户 AF 算法
不使用 RK AF 算法库时,用户可依据 3A 统计值开发 AF 算法,实现变焦对焦等功能。
实现 AF 算法时:
1. 首先调用 rk_aiq_user_api2_af_SetAttrib 配置 AF 统计。
2. 使用 rk_aiq_uapi_sysctl_get3AStatsBlk 获取 3A 统计值。此 API 阻塞等待,生成新统计值后立即返回。
3. 用户 AF 算法按 3A 统计值计算,并驱动变焦与对焦马达运动。
4. 最后调用 rk_aiq_uapi_sysctl_release3AStatsRef 释放取得的 3A 统计值。
算法整体流程如下图。

英文原稿技术图, PDF p.35.
2.3.1 AF 统计模块

英文原稿技术图, PDF p.35.
Sensor 输入 HDR 图像时,AF 模块可选择 HDR 短/中/长曝光输出图像或 HDR 合成图像数据作为统计输入。
Sensor 输入 Normal 图像时,可选择 Sensor 输入图像或 debayer 后图像作为 AF 统计输入。
共支持两个窗口:主窗口 A 与独立窗口 B。
主窗口 A 包含 15*15 子窗口,可配置 V1/V2/H1/H2 四个滤波器,输出相应的四组 FV 值以及亮度值和高亮统计值。
独立窗口 B 使用固定算子计算 FV,可输出一个 FV 值、亮度值与高亮统计值。
2.3.2 AF 统计窗口配置
主窗口 A 与独立窗口 B 均支持矩形配置,可配置左上角坐标以及宽度和高度。

英文原稿技术图, PDF p.36.
2.3.3 Gamma
Gamma 将 Sensor 输入的 RAW 图像转换为人眼感知自然亮度的形式。x 坐标为 0 至 1023,分段如下:16 16 16 16 32 32 32 32 64 64 64 128 128 128 128 128。y 坐标范围为 0 至 1023。

英文原稿技术图, PDF p.36.
2.3.4 对焦滤波器
主窗口 A 提供可设置的 V1/V2/H1/H2 四个滤波器;独立窗口 B 使用固定算子计算。
V1/V2/H1/H2 滤波器频段可调整,滤波器寄存器值由滤波器设计工具生成。

英文原稿技术图, PDF p.37.
2.3.5 亮度/高亮
主窗口 A 提供亮度统计与高亮计数统计。
FV 容易受光源影响。失焦时光晕扩散,使图像低频分量增加,出现图像模糊但 FV 增大的现象。
一般使用高亮计数器处理:失焦时光晕扩展,高亮点数量增加;对焦清晰时高亮点数量最少。
2.3.6 亮度依赖增益(LDG)
也可使用 LDG 按像素亮度衰减 FV,降低过亮与过暗点的 FV,以消除光源影响。

英文原稿技术图, PDF p.38.
亮度在 [ldg_xl, ldg_xh] 时,输出 Gain 为 1,FV 不衰减。
亮度在 [0, ldg_xl] 时,Gain 按斜率 ldg_kl 衰减,最小为 ldg_yl。
gain = 256 - ldg_kl*(ldg_xl - x)/256; gain = max(gain, ldg_yl);
亮度在 [ldg_xh, 255] 时,Gain 按斜率 ldg_kh 衰减,最小为 ldg_yh。
gain = 256 - ldg_kh*(x-ldg_xh)/256; gain = max(gain, ldg_yh);
水平 H1/H2 共用一条 LDG 曲线,垂直 V1/V2 共用一条 LDG 曲线。
2.3.7 FV 阈值
计算 FV 时,低于 FV 阈值的值不计入最终输出,以降低噪声影响。

英文原稿技术图, PDF p.39.
FV 阈值作用于滤波结果经过 LDG 后的输出值。
2.3.8 FV 计算
FV 支持绝对值与平方模式。平方模式对 FV 求平方,可增加清晰位置 FV 的占比。
为防止最终 FV 溢出,可设置主窗口 v1/v2/h1/h2 的四个右移值,以及独立窗口 fv/luma 的两个右移值。
2.3.9 FV 输出
主窗口 A 输出包含 1515 的 v1/v2/h1/h2 FV 信息,以及 1515 的 luma/highlight 信息(原文如此连写,结合前文和下图为 15×15 网格)。
主窗口 A 输出在图像上的分布如下图。
独立窗口 B 输出包含一个 FV、一个亮度值和一个高亮统计值。

英文原稿技术图, PDF p.40.
原图 FV 分块网格的可编辑转录:
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv |
| 2 | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv |
| 3 | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv |
| 4 | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv |
| 5 | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv |
| 6 | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv |
| 7 | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv |
| 8 | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv |
| 9 | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv |
| 10 | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv |
| 11 | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv |
| 12 | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv |
| 13 | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv |
| 14 | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv |
| 15 | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv | Fv |
2.3.10 最终 FV 值计算
H1 与 V1 可配置为低通频段用于粗搜,H2 与 V2 配置为高通频段用于细搜。
水平滤波输出 H 与垂直滤波输出 V 可按指定权重加权。
FV = FvH * weight + FvV * (1-weight)
各分块 FV 也可按需要进行加权。
2.3.11 AF 统计配置
使用 rk_aiq_user_api2_af_SetAttrib 配置。
XCamReturn
rk_aiq_user_api2_af_SetAttrib(const rk_aiq_sys_ctx_t* sys_ctx, rk_aiq_af_attrib_t
attr);
| 参数名 | 说明 | 输入/输出 |
|---|---|---|
| sys_ctx | AIQ 上下文指针 | 输入 |
| attr | 对焦的参数属性 | 输入 |
参数 rk_aiq_af_attrib_t 中的 rk_aiq_af_algo_meas_v30_t 定义如下:
typedef struct {
unsigned char af_en;
unsigned char rawaf_sel;
unsigned char gamma_en;
unsigned char gaus_en;
unsigned char v1_fir_sel;
unsigned char hiir_en;
unsigned char viir_en;
unsigned char v1_fv_outmode; // 0 square, 1 absolute
unsigned char v2_fv_outmode; // 0 square, 1 absolute
unsigned char h1_fv_outmode; // 0 square, 1 absolute
unsigned char h2_fv_outmode; // 0 square, 1 absolute
unsigned char ldg_en;
unsigned char accu_8bit_mode; // fix to 1
unsigned char ae_mode;
unsigned char y_mode; // fix to 0
unsigned char line_en[RKAIQ_RAWAF_LINE_NUM];
unsigned char line_num[RKAIQ_RAWAF_LINE_NUM];
unsigned char window_num;
unsigned short wina_h_offs;
unsigned short wina_v_offs;
unsigned short wina_h_size;
unsigned short wina_v_size;
unsigned short winb_h_offs;
unsigned short winb_v_offs;
unsigned short winb_h_size;
unsigned short winb_v_size;
unsigned short gamma_y[RKAIQ_RAWAF_GAMMA_NUM];
// [old version param]
unsigned short thres;
unsigned char shift_sum_a;
unsigned char shift_sum_b;
unsigned char shift_y_a;
unsigned char shift_y_b;
/**********[Vertical IIR (v1 & v2)]************/
short v1_iir_coe[9];
short v1_fir_coe[3];
short v2_iir_coe[3];
short v2_fir_coe[3];
/**********[Horizontal IIR (h1 & h2)]************/
short h1_iir1_coe[6];
short h2_iir1_coe[6];
short h1_iir2_coe[6];
short h2_iir2_coe[6];
/**********[Focus value statistic param]**********/
// level depended gain
// input8 lumi, output8bit gain
unsigned char h_ldg_lumth[2]; //luminance thresh
unsigned char h_ldg_gain[2]; //gain for [minLum,maxLum]
unsigned short h_ldg_gslp[2]; //[slope_low,-slope_high]
unsigned char v_ldg_lumth[2];
unsigned char v_ldg_gain[2];
unsigned short v_ldg_gslp[2];
// coring
unsigned short v_fv_thresh;
unsigned short h_fv_thresh;
// left shift, more needed if outmode=square
unsigned char v1_fv_shift; //only for sel1
unsigned char v2_fv_shift;
unsigned char h1_fv_shift;
unsigned char h2_fv_shift;
/**********[High light]**********/
unsigned short highlit_thresh;
} rk_aiq_af_algo_meas_v30_t;
| 成员名 | 说明 |
|---|---|
| af_en | AF 信息统计使能,0 关闭,1 开启。 |
| rawaf_sel | AF 统计输入通道,范围 0–3,对应 HDR 长/中/短/合成帧;通常选择中帧。非 HDR 设 0,HDR 设 1(通道顺序按原文保留)。 |
| gamma_en | Gamma 使能,0 关闭,1 开启。 |
| gaus_en | 必须固定设为 1。 |
| v1_fir_sel | 必须固定设为 1。 |
| hiir_en | H1/H2 通道使能,0 关闭,1 开启。 |
| viir_en | V1/V2 通道使能,0 关闭,1 开启。gamma_en 开启时 viir_en 必须设为 1。 |
| v1_fv_outmode | V1 通道 FV 输出模式,0 平方,1 绝对值。 |
| v2_fv_outmode | V2 通道 FV 输出模式,0 平方,1 绝对值。 |
| h1_fv_outmode | H1 通道 FV 输出模式,0 平方,1 绝对值。 |
| h2_fv_outmode | H2 通道 FV 输出模式,0 平方,1 绝对值。 |
| ldg_en | LDG 功能使能,0 关闭,1 开启。 |
| accu_8bit_mode | 必须固定设为 1。 |
| ae_mode | ae_mode=1 时 RAWAF 启用 15x15 亮度均值统计,复用 RAWAE_BIG 模块逻辑。 |
| y_mode | 必须固定设为 0。 |
| line_en | 尚未生效。 |
| line_num | 尚未生效。 |
| window_num | 有效窗口数:window_num=1 时仅 WinA 主窗口生效;window_num=2 时 WinA 与独立窗口 WinB 均生效。 |
| wina_h_offs | WinA 左上角第一个像素的水平坐标,必须大于或等于 2。 |
| wina_v_offs | WinA 左上角第一个像素的垂直坐标,必须大于或等于 1。 |
| wina_h_size | WinA 宽度,必须小于图像宽度 -2-wina_h_offs,且是 15 的倍数。 |
| wina_v_size | 原文称 WinA“宽度”,须小于图像“宽度” -2-wina_v_offs,且是 15 的倍数;字段名为垂直尺寸,此矛盾保留待核对。 |
| winb_h_offs | WinB 左上角第一个像素的水平坐标,必须大于或等于 2。 |
| winb_v_offs | WinB 左上角第一个像素的垂直坐标,必须大于或等于 1。 |
| winb_h_size | WinB 宽度,必须小于图像宽度 -2-wina_h_offs(原文这里引用 wina,未改为 winb)。 |
| winb_v_size | WinB 高度,必须小于图像高度 -2-wina_v_offs(原文引用 wina,未改)。 |
| gamma_y | Gamma 表 y 值范围 0–1023;x 坐标为 0 至 1023,分段:16 16 16 16 32 32 32 32 64 64 64 128 128 128 128 128。 |
| thres | 计算的 FV 小于此值时置 0,以降低噪声影响;范围 0–0xFFFF。 |
| shift_sum_a | 当前不可用,可固定设 0。 |
| shift_sum_b | WinB FV 右移位数,用于避免 FV 溢出;范围 0–7(原文“shit bit”按位移语义翻译)。 |
| shift_y_a | 当前不可用,可固定设 0。 |
| shift_y_b | WinB luma 右移位数,用于避免亮度值溢出;范围 0–7。 |
| v1_iir_coe[9] | V1 通道 3X3 IIR 系数,按 AF 滤波器系数生成工具输出设置。 |
| v1_fir_coe[3] | V1 通道 1x3 FIR 系数,按 AF 滤波器系数生成工具输出设置。 |
| v2_iir_coe[3] | V2 通道 1x3 IIR 系数,按 AF 滤波器系数生成工具输出设置。 |
| v2_fir_coe[3] | V2 通道 1x3 FIR 系数,按 AF 滤波器系数生成工具输出设置。 |
| h1_iir1_coe[6] | H1 通道 1X6 IIR1 系数,按 AF 滤波器系数生成工具输出设置。 |
| h2_iir1_coe[6] | H2 通道 1X6 IIR1 系数,按 AF 滤波器系数生成工具输出设置。 |
| h1_iir2_coe[6] | H1 通道 1X6 IIR2 系数,按 AF 滤波器系数生成工具输出设置。 |
| h2_iir2_coe[6] | H2 通道 1X6 IIR2 系数,按 AF 滤波器系数生成工具输出设置。 |
| h_ldg_lumth[2] | H1/H2 通道 LDG 的亮度阈值系数;0 为左侧暗区,1 为右侧亮区;范围 0~255。 |
| h_ldg_gain[2] | H1/H2 通道 LDG 的最小增益系数;0 为左侧暗区,1 为右侧亮区;范围 0~255。 |
| h_ldg_gslp[2] | H1/H2 通道 LDG 的斜率系数;0 为左侧暗区,1 为右侧亮区;范围 0~65535。 |
| v_ldg_lumth[2] | V1/V2 通道 LDG 的亮度阈值系数;0 为左侧暗区,1 为右侧亮区;范围 0~255。 |
| v_ldg_gain[2] | V1/V2 通道 LDG 的最小增益系数;0 为左侧暗区,1 为右侧亮区;范围 0~255。 |
| v_ldg_gslp[2] | V1/V2 通道 LDG 的最小增益系数;0 为左侧暗区,1 为右侧亮区;范围 0~255。 |
| v_fv_thresh | V1/V2 的 AF 统计阈值,FV 小于阈值时置 0 以降低噪声;范围 0–0x0FFF。 |
| h_fv_thresh | H1/H2 的 AF 统计阈值,FV 小于阈值时置 0 以降低噪声;范围 0–0x0FFF。 |
| v1_fv_shift | V1 的 FV 右移位数,避免 FV 输出溢出;范围 0–7。 |
| v2_fv_shift | V2 的 FV 右移位数,避免 FV 输出溢出;范围 0–7。 |
| h1_fv_shift | H1 的 FV 右移位数,避免 FV 输出溢出;范围 0–7。 |
| h2_fv_shift | H2 的 FV 右移位数,避免 FV 输出溢出;范围 0–7。 |
| highlit_thresh | 高亮统计阈值,像素高于此值视为高亮并参与计数,仅累加各区域高亮点数量;范围 0–0x0FFF。 |
2.3.12 获取 AF 统计值
详见 Rockchip_Development_Guide_ISP30 的“统计数据”章节。
rk_aiq_uapi_sysctl_get3AStatsBlk () / rk_aiq_uapi_sysctl_release3AStatsRef()
AF 统计结果对应结构体为 rk_aiq_af_algo_stat_v30_t。
2.3.13 滤波器设计工具的使用
请参考 Filter Design Tool 文档。
2.4 参考代码示例
客户实现 3A 算法时可参考以下代码示例:
目录:AIQ 根目录/rkisp_demo/demo/
|-------ae_algo_demo:AE 算法参考代码。
|-------awb_algo_demo:AWB 算法参考代码。
|-------af_algo_demo:AF 算法参考代码。
