Camera問(wèn)題解鎖:Sensor Flicker(banding)

01
flicker(banding)現(xiàn)象
出現(xiàn)flicker(banding)問(wèn)題時(shí),從視頻上看會(huì)發(fā)現(xiàn)有規(guī)律的明暗相間的條紋,這種現(xiàn)象也叫做牛頓環(huán)。如下圖所示。

02
產(chǎn)生flicker(banding)問(wèn)題的原因
Sensor在日光燈作為光源下獲取圖像數(shù)據(jù)時(shí)會(huì)產(chǎn)生flicker,其根本原因是照在不同pixel上光能量不同產(chǎn)生的,所接受的光能量的不同也就是圖像的亮度的不同。
電源的頻率有兩種標(biāo)準(zhǔn):50Hz(大陸)和60Hz(臺(tái)灣、日本)的正弦波形,當(dāng)然能量是沒(méi)有方向性的,因此對(duì)應(yīng)的能量是一個(gè)頻率為100Hz和120Hz的波形,如下圖所示:

由于能量在時(shí)間方向上的波形,照在sensor上就使每一個(gè)pixel產(chǎn)生在時(shí)間方向上的相應(yīng)波形,由于CMOS sensor的曝光方式是一行一行的方式進(jìn)行的,任何一個(gè)pixel的曝光時(shí)間是一樣的,也就是同一行上的每個(gè)pixel的曝光開始點(diǎn)和曝光的時(shí)間都是一模一樣的,所以同一行的所有點(diǎn)所接受到的能量是一樣的,而在不同行之間雖然曝光時(shí)間都是一樣的,但是曝光的開始點(diǎn)是不同的,所以不同行之間所接受到的能量是不一定相同的。由此產(chǎn)生sensor出來(lái)的圖像可能在圖像高度方向上會(huì)有相應(yīng)的波形,如下圖:
為了使不同行之間所接受的能量相同,就必須找一個(gè)特定的條件,使得每一行即使曝光開始點(diǎn)不同,但是所接受的光能量是相同的,這樣就避開了flicker,這個(gè)特定的條件就是曝光時(shí)間必須是光能量頻率Hz的整數(shù)倍時(shí)間。
計(jì)算原理為:
50HZ交流電能量周期:T = 1/(50*2)
sensor曝光一幀所用的時(shí)間 T_frame = 1/FPS;
sensor曝光一行所用的時(shí)間 T_row = T_frame/Line_max? (Line_max = Exp_max);
為了避免flicker,必須滿足每一行獲取的能量是交流電能量周期的整數(shù)倍,否則會(huì)因?yàn)楂@取的能量不一致,導(dǎo)致水波紋現(xiàn)象的產(chǎn)生。即:
T_row * Step = n * T
故:Step = (n * T)/T_row = n*(FPS *Exp_max) /100; (n取正整數(shù))
這個(gè)是計(jì)算Banding Flicker的依據(jù),具體計(jì)算方法如下:
50Hz
Banding Value = Total lines * fps / 100
60Hz
Banding Value = Total lines * fps / 120
03
如何規(guī)避flicker(banding)問(wèn)題 --- sensor的修改
相信在很多地方都可以了解到,只要曝光時(shí)間是光能量周期(100Hz)的整數(shù)倍,即可規(guī)避工頻干擾導(dǎo)致的閃爍問(wèn)題。
但是當(dāng)曝光時(shí)間低于光能量周期(10ms)時(shí),有應(yīng)該如何規(guī)避這個(gè)問(wèn)題呢?
假設(shè)幀率為10fps,那么設(shè)置一幀的時(shí)間間隔剛好為100ms,那么,每幀開始曝光開始時(shí)間都會(huì)是一致的,在相同的曝光時(shí)間,得到的光能量也就一致了。(由于有些提示是100ms的幀間隔,但是由于誤差問(wèn)題,不是準(zhǔn)確的100ms,誤差累計(jì)導(dǎo)致閃爍)。
通過(guò)設(shè)置幀率,使得每一幀之間的間隔為10ms的整數(shù)倍,每幀對(duì)應(yīng)的每一行曝光得到的光能量一樣(從能量波形來(lái)看,要使得每一行曝光所對(duì)應(yīng)的能量一樣,只需要確保對(duì)應(yīng)的每一行時(shí)間內(nèi)對(duì)能量波形積分,所得到的面積一樣即可滿足),從視頻上來(lái)看,當(dāng)曝光時(shí)間低于光能量周期(10ms)時(shí),明暗相間的條紋位置固定不動(dòng),視頻上看來(lái)不會(huì)有明顯的頻閃現(xiàn)象。
?
以50Hz為例說(shuō)明,實(shí)現(xiàn)這個(gè)有兩種辦法:
1、設(shè)置曝光控制,強(qiáng)制為10ms整數(shù)倍變化,但是這樣會(huì)浪費(fèi)一部分曝光時(shí)間,導(dǎo)致曝光無(wú)法用滿,在室內(nèi)自然就會(huì)損失性能。
2、修改楨率,使每楨圖像分到的時(shí)間是10ms的整數(shù)倍,則可以用滿每楨曝光時(shí)間在,室內(nèi)效果更好。修改楨率可以插入Dummy Line或者Dummy Pixel。這需要一點(diǎn)點(diǎn)計(jì)算,具體計(jì)算需要看sensor輸出Timing。
例如把楨率設(shè)置為7.14fps,則每楨曝光時(shí)間是140ms。如果是15fps,則每楨曝光時(shí)間是66.66ms,如果強(qiáng)制曝光為10ms整數(shù)倍,最大即60ms,則有6.66ms無(wú)法參與曝光,損失性能。
具體調(diào)整楨率方法得和sensor的FAE溝通,每個(gè)sensor都可能不一樣,不能一概而論。調(diào)整楨率還有個(gè)原則要注意,預(yù)覽一般不能低于 10fps,再低就很卡,常用14.28fps和12.5fps;抓拍不能低于5fps,否則用手就很難拍出清晰的照片,常用7.14fps。楨率是一個(gè)權(quán) 衡折中的選擇
?????? 高了曝光時(shí)間不夠,暗光效果太差,低了沒(méi)法拍照,容易虛。
04
如何規(guī)避flicker(banding)問(wèn)題 ---?app?的修改
banding現(xiàn)象,也叫做牛頓環(huán),那防止這種現(xiàn)象,也就叫做防牛頓環(huán),在Android 里面叫做anti banding。
針對(duì)banding問(wèn)題,google也為我們提供了對(duì)應(yīng)的接口,CONTROL_AE_ANTIBANDING_MODE, 這個(gè)參數(shù),應(yīng)用上一般要求設(shè)置為AUTO。

05
如何規(guī)避flicker(banding)問(wèn)題 ---?hal?的修改
android/hardware/qcom/camera/QCamera2/HAL3/QCamera3HWI.cpp
從下面代碼可以看到,property屬性persist.vendor.camea.set.afd 控制的就是anti banding的值,如果上層設(shè)置下來(lái)是AUTO模式,那么代碼里面默認(rèn)值是5(AUTO_60HZ),實(shí)際上在我們國(guó)內(nèi),一般的燈光閃爍頻率是50hz,所以如果是國(guó)內(nèi)的產(chǎn)品,這個(gè)默認(rèn)值我們需要修改為4(AUTO_50HZ)。


推薦閱讀:
Android Camera 測(cè)光梳理
Android Camera2 對(duì)焦梳理
哪些坑爹的Android CTS測(cè)試
高通Camera數(shù)字成像系統(tǒng)簡(jiǎn)介
一篇文章帶你了解Android 最新Camera框架
這可能是介紹Android UvcCamera最詳細(xì)的文章了
參考資料:
1. [關(guān)于cmos工頻干擾導(dǎo)致的閃爍問(wèn)題]
? ? https://blog.csdn.net/weixin_41944449/article/details/94296676
2. [camera工頻干擾問(wèn)題]
? ? https://blog.csdn.net/jzwjzw19900922/article/details/108508416
3.[Camera Sensor 的工頻閃爍]
? ? https://blog.csdn.net/lz0499
