視訊防抖有很多種技術,各有優劣,主流的目前分為三種:
EIS電子防抖
EIS電子防抖是通過軟體演演算法實現防抖的。其技術運作原理是通過加速度感測器和陀螺儀模組偵測手機抖動的幅度,從而來動態調節整ISO、快門以及成像演演算法來做模糊修正。
優點:成本低
缺點:畫面會被裁切,犧牲影象解析度
OIS光學防抖
OIS光學防抖是通過處理器、陀螺儀和相機防抖模組之間的配合,在拍照抖動時用以驅動防抖元件快速向抖動的相反方向移動鏡頭模組,由此來抵消發生的抖動,進而實現最終的穩定成像。
優點:畫面不會被裁切,原生畫質影象效果最好
缺點:成本較高、鏡頭非常容易損壞、鏡頭無法做小
AIS智慧防抖
AIS防抖是一種基於人工智慧的影象防抖技術,可以在相機拍攝過程中,減少因為手抖動造成的畫面模糊,獲得更加穩定,清晰的畫面。即使在拍攝視訊或者拍攝夜景時,也可取得良好的防抖效果。
優點:健壯性可以做到很強
缺點:效能低、尚未普及
本文主要討論的是最AIS智慧防抖的基礎部分,不涉及到AI的部分,而只是最原始的基於影象特徵點抖動檢測加以糾偏的防抖技術。
第一步:對每一幀(逐幀)影象做角點檢測,又稱為關鍵點檢測。也就是將影象上所有的關鍵點角點識別出來。
如下圖所示,藍色圈出來的部分,就是影象上的關鍵點。
關鍵點檢測有很多種演演算法:
1. FAST
2. Agast
3. GFTT
4. SimpleBlob
5. Affine
6. SIFT
7. BRISK
8. ORB
9. MSER
第二步:逐一將前後兩幀的角點(關鍵點)做比對,計算出兩兩之間的向量差(仿射變換)。
如下圖紅色箭頭所示方向,既是兩幀相比對得到的向量方向。
先使用OpenCV裡的光流法函數 calcOpticalFlowPyrLK() 函數得到前後得到當前幀相對上一幀的所有關鍵點變化資訊。
再使用OpenCV裡的 estimateRigidTransform() 函數傳入上一個函數的兩幀的結果,可以挑選出前後兩幀兩個2D點集矩陣之間的最佳仿射變換。
第三步,將第二步算出的最佳仿射變換矩陣資料的整體平均方向,套用低通濾波或者高斯濾波,抹平突變的波峰波谷。
在OpenCV裡面還分成 單程穩定器(OnePassStabilizer)和雙程穩定器(TwoPassStabilizer),
且支援設定兩種濾波方式:低通濾波(LpMotionStabilizer)和高斯濾波(GaussianMotionFilter)。
第四步,使用均值濾波抹平之後的仿射變換矩陣資料對視訊幀進行影象變換(縮放、旋轉、平移等全放射變換)和裁切。
在OpenCV裡面使用invertAffineTransform() 和 warpAffine()直接對影象進行仿射變換,得到變換後的影象結果。
第五步,將裁切後的視訊resize回原視訊的大小。
此步驟涉及到多種BorderMode(邊界模式):
1. CONSTANT
2. REPLICATE
3. REFLECT
4. WRAP
5. REFLECT_101
6. TRANSPARENT
至於各自有什麼差異無非就是各種填充方式有差異,有些是鏡面反射,有些是透明,有些是純黑色,自行去看OpenCV的檔案,一般最常見的是REPLICATE Mode。
Before After
以上就是一個視訊軟體防抖的全部步驟,希望能對你有幫助?