Rockchip · AI & Linux Hub

Камеры и видео

Разработка собственной 3A для Rockchip ISP30: API и статистика AE, AWB, AF

Полный материал RK3588 Linux 5.10: регистрация собственной 3A, вызовы и структуры AE/AWB, статистика и фильтры AF, примеры исходника.

· ArmSoM Editorial · Rockchip source documentation · 51 мин чтения

Статья полностью сохраняет техническую часть (стр.5–46 PDF) английского исходника V1.1.0 объёмом 46 страниц и предоставляет полный китайский и русский перевод. Соответствующий китайский PDF не предоставлен. Все три статьи используют 14 оригинальных рисунков английского PDF, включая имеющиеся китайские подписи. Код, комментарии, 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, уже содержащего библиотеку 3A RK, включённую по умолчанию. При необходимости пользователь может реализовать собственную библиотеку 3A по этому руководству.

1.1 Принцип проектирования

Основная схема показана ниже:

Технический рисунок английского исходника, PDF p.5

Технический рисунок английского исходника, PDF p.5.

Библиотека 3A подключается к библиотеке ISP посредством регистрации. Библиотека 3A RK уже зарегистрирована неявно; явная регистрация пользователем не требуется.

После регистрации библиотеки 3A библиотека ISP получает статистику 3A от драйвера, вызывает интерфейс библиотеки 3A для вычисления новых параметров, затем передаёт их драйверу.

1.2 Организация файлов

Организация файлов показана ниже:

Технический рисунок английского исходника, PDF p.6

Технический рисунок английского исходника, PDF p.6.

Прошивка ISP разделена на прикладной уровень librkaiq.so и уровень драйверов: драйвер ISP и драйверы периферии Sensor, VCM и Flashlight.

librkaiq.so содержит библиотеки алгоритмов 3A, HDR и другие. Они существуют как статические библиотеки и в итоге связываются в librkaiq.so. Кроме библиотек 3A librkaiq_ae/awb/af.a, исходники которых не предоставляются, исходный код остальных базовых библиотек открыт.

Для всех поддерживаемых платформой модулей допускаются пользовательские алгоритмы. Однако обычно, кроме требующей настройки библиотеки 3A, остальные базовые библиотеки можно оставить стандартными, предоставленными RK.

1.3 Режимы разработки

Поддерживаются следующие три режима разработки:

Для 3A используется библиотека RK. В этом случае доступны API библиотеки 3A RK: 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 AE, затем пользовательская AE; её результаты заменяют результаты RK AE. Это упрощает разработку: пользовательской библиотеке не требуется выдавать все результаты, необходимые AIQ, часть может предоставлять библиотека RK AE.

1.4 Программные процессы

1.4.1 Основной процесс

Алгоритм 3A RK неявно зарегистрирован внутри AIQ и не требует явной регистрации пользователем. Ниже приведён псевдокод регистрации собственного алгоритма 3A на примере 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

Технический рисунок английского исходника, PDF p.9.

Поток получения статистики: непрерывно получает статистику 3A от драйвера ISP и передаёт её потоку вычислений 3A.

Поток вычислений 3A: после получения статистики вызывает алгоритмы модулей (включая обратные вызовы сторонних алгоритмов), вычисляет новые параметры и передаёт их потоку настройки параметров ISP и потоку SOF.

Поток настройки параметров 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 значения регистров I2C задаются через exp_i2c_params; при false используются регистровые параметры формата RK из linear_exp или hdr_exp.
frame_length_lines   Значение VTS сенсора, связанное с настройкой частоты кадров.
is_longfrm_mode   Бит режима длинного кадра: true — включён, false — выключен; действует только в HDR.
Iris PIris DCIris Параметры диафрагмы, включая P-Iris и DC-Iris.
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 пользователь не задаёт: они преобразуются внутри из фактической экспозиции; bValid в exp_i2c_params должен быть 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.

Для успешного переноса рекомендуется ознакомиться со следующим:

(1) Следующие материалы Rockchip_Color_Optimization_Guide:

(a) Раздел «2 AWB/2.1 Описание функции» и схема AWB.

(b) Схема обнаружения белых точек AWB в разделе «2 AWB/2.2 Ключевые параметры/аппаратное обнаружение белых точек».

(2) Раздел «Статистика/Типы данных/rk_aiq_isp_awb_stats2_v3x_t» документа Rockchip_Development_Guide_ISP30.

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 Ошибка, см. таблицу кодов ошибок

【Примечание】

Вызывается после завершения регистрации собственного AWB через rk_aiq_uapi_customAWB_register.

【Требования】

Заголовочный файл: 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 Ошибка, см. таблицу кодов ошибок

【Примечание】

Вызывается после завершения регистрации собственного AWB через rk_aiq_uapi_customAWB_register.

【Требования】

Заголовочный файл: 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->next (камера 1), pstAwbResult->next->next (камера 2) и далее. pstAwbResult соответствует камере 0.
pfn_awb_exit Освобождение выделенной памяти и других ресурсов; вызывается из AwbDemoDestroyCtx.

【Примечание】

Пользователь должен реализовать указанные обратные вызовы в собственной библиотеке AWB.

Для реализации pfn_awb_run можно использовать псевдокод функции custom_awb_run в third_party_awb_algo.cpp.

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 Действует только для многокамерного кругового обзора; указывает на аппаратную статистику баланса белого следующей камеры.

【Примечание】

Подробности полей см. в определении структуры rk_aiq_isp_awb_stats2_v3x_t раздела «Статистика/Типы данных» документа Rockchip_Development_Guide_ISP30.

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 Усиление каналов R, GR, GB, B, рассчитанное собственным AWB; по умолчанию {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 Как awb_gain_algo в rk_aiq_customeAwb_results_s.
awbHwConfig Как одноимённое поле структуры awbHwConfig в rk_aiq_customeAwb_results_s.
next В исходнике указано «Useless» и дана ссылка на смысл поля next (написано anext) в rk_aiq_customeAwb_results_s; формулировка неоднозначна.
2.2.2.3.3 rk_aiq_wb_gain_t

Определение rk_aiq_wb_gain_t см. в разделе «AWB/API уровня функций/Типы данных» документа Rockchip_Development_Guide_ISP32 (исходник ссылается именно на 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 Обход LSC для статистики AWB: 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) Схема обнаружения белых точек AWB в разделе «2 AWB/2.2 Ключевые параметры/аппаратное обнаружение белых точек».

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 Как windowSet в rk_aiq_customAwb_hw_cfg_t.
multiwindow_en Как multiwindow_en в rk_aiq_customAwb_hw_cfg_t.
multiwindow Как multiwindow в rk_aiq_customAwb_hw_cfg_t.
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

【Описание】Определяет границы четырёхугольной области белых точек в UV для собственного AWB.

Технический рисунок английского исходника, PDF p.30

Технический рисунок английского исходника, 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 Координаты U замкнутой области UV, например [u0,u1,u2,u3,u0]; диапазон [0x0, 0x1ff], 1 дробный разряд.
pv_region Координаты V замкнутой области UV, например [v0,v1,v2,v3,v0]; диапазон [0x0, 0x1ff], 1 дробный разряд.
slope_inv Обратные наклоны четырёх сторон области UV, до 10 дробных разрядов.

【Примечание】

Параметры получаются инструментом калибровки и переводятся в фиксированную точку либо преобразуются согласно разделу «AWB/Обнаружение белых точек UV» документа Rockchip_Color_Optimization_Guide_ISP30.

Параметры зависят от модуля; при uvDetectionEnable=ture (написание исходника) они должны быть заданы корректно.

2.2.2.3.7 rk_aiq_rgb2xy_para_t

【Описание】Определяет параметры преобразования RGB в XY для собственного AWB.

【Определение】

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 дробных разрядов.

【Примечание】

Параметры получаются инструментом калибровки и переводятся в фиксированную точку согласно разделу «AWB/RGB2XY» документа Rockchip_Color_Optimization_Guide_ISP30.

Параметры зависят от модуля; при xyDetectionEnable=ture (написание исходника) они должны быть заданы корректно.

2.2.2.3.8 rk_aiq_awb_xy_range_para_t

【Описание】Определяет границы четырёхугольной области белых точек в XY для собственного AWB.

Технический рисунок английского исходника, PDF p.31

Технический рисунок английского исходника, 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 дробных разрядов.

【Примечания】

Параметры получаются инструментом калибровки и переводятся в фиксированную точку согласно разделу «AWB/Обнаружение белых точек XY» документа Rockchip_Color_Optimization_Guide_ISP30.

Параметры зависят от модуля; при xyDetectionEnable=ture (написание исходника) они должны быть заданы корректно.

2.2.2.3.9 rk_aiq_awb_rt3dyuv_range_para_t

【Описание】Определяет ограничения белых точек в YUV для собственного AWB.

【Определение】

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 ломаной u-th; диапазон [0x0, 0xff]; разность соседних u должна быть степенью 2.
thcure_th Компонента th ломаной u-th; диапазон [0x0, 0xfff], 4 дробных разряда; ломаная должна монотонно возрастать.
lineP1 Координаты p1 в YUV для вычисления теоретической белой точки (y’,u0,v0); диапазон каждой компоненты [0x0, 0xfff], 4 дробных разряда.
vP1P2 Вектор от p1 к p2 в YUV для вычисления теоретической белой точки (y’,u0,v0); диапазон каждой компоненты [-2^12, 2^12-1], 4 дробных разряда.
disP1P2 Евклидово расстояние p1–p2 равно 2^disP1P2; диапазон [0,5].

【Примечания】

Технический рисунок английского исходника, PDF p.33

Технический рисунок английского исходника, PDF p.33.

Параметры получаются инструментом калибровки и переводятся в фиксированную точку либо преобразуются согласно разделу «AWB/Обнаружение белых точек YUV» документа Rockchip_Color_Optimization_Guide_ISP30.

Параметры зависят от модуля; при threeDyuvEnable=ture (написание исходника) и threeDyuvIllu, отличном от 7, они должны быть заданы корректно.

2.2.2.3.10 rk_aiq_awb_exc_range_v201_t

【Описание】Определяет границы исключаемых/дополнительных областей белых точек в UV или XY для собственного AWB.

【Определение】

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 соответственно.
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 окон, но measureEnable=true допустимо только для первых 4.

2.3 Разработка собственного AF

Если библиотека RK AF не используется, пользователь может разработать AF по статистике 3A для управления увеличением, фокусировкой и другими функциями.

При реализации AF:

1. Сначала вызовите rk_aiq_user_api2_af_SetAttrib для настройки статистики AF.

2. Получите статистику 3A через rk_aiq_uapi_sysctl_get3AStatsBlk. Это блокирующий API, возвращающий управление сразу после появления новых данных.

3. Собственный AF выполняет расчёты по статистике 3A и управляет движением моторов увеличения и фокусировки.

4. В конце вызовите rk_aiq_uapi_sysctl_release3AStatsRef для освобождения полученной статистики 3A.

Общий процесс показан на схеме ниже.

Технический рисунок английского исходника, PDF p.35

Технический рисунок английского исходника, PDF p.35.

2.3.1 Модуль статистики AF

Технический рисунок английского исходника, PDF p.35

Технический рисунок английского исходника, PDF p.35.

При HDR-входе Sensor модуль AF может использовать изображение короткой, средней или длинной экспозиции HDR либо данные объединённого HDR-изображения для статистики.

При обычном входе Sensor модуль AF может использовать входное изображение Sensor либо изображение после debayer для статистики.

Поддерживаются два окна: главное A и независимое B.

Главное окно A содержит 15*15 подокон и четыре настраиваемых фильтра V1/V2/H1/H2; выдаются четыре группы FV, значения яркости и статистика светлых участков.

Независимое окно B вычисляет FV фиксированным оператором и выдаёт одно значение FV, яркость и статистику светлых участков.

2.3.2 Настройка окон статистики AF

Главное окно A и независимое B имеют прямоугольную форму; задаются координаты левого верхнего угла, ширина и высота.

Технический рисунок английского исходника, PDF p.36

Технический рисунок английского исходника, PDF p.36.

2.3.3 Gamma

Gamma преобразует входной RAW Sensor в представление естественной яркости, воспринимаемой глазом. Координата 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

Технический рисунок английского исходника, PDF p.36.

2.3.4 Фильтры фокусировки

Главное окно A предоставляет четыре настраиваемых фильтра V1/V2/H1/H2; независимое B использует фиксированные операторы.

Полосы частот V1/V2/H1/H2 можно настраивать; значения регистров генерируются инструментом проектирования фильтров.

Технический рисунок английского исходника, PDF p.37

Технический рисунок английского исходника, PDF p.37.

2.3.5 Яркость/светлые участки

Главное окно A предоставляет статистику яркости и счётчик светлых участков.

FV чувствительно к источнику света. При расфокусировке расширение ореола усиливает низкочастотную составляющую: изображение становится нерезким, но FV увеличивается.

Обычно используется счётчик светлых участков: при расфокусировке ореол расширяется и число светлых точек возрастает; при резком изображении оно минимально.

2.3.6 Усиление в зависимости от яркости (LDG)

Влияние источника света также можно уменьшить функцией LDG: она ослабляет FV по яркости пикселя, снижая вклад слишком светлых и слишком тёмных точек.

Технический рисунок английского исходника, PDF p.38

Технический рисунок английского исходника, PDF p.38.

При яркости в [ldg_xl, ldg_xh] выходное усиление равно 1, FV не ослабляется.

При яркости в [0, ldg_xl] усиление уменьшается с наклоном ldg_kl, но не ниже ldg_yl.

gain = 256 - ldg_kl*(ldg_xl - x)/256; gain = max(gain, ldg_yl);

При яркости в [ldg_xh, 255] усиление уменьшается с наклоном ldg_kh, но не ниже ldg_yh.

gain = 256 - ldg_kh*(x-ldg_xh)/256; gain = max(gain, ldg_yh);

Горизонтальные H1/H2 используют общую кривую LDG; вертикальные V1/V2 — другую общую кривую.

2.3.7 Порог FV

При вычислении FV значения ниже порога FV не учитываются в итоговом выходе, что уменьшает влияние шума.

Технический рисунок английского исходника, PDF p.39

Технический рисунок английского исходника, PDF p.39.

Порог FV применяется к результату фильтрации после обработки LDG.

2.3.8 Расчёт FV

FV поддерживает режим абсолютного значения и квадратный режим. Возведение FV в квадрат увеличивает относительный вклад резких областей.

Для предотвращения переполнения итогового FV задаются четыре правых сдвига v1/v2/h1/h2 главного окна и два сдвига fv/luma независимого окна.

2.3.9 Выход FV

Главное окно A выдаёт данные FV v1/v2/h1/h2 для 1515 и luma/highlight для 1515 (так напечатано в исходнике; предыдущий текст и рисунок показывают сетку 15×15).

Распределение выхода главного окна A по изображению показано ниже.

Выход независимого окна B содержит одно значение FV, одно значение яркости и статистику светлых участков.

Технический рисунок английского исходника, PDF p.40

Технический рисунок английского исходника, 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_algo_meas_v30_t в параметре rk_aiq_af_attrib_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=1 значение viir_en должно быть 1.
v1_fv_outmode Режим выхода FV канала V1: 0 — квадрат, 1 — абсолютное значение.
v2_fv_outmode Режим выхода FV канала V2: 0 — квадрат, 1 — абсолютное значение.
h1_fv_outmode Режим выхода FV канала H1: 0 — квадрат, 1 — абсолютное значение.
h2_fv_outmode Режим выхода FV канала H2: 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 Значения y таблицы Gamma: 0–1023. Координата x от 0 до 1023, сегменты: 16 16 16 16 32 32 32 32 64 64 64 128 128 128 128 128.
thres Если рассчитанное FV ниже порога, оно обнуляется для уменьшения шума; диапазон 0–0xFFFF.
shift_sum_a Сейчас недоступно; можно фиксировать на 0.
shift_sum_b Число бит правого сдвига FV окна WinB для предотвращения переполнения; диапазон 0–7. Опечатка «shit bit» передана как сдвиг.
shift_y_a Сейчас недоступно; можно фиксировать на 0.
shift_y_b Число бит правого сдвига luma окна WinB для предотвращения переполнения; диапазон 0–7.
v1_iir_coe[9] Коэффициенты 3X3 IIR канала V1, задаваемые по выходу инструмента генерации коэффициентов фильтров AF.
v1_fir_coe[3] Коэффициенты 1x3 FIR канала V1, задаваемые по выходу инструмента генерации коэффициентов фильтров AF.
v2_iir_coe[3] Коэффициенты 1x3 IIR канала V2, задаваемые по выходу инструмента генерации коэффициентов фильтров AF.
v2_fir_coe[3] Коэффициенты 1x3 FIR канала V2, задаваемые по выходу инструмента генерации коэффициентов фильтров AF.
h1_iir1_coe[6] Коэффициенты 1X6 IIR1 канала H1, задаваемые по выходу инструмента генерации коэффициентов фильтров AF.
h2_iir1_coe[6] Коэффициенты 1X6 IIR1 канала H2, задаваемые по выходу инструмента генерации коэффициентов фильтров AF.
h1_iir2_coe[6] Коэффициенты 1X6 IIR2 канала H1, задаваемые по выходу инструмента генерации коэффициентов фильтров AF.
h2_iir2_coe[6] Коэффициенты 1X6 IIR2 канала H2, задаваемые по выходу инструмента генерации коэффициентов фильтров AF.
h_ldg_lumth[2] Коэффициент порога яркости LDG каналов H1/H2; 0 — тёмная область слева, 1 — светлая справа; диапазон 0~255.
h_ldg_gain[2] Коэффициент минимального усиления LDG каналов H1/H2; 0 — тёмная область слева, 1 — светлая справа; диапазон 0~255.
h_ldg_gslp[2] Коэффициент наклона LDG каналов H1/H2; 0 — тёмная область слева, 1 — светлая справа; диапазон 0~65535.
v_ldg_lumth[2] Коэффициент порога яркости LDG каналов V1/V2; 0 — тёмная область слева, 1 — светлая справа; диапазон 0~255.
v_ldg_gain[2] Коэффициент минимального усиления LDG каналов V1/V2; 0 — тёмная область слева, 1 — светлая справа; диапазон 0~255.
v_ldg_gslp[2] Коэффициент минимального усиления LDG каналов V1/V2; 0 — тёмная область слева, 1 — светлая справа; диапазон 0~255.
v_fv_thresh Порог статистики AF каналов V1/V2; FV ниже порога обнуляется для уменьшения шума; диапазон 0–0x0FFF.
h_fv_thresh Порог статистики AF каналов H1/H2; FV ниже порога обнуляется для уменьшения шума; диапазон 0–0x0FFF.
v1_fv_shift Число бит правого сдвига FV канала V1 для предотвращения переполнения; диапазон 0–7.
v2_fv_shift Число бит правого сдвига FV канала V2 для предотвращения переполнения; диапазон 0–7.
h1_fv_shift Число бит правого сдвига FV канала H1 для предотвращения переполнения; диапазон 0–7.
h2_fv_shift Число бит правого сдвига FV канала H2 для предотвращения переполнения; диапазон 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.

Другие статьи по теме → · Учебные маршруты →