基於圖像的三維重建技術SFM(Structure from Motion)已相對成熟,例如在傾斜攝影領域應用廣泛,而且成熟的商業軟體Context Capture,PhotoScan(MetaShape),開源的例如colmap、VisualSFM等等。三維重建計算量很大,對於大規模的場景計算需要很高的計算資源,往往也只能通過桌面端操作上傳圖像。想要快速基於拍攝的圖片獲得三維模型,又不想回到室內操作,那麼就需要上雲,就需要一套自動化程度相對較高、圖像採集操作簡單、具備模型可視化的方法,但是如果要部署一個計算性能很高的雲伺服器,成本又實在太高了,買不起...。
幾個問題:1)圖像採集、上傳要便捷、例如手機採集圖片直接上傳;2)需要模型可視化;3)伺服器不能負擔太重,能夠擴展計算資源;4)簡單。
針對這幾個問題的考慮,設計了一套在線三維重建服務框架。之前對SFM的整體框架已較為熟悉,於是基於開源的SFM程序,做了些修改作為計算服務,再寫一套數據的API+鑑權,周末花了兩天時間把這個做了初步實現了。
三維重建服務的基本流程如下:圖片採集=>圖像處理(特徵提取、特徵匹配、稀疏重建、密集重建)=>生成指定格式的模型;使用者來說,只需要上傳圖片(控制點坐標),然後等待結果即可。
sfm流程基本方案:搭建數據服務平臺,數據採集、數據存儲、數據處理各自獨立,通過數據API接口實現添加任意數量的計算節點,在每個計算節點上部署自動化的三維重建服務,例如在自己的電腦上部署,或是在區域網內部署,計算任務完成後自動同步本地數據,前端可隨時隨地查看。
框架包含:應用伺服器(數據API接口+web前端)、公共存儲伺服器(例如:OSS)、計算節點(可按需配置),數據傳輸通過Token鑑權,計算節點主動查詢待計算的任務並下載圖像集合進行處理,並對主要步驟處理狀態進行上報並同步上傳處理的結果文件,前端查詢任務狀態,訪問相應的數據。
框架示意圖實現:
前端:Vuejs+threejs
接口服務:python+uvicorn
三維重建計算:python+OpenSfM,只能在linux系統上運行,可以使用Windows的linux子系統部署。
demo
基於編寫的公共數據接口開發了一個簡單的前端demo:四個基本操作,創建項目、上傳圖片、提交任務、刷新。兩個數據可視化:圖片列表、三維重建結果瀏覽。若是在手機端打開web頁面可是直接拍照上傳。三維重建服務包含了稀疏重建和密集重建。
SFM前端-圖像集合管理SFM前端-三維重建結果瀏覽前端展示相機位姿、相機對應的圖片
圖像+相機位姿SfM前端-稠密點雲瀏覽SFM前端的交互效果
後續進一步完善後會考慮部署、共享