前言
本文為 ZED 景深攝影機原廠範例,共有八個範例,請根據 ZED 的範例程式頁面,取得 C++ / Python / C# 等範例原始碼。說明如下:
- Hello ZED: 入門範例,說明如何連接 ZED 攝影機,並於終端機中顯示裝置序列編號。
- Image Capture: 開啟 ZED 攝影機,取得影像,並於終端機中顯示時間戳記、影像尺寸。
- Depth Perception: 取得畫面的深度資料與點雲,並於終端機中顯示指定點的距離。
- Camera Tracking: 啟用位置追蹤,可即時更新攝影機的位置與指向。
- Spatial Mapping: 啟用地圖繪製,可擷取環境的網格或融合點雲。
- 3D Object Detection: 偵測畫面中的物體,並進行 3D 定位(只適用於 ZED 2 機型)。
- Using Sensors: 取得攝影機的 IMU、氣壓計與磁力感測器資料。
- Body Tracking: 追蹤人體骨架
範例05 – 空間映射
本範例將說明如何操作 ZED 立體攝影機來取得您所在環境的即時 3D 重建結果。程式會對 500 張畫面進行空間映射、取得網格、濾波並將其存成一個 OBJ 檔。
註:原廠頁面每段都提供了 C++ / Python / C# 的範例程式,在此只列出 Python 範例
前置作業
- 下載最新版的 ZED SDK (請點我)
- 下載 Image Capture 範例程式,提供 C++, Python 與 C# 等版本
- 在 Windows 或 Linux OS上,建置 C++ 環境(請點我) 或執行 Python 範例,本系列文章將使用 Python (教學請點我)
程式總覽
開啟攝影機
首先要初始化攝影機。本範例將使用 HD720 / 60 fps 模式(這樣的視野較廣) 來確認攝影機追蹤結果是否可靠。另外也選定右手坐標系統,Y軸朝上為正,這也是 Meshlab 這類 3D 檢視軟體較常採用的坐標系統。
啟用位置追蹤
首先用 enablePositionalTracking() 來啟用位置追蹤,接著才能啟用空間映射。
啟用空間映射
空間映射的前置作業與位置追蹤類似:先建立 SpatialMappingParameters 類別,並以此作為參數來呼叫 enableSpatialMapping()。
本範例無法詳細介紹 SpatialMappingParameters 類別,更多資訊請參考 API 文件。
執行即時 3D 重建
對指定區域進行空間映射時,不需要在 grab() 迴圈中呼叫任何函式。ZED SDK 會在背景檢查是否有新的影像、深度與位置資訊,並根據這些資料以非同步方式自動建立 3D 地圖。
本範例只會擷取 500 張畫面 (frame)、檢查 3D 映射狀態,接著停止迴圈來取得最終的網格。
[pastacode lang=”python” manual=”%23%20Grab%20data%20during%203000%20frames%0Ai%20%3D%200%0Apy_mesh%20%3D%20sl.Mesh()%20%20%23%20Create%20a%20Mesh%20object%0Aruntime_parameters%20%3D%20sl.RuntimeParameters()%0Awhile%20i%20%3C%203000%3A%0A%20%20%20%20if%20zed.grab(runtime_parameters)%20%3D%3D%20sl.ERROR_CODE.SUCCESS%3A%0A%20%20%20%20%20%20%20%20%23%20In%20background%2C%20spatial%20mapping%20will%20use%20new%20images%2C%20depth%20and%20pose%20to%20create%20and%20update%20the%20mesh.%20No%20specific%20functions%20are%20required%20here.%0A%20%20%20%20%20%20%20%20mapping_state%20%3D%20zed.get_spatial_mapping_state()%0A%20%20%20%20%20%20%20%20%23%20Print%20spatial%20mapping%20state%0A%20%20%20%20%20%20%20%20print(%22%5CrImages%20captured%3A%20%7B0%7D%20%2F%203000%20%7C%7C%20%7B1%7D%22.format(i%2C%20mapping_state))%0A%20%20%20%20%20%20%20%20i%20%3D%20i%20%2B%201″ message=”run live 3D reconstruction” highlight=”” provider=”manual”/]取得網格
取得 500 張畫面的 3D 地圖之後,即可透過 extractWholeSpatialMap() 語法取得儲存於Mesh 物件中的網格。本函式會持續執行直到取得完整的網格為止。
注意:映射過程中可能是以非同步方式來取得網格,詳細資訊請參考 Using Spatial Mapping API。
This mesh can be filtered (如有必要) 來移除重複的點與不必要的面。接著將網格存為 OBJ 檔以便後續使用。
[pastacode lang=”markup” manual=”filter_params%20%3D%20sl.MeshFilterParameters()%0Afilter_params.set(sl.MESH_FILTER.LOW)%0Apy_mesh.filter(filter_params)%20%23%20Filter%20the%20mesh%20(remove%20unnecessary%20vertices%20and%20faces)%0Apy_mesh.save(%22mesh.obj%22)%20%23%20Save%20the%20mesh%20in%20an%20obj%20file” message=”filter and save as .obj file” highlight=”” provider=”manual”/]停用模組並離開程式
網格取得並存檔完成之後,記得要依序停用映射與追蹤模組(順序要對!),並在結束程式之前關閉攝影機。
[pastacode lang=”python” manual=”%23%20Disable%20tracking%20and%20mapping%20and%20close%20the%20camera%0Azed.disable_spatial_mapping()%0Azed.disable_positional_tracking()%0Azed.close()” message=”disable modules and exit” highlight=”” provider=”manual”/]更多範例
如果您想知道如何擷取周遭環境的即時 3D 網格,並將其作為圖層顯示於攝影機影像上的話,請參考 Live 3D Reconstruction 範例。
下一步
您現在已經知道如何取得來自 ZED 立體攝影機的 image, depth, odometry and 3D mapping data。後續的物件偵測範例將說明如何在 3D 環境中偵測與追蹤人體。
註:本文經授權之後翻譯自 https://www.stereolabs.com/docs/tutorials/spatial-mapping/





