01

flicker(banding)现象

出现flicker(banding)问题时,从视频上看会发现有规律的明暗相间的条纹,这种现象也叫做牛顿环。如下图所示。

02

产生flicker(banding)问题的原因

Sensor在日光灯作为光源下获取图像数据时会产生flicker,其根本原因是照在不同pixel上光能量不同产生的,所接受的光能量的不同也就是图像的亮度的不同。

电源的频率有两种标准:50Hz(大陆)和60Hz(台湾、日本)的正弦波形,当然能量是没有方向性的,因此对应的能量是一个频率为100Hz和120Hz的波形,如下图所示:

由于能量在时间方向上的波形,照在sensor上就使每一个pixel产生在时间方向上的相应波形,由于CMOS sensor的曝光方式是一行一行的方式进行的,任何一个pixel的曝光时间是一样的,也就是同一行上的每个pixel的曝光开始点和曝光的时间都是一模一样的,所以同一行的所有点所接受到的能量是一样的,而在不同行之间虽然曝光时间都是一样的,但是曝光的开始点是不同的,所以不同行之间所接受到的能量是不一定相同的。由此产生sensor出来的图像可能在图像高度方向上会有相应的波形,如下图:

为了使不同行之间所接受的能量相同,就必须找一个特定的条件,使得每一行即使曝光开始点不同,但是所接受的光能量是相同的,这样就避开了flicker,这个特定的条件就是曝光时间必须是光能量频率Hz的整数倍时间。

计算原理为:

50HZ交流电能量周期:T = 1/(50*2)

sensor曝光一帧所用的时间 T_frame = 1/FPS;

sensor曝光一行所用的时间 T_row = T_frame/Line_max  (Line_max = Exp_max);

为了避免flicker,必须满足每一行获取的能量是交流电能量周期的整数倍,否则会因为获取的能量不一致,导致水波纹现象的产生。即:

T_row * Step = n * T

故:Step = (n * T)/T_row = n*(FPS *Exp_max) /100; (n取正整数)

这个是计算Banding Flicker的依据,具体计算方法如下:

50Hz

Banding Value = Total lines * fps / 100

60Hz

Banding Value = Total lines * fps / 120

03

如何规避flicker(banding)问题 --- sensor的修改

相信在很多地方都可以了解到,只要曝光时间是光能量周期(100Hz)的整数倍,即可规避工频干扰导致的闪烁问题。

但是当曝光时间低于光能量周期(10ms)时,有应该如何规避这个问题呢?

假设帧率为10fps,那么设置一帧的时间间隔刚好为100ms,那么,每帧开始曝光开始时间都会是一致的,在相同的曝光时间,得到的光能量也就一致了。(由于有些提示是100ms的帧间隔,但是由于误差问题,不是准确的100ms,误差累计导致闪烁)。

通过设置帧率,使得每一帧之间的间隔为10ms的整数倍,每帧对应的每一行曝光得到的光能量一样(从能量波形来看,要使得每一行曝光所对应的能量一样,只需要确保对应的每一行时间内对能量波形积分,所得到的面积一样即可满足),从视频上来看,当曝光时间低于光能量周期(10ms)时,明暗相间的条纹位置固定不动,视频上看来不会有明显的频闪现象。

以50Hz为例说明,实现这个有两种办法:
  1、设置曝光控制,强制为10ms整数倍变化,但是这样会浪费一部分曝光时间,导致曝光无法用满,在室内自然就会损失性能。

  2、修改桢率,使每桢图像分到的时间是10ms的整数倍,则可以用满每桢曝光时间在,室内效果更好。修改桢率可以插入Dummy Line或者Dummy Pixel。这需要一点点计算,具体计算需要看sensor输出Timing。
  例如把桢率设置为7.14fps,则每桢曝光时间是140ms。如果是15fps,则每桢曝光时间是66.66ms,如果强制曝光为10ms整数倍,最大即60ms,则有6.66ms无法参与曝光,损失性能。
  具体调整桢率方法得和sensor的FAE沟通,每个sensor都可能不一样,不能一概而论。调整桢率还有个原则要注意,预览一般不能低于 10fps,再低就很卡,常用14.28fps和12.5fps;抓拍不能低于5fps,否则用手就很难拍出清晰的照片,常用7.14fps。桢率是一个权 衡折中的选择

高了曝光时间不够,暗光效果太差,低了没法拍照,容易虚。

04

如何规避flicker(banding)问题 --- app 的修改

banding现象,也叫做牛顿环,那防止这种现象,也就叫做防牛顿环,在Android 里面叫做anti banding。

针对banding问题,google也为我们提供了对应的接口,CONTROL_AE_ANTIBANDING_MODE, 这个参数,应用上一般要求设置为AUTO。

05

如何规避flicker(banding)问题 --- hal 的修改

android/hardware/qcom/camera/QCamera2/HAL3/QCamera3HWI.cpp

从下面代码可以看到,property属性persist.vendor.camea.set.afd 控制的就是anti banding的值,如果上层设置下来是AUTO模式,那么代码里面默认值是5(AUTO_60HZ),实际上在我们国内,一般的灯光闪烁频率是50hz,所以如果是国内的产品,这个默认值我们需要修改为4(AUTO_50HZ)。

推荐阅读:

Android Camera 测光梳理

Android Camera2 对焦梳理

哪些坑爹的Android CTS测试

高通Camera数字成像系统简介

一篇文章带你了解Android 最新Camera框架

这可能是介绍Android UvcCamera最详细的文章了

参考资料:

1. [关于cmos工频干扰导致的闪烁问题]

https://blog.csdn.net/weixin_41944449/article/details/94296676

2. [camera工频干扰问题]

https://blog.csdn.net/jzwjzw19900922/article/details/108508416

3.[Camera Sensor 的工频闪烁]

https://blog.csdn.net/lz0499

欢迎关注我的个人博客:http://www.xiaochibiji.com

Camera问题解锁:Sensor Flicker(banding)相关推荐

  1. 关于 Sensor flicker/banding现象的解释

    目录 1.基本概念 2.30fps, 1帧内banding过程演示 3.30fps, 帧与帧之间banding过程演示 4.25fps, 帧与帧之间banding过程演示 5.总结 1.基本概念 fl ...

  2. Camera和Image sensor技术基础笔记(5) -- HDR相关技术

    动态范围(Dynamic Range) 动态范围最早是信号系统的概念,一种信号系统的动态范围定义为:最大的信号不失真的电平和噪声电平的差,在实际场景中,多用分贝(dB)为单位来衡量一个信号系统的动态范 ...

  3. 棋盘格检测--Automatic camera and range sensor calibration using a single shot

    Automatic camera and range sensor calibration using a single shot Robotics and Automation (ICRA), IE ...

  4. Sensor Flicker (Sensor banding现象)

    Sensor在日光灯作为光源下获取图像数据时会产生flicker,其根本原因是照在不同pixel上光能量不同产生的,所接受的光能量的不同也就是图像的亮度的不同.电源的频率有两种标准:50Hz(大陆)和 ...

  5. Sensor Flicker

    Sensor在日光灯作为光源下获取图像数据时会产生flicker,其根本原因是照在不同pixel上光能量不同产生的,所接受的光能量的不同也就是图像的亮度的不同.电源的频率有两种标准:50Hz(大陆)和 ...

  6. Camera 之水波纹和banding现象

    预览画面中出现了一条明一条暗相间隔的竖条纹,这种现象叫做"水波纹",并对原因进行了讲解,现记录如下. 其实这些"水波纹"产生是因为手机的快门频率与灯光的频率不匹 ...

  7. Camera和Image sensor技术基础笔记(1) -- 光和CCD/CMOS sensor基础知识

    光 首先来看看可见光在电磁波谱里的位置,光在电磁波谱里的范围是非常窄的 一般人的眼睛能感知的电磁波的频率在380~750THz,波长在780-400nm之间,但有些人能够感知到频率大约在340~790 ...

  8. Camera和Image sensor技术基础笔记(4) -- 白平衡White Balance

    白平衡到底是什么 百度搜索"白平衡",我们会发现有一句话很常见,大概意思是:"白平衡是一种功能,它让图片中的白色看起来就是白色".啊,什么,白色为啥看起来不是白 ...

  9. MTK平台安卓Q 10.0 camera驱动移植——sensor

    平台MTK676X 安卓:Q/10.0 1. 添加驱动程序文件 将模组厂商提供的驱动程序及调试参数文件拷贝到以下目录.厂商可能会自行客制化,但都是kernel和vendor两处下面,不一定和下面列出的 ...

最新文章

  1. tomcat屏蔽ip
  2. memset 还可以这样用
  3. OpenCV尺寸调整函数resize
  4. ASP.NET Core MVC 2.1 顶级参数验证
  5. 判断整除(信息学奥赛一本通-T1195)
  6. XML文件的读取(XmlParserDemo)
  7. spring+Quartz定时任务
  8. 个人计算机网刻系统,全自动网刻后修改计算机配置信息(网管轻松方便)
  9. opencv 头文件 包含 include 的问题
  10. jar包的概念及作用
  11. C、C++中的单引号和双引号
  12. IntentService使用姿势
  13. 你所想了解的方正快速开发平台
  14. html风琴图片展示,炫酷的jQuery手风琴图片和菜单插件及源码
  15. 中望3D 2021 自动缩放基准面大小
  16. 【数据异常校验】拉依达准则( PauTa Criterion 或 3σ准则) 处理异常数据
  17. 虚拟机:虚拟机三种网络连接
  18. python判断纯英文和纯数字
  19. upload-labs安装及攻略
  20. asp 和 html 婚鞋,几招教会你搭配出完美婚鞋

热门文章

  1. ios vs android设计
  2. latex公式文字划掉的效果
  3. mx250 计算能力_mx250显卡性能怎么样,mx250显卡性能相当于GTX多少
  4. 读吴军一万小时定律误区有感
  5. 人工智能的落地及未来的发展
  6. (电力开发)376.1 主站通信协议基本结构解析
  7. 整理Ubuntu 14.04 Indicators 以及好的软件
  8. 哈雷监控设备的操作及升级NSG9k6G
  9. 四川职业技术学院linux,2019年四川交通职业技术学院单招中职(信息技术一类)专业技能测试大纲...
  10. java深拷贝的三种方式