关于flicker问题的调试总结

1、问题背景

最近在调试ov的一款sensor,客户反馈在他们那边的场景下会有明显的flicker现象,

确认了现象是工频干扰导致,后面在处理此问题的过程中遇到了不少问题,这里总结整理一下。

2、问题分析

怎么处理工频干扰导致的flicker问题呢?

一般有两种方式,一种调整曝光时间到工频的整数倍,这里工频是50Hz,那也就是调整曝光时间到10ms的整数倍。

另外一种就是通过将帧率调整到25fps(或者其他帧间隔时间是10ms整数倍的帧率),保证帧与帧之间的亮度变化相同,规避在视频模式下不停跳动的flicker现象。

关于flicker产生的具体原因请查看这篇内容:关于 Sensor flicker/banding 现象的解释

在调试过程当中,有遇到如下几个问题;

1)开启auto anti-flicker功能后还是存在flicker

2)强制将曝光时间调整至10ms的整数倍,还是存在flicker

3)将帧率调整至25fps,还是存在flicker

1)开启auto anti-flicker(自动抗闪烁)功能后还是存在flicker

这个是开始自测就发现了,auto anti-flicker是基于算法可以检测当前光源是否是带工频的光源,是50Hz还是60Hz工频,以 sensor输出帧率30fps为例;

当检测到是不带工频的光源时,sensor的曝光时间是 1-33ms范围内的任意时间(最小值要具体看sensor的最小曝光时间限制,这里以1举例),此时没有flicker;

当检测到是50Hz的工频光源时, 会自动补偿曝光时间到10ms的整数倍,避免闪烁;

当检测到是60Hz的工频光源时,会自动补偿曝光时间到8.333ms的整理倍,避免闪烁;

当时问题其实是开启了auto anti-flicker功能,但实际检测不到50Hz的工频,如何能更快、更准确的检测到对应光源的工频;

这个具体要看算法的性能和判断逻辑,以及对于开放的一些阈值参数的调试的是否有问题;

我当时是复用的另一套sensor的参数,调试anti-flicker参数后可以检测到50Hz工频了,因为硬件的差异(包括sensor、光圈、镜头)是需要重新调整参数适配的。

2)强制将曝光时间调整至10ms的整数倍,还是存在flicker

一般除了auto anti-flicker模式,另外也会有50Hz、60Hz的模式,就是直接选择调整曝光时间到10ms的整数倍还是8.333ms的整数倍。

以 sensor输出帧率30fps为例,不同场景下,曝光时间支持 ≤10ms、20ms、30ms 可调节;

客户那边是国内50Hz的光源场景,但为什么开启50Hz模式强制将曝光时间调整到10ms的整数倍都无法消除flikcer呢?

后续让客户在有flicker的场景下,保存了下串口里的打印,里面包含有sensor驱动中加的曝光行的log,通过曝光行计算得出曝光时间:

相对曝光时间:0x201 (513)行

一行时间:hts/plck = 0x42e/(0x42e * 3140 * 30fps)

绝对曝光时间:513 * (hts/plck) = 5.446ms

注:另外也可以不用那么麻烦,大部分平台的tuning工具可以直接读出曝光时间,可以直接连上tuning工具读取,这里是客户操作没成功,读取不到参数。

如上曝光时间是小于10ms的,所以50Hz及anti-flicker模式都是不生效的。因为对于曝光时间小于10ms的场景,

类似室外高亮场景,强制调整曝光时间到10ms,图像肯定就过曝严重,所以为了避免影响正常场景的使用,anti-flicker算法无法消除曝光时间小于10ms场景下的flicker。

此时可以通过修改帧率为25fps,来规避50Hz工频下的flicker,修改帧率为30fps,来规避在60Hz工频下的flicker。

3)将帧率调整至25fps,还是存在flicker

后面通过修改vts,将帧率调整到25fps,但客户反馈还是存在类似水波纹的flicker现象,那这时就要怀疑此时的配置是不是真的就是25fps了;

首先要确认sensor厂给的setting 帧率是否是真实的30fps, 还是说是30.1,30.2类似有比较大误差的帧率,那以此为准计算出的25fps的帧率肯定也是存在误差的。

另外确认下自己计算帧率的方式是否存在问题。

关于flicker问题的调试总结

我就是按上文中的方式去计算的,里面公式列的是对的,但要注意的地方是不该把数值带进去,直接去计算结果。这会造成计算误差,应该是要将式子化简到最简为止后,再带入数值去计算。

如下是我参照上图中的公式计算25fps存在误差的结果(setting中默认的 vts=3148,hts=1070):

pclk = frame_length ∗ line_length * fps = 3148 *1070 * 30 = 101050800;

line_time = line_length/pclk = 1070/101050800 = 0.011 ms;

frame_length = pclk /( line_length * fps))=pclk /(line_time * pclk * fps)= 1 / ( line_time * fps ) =1 /(0.000011 x 25) = 3636 ;

正确计算方式如下:

先求出一行时间 line_time:

= line_length/pclk

= line_length /(frame_length ∗ line_length * fps)

= 1/(frame_length ∗ fps)

不管25fps还是30fps,默认的pclk、line_length是不变的,则一行时间是不变的,得出如下公式:

1/(3148 ∗ 30) =1/(vts * 25);

vts = (3148*30)/ 25 = 3778 ;

如上两种计算过程都是一样的,都是以pclk、line_length不变的情况下去计算VTS的,从结果来看,VTS相差了141,所以肯定导致帧率会不满足25fps,无法规避flicker。

3、问题总结

1)在曝光时间大于10ms/8.333ms的场景下,可通过补偿曝光时间到10ms/8.333ms的整数倍去解决flicker的问题。

2)曝光时间小于10ms/8.333ms的场景下,通过修改帧率为25fps,来规避50Hz工频下的flicker,修改帧率为30fps,来规避在60Hz工频下的flicker。

3)修改sensor VTS调整帧率时,要注意避免计算误差;及确认默认的setting真实帧率是多少。

作者:木东,微信:mudong_771
来源:ISP Tuning

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论