代碼URL:https://mbd.pub/o/bread/mbd-YZyZlJY=
是什么:
大家都知道VR,能夠看到360度全景圖像,即每幀圖像記錄了360度的景色。而工業(yè)界是怎樣拍攝這樣的圖像的呢?目前博主了解的主要有兩種做法:
- A.使用多個正常攝像頭,每個攝像頭拍攝固定角度的圖像,然后再拼接,博主2年前曾看過??低暤挠?個攝像頭組成的全景拍攝器材
- B.使用兩個視角>=180度的魚眼攝像頭,再拼接
在這里插入圖片描述
| | 優(yōu)點 |缺點|
| --- | --- |---|
|正常攝像頭|畸變較少,矯正拼接時效果好|貴|
|雙魚眼攝像頭|便宜,安裝簡單,目前米家/三星 Gear360都已很成熟|拼接還是有瑕疵|
能學習的知識::
初階: - 雙魚眼圖像拼接能考察非常全面的圖像處理知識,在目前深度學習火的時候,掌握以前的圖像處理知識還是很有幫助的。概括的知識點:
- 圖像成像原理(世界坐標點到二維圖像),
- 圖像特征(sift/surf等,學習下前人在沒有端對端網(wǎng)絡(luò)怎么提的人工特征)
- 圖像拼接融合,最佳縫合線
- 圖像金字塔,高斯金字塔/拉普拉斯金字塔(deep cnn中FPN也是博主比較常用的結(jié)構(gòu)去訓分類或者檢測的模型)
高階:
- 提升效果:比我提供的解決方案效果好,能在什么方向優(yōu)化效果
- 提升效率:怎么加速處理過程,SIMD/算法/并行???
1.需求
輸入:給定兩張魚眼圖像拍攝的圖像,并且兩個魚眼鏡頭拍攝角度相向
輸出:一張拼接好的矩形映射全景圖(后續(xù)你可以根據(jù)這張全景圖去做各種趣味剪輯)
2.我的解決方案
2.1 算法模塊拆解
我先google網(wǎng)上的做法:發(fā)現(xiàn)類似的功能:
https://moonagic.com/dualfisheye-to-equirectangular/
- 1.圓形畸變魚眼圖轉(zhuǎn)換為矩形展開圖(如下圖),代碼位于libs/remap/remap.py
在這里插入圖片描述
- 2.特征提取配對,代碼位于libs/feature
- 3.矯正圖像,代碼位于libs/homography
-
4.圖像融合,使用最佳縫合線(相對于線性融合無重影),支持拉普拉斯金字塔恢復細節(jié),代碼位于libs/fusion/
在這里插入圖片描述
2.2 后期優(yōu)化
由于時間有限,博主還有自己的工作,抽周末完成這些項目,有些可優(yōu)化的方向未實現(xiàn),但都比較簡單大家可以自己實現(xiàn)
效果:
- 1.圖像配對點,sift等一系列特征都受輸入圖像影響,如果輸入圖像都是低頻信息,不存在梯度等變化也就沒有辦法找到這些特征了,工業(yè)界都會使用標定圖去找到配對點,如果你要接入標定圖輸出坐標的化只需要把process.py[67-68行]輸入進去[[x,y]]Z坐標
- 2.圖像矯正,在project/paper文件夾里有三星GEAR360的一篇論文,大體方法類似,但他在矯正時加了模板匹配來左右對齊,大家也可以看看
- 3.圖像融合,如果有明顯的光照區(qū)別,可以試試光照補償?shù)囊恍┧惴?br>
效率:
說實話python沒什么能優(yōu)化效率的,也可以把一些操作cython化但是也沒什么意義,不如用c++寫一遍用SIMD優(yōu)化
分析各個階段的效率: - 1.remap:已經(jīng)生成xmap,ymap坐標映射圖了,轉(zhuǎn)換很快
- 2.sift是比較慢,這里已經(jīng)做了優(yōu)化(只對overlap提特征),如果是跑視頻的化,只需要前幾幀生成homography后面都不用提sift特征了
- 3.融合,只對overlap區(qū)域最佳縫合線也不耗時,但圖像金字塔有卷積操作
代碼風格(google python style):
1.代碼框架
在這里插入圖片描述
2.其中一個類格式
在這里插入圖片描述