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的帧率肯定也是存在误差的。
另外确认下自己计算帧率的方式是否存在问题。
我就是按上文中的方式去计算的,里面公式列的是对的,但要注意的地方是不该把数值带进去,直接去计算结果。这会造成计算误差,应该是要将式子化简到最简为止后,再带入数值去计算。
如下是我参照上图中的公式计算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 举报,一经查实,本站将立刻删除。