:::info 這篇 MD 介紹如何使用現成的工具,透過多視角的圖片重建三維場景 ::: # Part1 - openMVG(open Multiple View Geometry) 第一步要先透過 [openMVG](https://github.com/openMVG/openMVG/tree/develop) 這個開源套件,幫助我們從圖片重建出「稀疏點雲」。 ## Building from source 要先自行從官網建置出可執行檔,官網可以找到[執行步驟的 md 檔](https://github.com/openMVG/openMVG/blob/develop/BUILD.md),如果是 Linux 或是 Mac 系統,只要依照指示應該是不會出現問題, windows 的部分需要透過 VisualStudio 的 IDE 幫你建置。 >我自己用 Mingw 的編譯器透過 cmake 去建置時,往往編譯到一半就會報錯:\_) >我Mac的朋友要用 pixi 才載成功:\_) :::info windows 用戶可以在 [openMVG 的 release](https://github.com/openMVG/openMVG/releases) 找到已經編譯好的 exe,真香 ::: ### VisualStudio 如果只是要單純拿來建置的話,下載時只需要下面的部分即可:  ### openMVG src file 在官方提供的 Build.md 裡面有提供 clone 的指令: ``` $ git clone --recursive https://github.com/openMVG/openMVG.git ``` clone 下來後使用 VS 打開 src 資料夾,之後 VS 會自動的幫你根據內容生成對應的檔案,最終只要點下綠色三角形:,選擇下載 openMVG,就會開始幫你編譯了。 ### exe and pipeline 編譯好後可以找到官方提供的各種功能:  並且可以在 `openMVG/src/software/SfM` 找到官方提供的 pipeline:`SfM_GlobalPipeline.py` 跟 `SfM_SequentialPipeline.py`,還有其他展示等功能的 py 檔。 想要初次體驗的話請使用上面這兩個 py 檔即可,下面以 SequentialPipeline 做介紹。 ## SequentialPipeline 每個 exe 檔都有很多參數可以帶,可以自行根據需求調整,或是搜尋如何調整,下面根據 pipeline 內有提到的部分做說明。 :::warning 下面的每個步驟我並不是直接執行 `SfM_SequentialPipeline.py`,而是使用終端機一行一行執行,要小心路徑問題。 ::: ### 1. Intrinsics analysis 第一步要使用 `openMVG_main_SfMInit_ImageListing` 初始化整個流程中的重要文件`sfm_data.json`,其中參數分別有: - `-i`:二維圖片的所在資料夾 - `-o`:輸出 `sfm_data.json` 的目的資料夾 - `-d`:`sensor_width_camera_database.txt` 的所在位置 - openMVG 有提供他們蒐集好的資料庫,位在 `openMVG/src/openMVG/exif/sensor_width_camera_database` 這個資料夾內 - 但如果你圖片所使用的拍攝像機不在這份表內,要記得根據報錯訊息得知你相機的名稱,再去 google 相機的 width,可以參見[這篇](https://blog.csdn.net/Betterc5/article/details/114588696) - `-f`:相機焦距。如果圖片的相機資訊有遺失的話,生成出來的 `sfm_data.json` 中的 intrinsics 會是空陣列,這時就得要自己手動添加「近似焦距」,[作者提供的公式](https://github.com/openMVG/openMVG/wiki/OpenMVG-on-your-image-dataset)是 $\text{max(width, height)} \times 1.2$,其中寬跟高單位是 pixel - 當然最好就是不要讓圖片喪失這個資訊,傳送圖檔的時候要注意 ### 2. Compute features 使用 `openMVG_main_ComputeFeatures`: - `-i`:剛剛生成的 `sfm_data.json` 的位置 - `-o`:輸出檔案的目的資料夾 - `-m`:演算法類型,預設是 `SIFT`,可以參考[維基百科](https://zh.wikipedia.org/zh-tw/%E5%B0%BA%E5%BA%A6%E4%B8%8D%E8%AE%8A%E7%89%B9%E5%BE%B5%E8%BD%89%E6%8F%9B) ### 3. Compute matching pairs 使用 `openMVG_main_PairGenerator`: - `-i`:`sfm_data.json` 的位置 - `-o`:輸出檔案的位置以及其名稱,名稱(似乎)要固定叫做 `"/pairs.bin"` - 我好像曾經改過檔名,但是就壞了,不確定是不是這個原因 ### 4. Compute matches 使用 `openMVG_main_ComputeMatches` - `-i`:`sfm_data.json` 的位置 - `-p`:剛剛生成的 `"/pairs.bin"` 的位置 - `-o`:輸出檔案的位置以及其名稱,名稱不用固定叫做`"/matches.putative.bin"` ### 5. Filter matches 使用 `openMVG_main_GeometricFilter` - `-i`:`sfm_data.json` 的位置 - `-m`:剛剛生成的 `"/matches.putative.bin"` 的位置 - `-g`:相機矩陣,預設是 `f` (fundamental matrix),可以參見 [這篇](https://silverwind1982.pixnet.net/blog/post/144982784) - `-o`:輸出檔案的位置以及其名稱,名稱**一定要叫做**`"/matches.f.bin"`,不然會找不到 ### 6. Do Sequential/Incremental reconstruction 使用 `openMVG_main_SfM`: - `-s`:重建的演算法,預設是 `"INCREMENTAL"` - `-i`:`sfm_data.json` 的位置 - `-m`:第二步時的輸出目的資料夾 - 此時裡面會有剛剛生成的各種檔案,像是 `"/matches.f.bin"` - `-o`:重建的檔案要放置的資料夾 ### 7. Colorize Structure 使用 `openMVG_main_ComputeSfM_DataColor` 為剛剛重建的點雲上色。 - `-i`:在剛剛重建檔放置的資料夾內會有一個`sfm_data.bin`,請輸入他的位置 - `-o`:上完色版本的檔案要放置的資料夾以及名稱,預設叫做 `"colorized.ply"` ## MeshLab 至此我們已經成功的透過二維圖片重建出三維點雲,但是目前是「稀疏點雲」。 最後生成的 `"colorized.ply"`,或是各步驟會逐一生成的 ply 檔,可以使用 [MeshLab](https://www.meshlab.net/) 這個軟體查看。 --- # Part2 - openMVS(open Multiple View Stereo) 最後我們將使用令一個開源軟體 [openMVS](https://github.com/cdcseacave/openMVS) 來幫我們重建出「稠密點雲」,還有 「(Refine) Mesh 模型」,以及最終鋪上材質的「Texture Mesh 模型」 ## Build `Windows` 用戶的話 [官方已經幫我們建置好了](https://github.com/cdcseacave/openMVS/releases),可以直接下載來用,真香;但如果要使用下面提到的 `InterfaceOpenMVG` ,就要自己編譯(或是一樣用作者編譯好的)了,請參見下方。 `Linux` & `Mac` 用戶要自行使用 cmake 編譯,但是編譯前還要先下載其他部分,官方有在其 [BUILD.md](https://github.com/cdcseacave/openMVS/blob/master/BUILD.md) 做說明,也可以參考 [這篇](https://blog.csdn.net/excellent_sun/article/details/120690641) - 要下載的: * [Eigen](http://eigen.tuxfamily.org) version 3.4 or higher * [OpenCV](http://opencv.org) version 2.4 or higher * [Ceres](http://ceres-solver.org) version 1.10 or higher (optional) * [CGAL](http://www.cgal.org) version 4.2 or higher * [Boost](http://www.boost.org) version 1.56 or higher - 要 clone 下來後,在 cmake 指定位置的: * [VCGlib](http://vcg.isti.cnr.it/vcglib) - 可選擇下載的: * [CUDA](https://developer.nvidia.com/cuda-downloads) (optional) * [GLFW](http://www.glfw.org) (optional) 這兩個弄好後就可以開始使用 cmake 編譯了。 ## Pipeline 官方也有提供他們的 Pipeline,有興趣的[可以看看](https://github.com/cdcseacave/openMVS/tree/master/scripts/python)。 可以從 `MvgMvsPipeline.py` 當中的最後幾步看出 openMVS 的核心步驟,下面便是依照 pipeline 的內容做說明。 :::warning pipeline 內容會隨版本而更新,請一定要遵照你所下載的版本隨附的 pipeline,遵照裡面的參數格式 ::: ## Export to openMVS 第一步是要根據上面生成的 `sfm_data.bin` 生成 openMVS 所需要的場景檔案,方法有兩個: ### 方法一(推薦):由 openMVG 提供 openMVG 有提供 `openMVG_main_openMVG2openMVS` 讓我們可以轉換出場景檔案。 >也有提供轉換成各種其他軟體適用的檔案,像是 COLMAP - `-i`:在剛剛重建檔放置的資料夾內會有一個`sfm_data.bin`,請輸入他的位置 - `-o`:場景檔案的位置及名稱,(似乎一定)要叫做 `"scene.mvs"` - `-d`:透過`sfm_data.bin` 還原回的圖檔所要放置的位置,請放置在跟 `"scene.mvs"` 相同的資料夾 ### 方法二:由 openMVS 提供 openMVS 有提供各種介面(程式)幫助你轉換,其中 `InterfaceOpenMVG` 的目的就是可以讓你使用 `sfm_data.json` 生成場景檔案。 但是作者幫你編譯好的並不會有,要自己編譯才有,記得修改 `openMVS/apps` 內的 `CMakeLists.txt`,新增 `ADD_SUBDIRECTORY(InterfaceOpenMVG)`,這部分可以參見 [這篇](https://blog.csdn.net/fb_help/article/details/87986642) 直接下載的沒有↓  :::info [這裡](https://github.com/cdcseacave/openMVS_sample/releases) 有 openMVS 作者用來示範幫你編譯好的,但是 v0.7a 是沒有的 ::: 當你有了之後,根據 [openMVG 所寫的說明](https://github.com/openMVG/openMVG/blob/develop/docs/sphinx/rst/software/MVS/OpenMVS.rst),需要輸入: ``` $ InterfaceOpenMVG -i PATH/sfm_data.json -o scene.mvs ``` 但是要注意的是,我執行的時候(好像是單純因為路徑問題)有遇到[這個問題](https://github.com/openMVG/openMVG/issues/1148),必須要根據上面最終生成的`sfm_data.bin`,使用 openMVG 提供的 `openMVG_main_ConvertSfM_DataFormat` 生成新的 `sfm_data.json`後,再使用這個 json 檔就行了。 :::info 下面我以 `openMVG_main_openMVG2openMVS` 的結果做介紹 ::: ## Start ! :::warning 下面的每個步驟我並不是直接執行 [openMVS 提供的 pipeline](https://github.com/cdcseacave/openMVS/blob/master/scripts/python/MvgMvsPipeline.py),而是根據主要的步驟,一行一行執行,要小心路徑問題。 有出任何問題執行不了,可以試試切換路徑,或者嘗試理解他存放檔案的邏輯 ::: 轉換好 `"scene.mvs"` 後,可以在其所在資料夾內看到他,以及當初指定 `-d` 路徑時生成的圖片:  **這時候請將終端機位置 cd 到這個資料夾內**,沒有切換路徑的話,就會因為路徑問題,導致什麼東西都跑不出來。 :::info openMVS 自動會偵測有沒有 gpu 可以用,然後你也可以代入參數決定要不要用。 ::: ### 1. Densify point cloud 使用 `DensifyPointCloud` 重建密集點雲。 - `-i`:`scene.mvs` - `--cuda-device`:預設是 -2 (CPU),有顯卡的可以考慮用 -1 (Best GPU) ### 2. Reconstruct the mesh 使用 `ReconstructMesh` 重建 Mesh。 - `-i`:`scene_dense.mvs` - `-p`, `scene_dense.ply` - `--cuda-device`:預設是 -2 (CPU),有顯卡的可以考慮用 -1 (Best GPU) - `-o`:輸出的檔案名稱,記得副檔名要是 mvs - 他會跟著生成同樣名稱但副檔名是 ply 的檔案,可以拿來看 :::info 上面那兩個都是 `DensifyPointCloud` 固定輸出的檔案以及檔名 ::: ### 3. Refine the mesh 使用 `RefineMesh` 讓 Mesh 更精緻: - `-i`:`scene_dense.mvs` - `-m`:reconstruct 生成的 ply 檔 - `--cuda-device`:預設是 -2 (CPU),有顯卡的可以考慮用 -1 (Best GPU) - `-o`:輸出的檔案名稱,記得副檔名要是 mvs - 他會跟著生成同樣名稱但副檔名是 ply 的檔案,可以拿來看 ### 4. Texture the mesh 使用 `TextureMesh` 生成紋理: - `-i`:`scene_dense.mvs` - `-m`:refine 生成的 ply 檔 - `--cuda-device`:預設是 -1 (Best GPU),沒顯卡要用 -2 (CPU) - `-o`:輸出的檔案名稱,記得副檔名要是 mvs - 他會跟著生成同樣名稱但副檔名是 ply 的檔案,這是最終結果 --- # 尾聲 最終透過 MeshLab 欣賞你的結果。  此範例為使用 [openMVG 所提供的資料集:SceauxCastle](https://github.com/openMVG/ImageDataset_SceauxCastle)。 這間房子可以參考 [維基百科](https://en.wikipedia.org/wiki/Ch%C3%A2teau_de_Sceaux) # 範例 這是我用手機(Oppo Reno R8 Pro)拍了 28 張照片後重建的章魚玩偶:  >然後被兩個朋友說很噁心,他明明就很可愛:_\) 由於這隻手機並未收錄在他的資料庫內,所以要自己填入 sensor width 的數值。 可以參見 [標準鏡頭](https://zh.wikipedia.org/zh-tw/%E6%A8%99%E6%BA%96%E9%8F%A1%E9%A0%AD),還有這個 [相機介紹](https://vocus.cc/article/61050d4bfd8978000186ed7c)。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up