T31快启图像效果优化

发布于:2022-10-29 ⋅ 阅读:(904) ⋅ 点赞:(0)

T31快启图像效果优化

liwen01 20220821

(一)基础方法及概念

参考文档

《Ingenic_Zeratul_T31_快起效果调试说明_20200927_CN》

(1)起始EV参数

IPC 每次启动都是冷启动,画面有一个暗变亮的过程,称作为AE收敛过程(自动曝光收敛过程)。

为了加快AE收敛的整个过程,可以设置一个起始EV值,也就是开始曝光参数,AE曝光从这个值开始收敛,可以缩短整个AE收敛的过程。

(2)起始EV值采集方法

实际是通过光敏ADC值与曝光参数EV值建立一个关系表,启动的时候,软件根据ADC值去查找对应的EV值进行曝光设置。

启动过程中存在一个问题:

💡刚上电启动的时候光敏ADC不稳定
ev值与adc表采集需要分两种方式:

  1. 应用层直接采集ADC与EV值的对应关系
  2. 在boot中采集ADC与程序启动后稳定的EV值对应的关系

根据官方的说明,君正系列,在T20系列,可以直接使用应用层软件直接采adc值与稳定的ev值

但是在T30,T31芯片上,因为启动的时候ADC其实还未稳定,所以只能是采集启动时boot的adc值,与内核打印中稳定的ev值相互对应,不然会出现不准确的现象

(3)EV值相关
  1. 光线越强的时候,稳定的EV值就越小,实际测试到的值为4(gc2093)
  2. 光线越弱的时候,稳定的EV值就越大,测试到的最大值为16万多(gc2093)
  3. 判断EV值是否有效果
    • 在某个场景(adc 值基本稳定)
    • 手动调整不同的EV值,看实际的图片效果
  4. 可以在全黑的场景中测试到最大的EV值(比如用黑胶布封住光敏和镜头)
  5. 可以在太阳直射的场景中测试到最小EV值
  6. 不同的sensor,ev值的最值会不一样,与ADC的对应关系也是不一样

(二)存在问题

(1)问题一:第一张图像不正常,后续图像有个收敛的过程
问题现象:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

上面第一张图像明显的过曝,第2张到第4张也是存在一个收敛的过程(由曝光不足到曝光正常)

问题原因:
  1. 出现这样的收敛过程,实际是不正常的,可能存在两个原因:

    • ev 表有设置成功,但是实际没有生效
    • ev 表采集的不是很准确,出现一个重新收敛的过程
  2. ISP 中丢的帧数不够

    • 每款sensor 丢的帧数有差异,需要实际调试
    • 如果丢帧数量多,会导致启动速度变慢
解决方案:
  1. 将boot的打印打开,同时将kernel的 isp 快启调试数据打开

    • 查看ev 值是否按boot查询到的ev值开始收敛
      • 如果是,则为原因二,用稳定的ev值重新调整看图像效果
      • 如果否,需排查为什么未生效
  2. 尝试不同帧数的丢,直到可以正常曝光为止


(2)问题二:快启没有缓存图片
问题现象:

实际快启的时候,发现图片没有缓存,对时间秒表进行拍照,发现拍360图片的时间比主码流的时间还早

问题原因:
  1. 因为使用的是gc2093 sensor,开启了WDR功能,使用riscv 后启动速度会非常慢,所以把riscv文件删除了
  2. 因为没有riscv,所以小核无法使用,无法快启缓存图片
解决方案
  1. 君正的说法:如果开启了WDR,就没法使用riscv,wdr 是IQ那边处理的,目前没办法处理。

注意事项

  1. 需要注意libz_gc2093.c中adc值的增长方向,IR,CUT切换等参数的配置要与实际板子相匹配
  2. 不同光照亮度下曝光值的采集,如果没有专业的调试显示屏,可以直接将设备放置在空旷的地方对着天空拍,采集24小时,那常用的亮度基本上就都有了。
  3. 君正并没有开放ISP相关的一些库,如果觉得库里面影响启动时间,可以尝试使用最新SDK中的库进行调试

附件

  • 代码
//tools/make_tag/sensor_start_ae_table/libz_gc2093.c
#include "libz_common.h"

int g_gpio_led_mode = LED_MODE_LOW_ON;
int g_gpio_led = GPIO_PB(31);
int g_gpio_ircut_mode = IRCUT_MODE_IGNORE;
int g_gpio_ircut_p = GPIO_PB(18);
int g_gpio_ircut_n = GPIO_PB(17);
int g_gpio_ircut_edge = 0;
int g_adc_value = 3000;
int g_adc_direction = ADC_DIRECTION_1;
int g_adc_reference = -1;
int g_gpio_white_led = -1;
int g_gpio_white_led_status = -1;

struct vol_start_value_table table_day[] = {
	{302,4},
	{319,5},
	{341,6},
	{360,8},
	{380,9},
	{402,10},
	{499,13},
	{602,14},
	{718,14},
	{802,15},
	{854,17},
	{908,24},
	{1002,96},
	{1050,242},
	{1102,706},
	{1176,2616},
	{1205,3553},
	{1305,6799},
	{1405,8325},
	{1517,10479},
	{1604,12626},
	{1704,14484},
	{1840,19098},
	{1975,24062},
	{2004,24742},
	{2030,26612},
	{2056,21423},
	{2097,24041},
	{2110,29908},
	{2178,36098},
	{2294,36675},
	{2774,53740},
	{2813,54801},
	{2819,57503},
	{2835,57165},
	{2864,58467},
	{2945,61555},
	{3009,131359},
	{3080,142020},
	{3087,145011},
	{3093,142503},
	{3129,160014},
	{3132,161172},
	{3142,159098},
	{3296,161220},
};