前言
本文為 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: 追蹤人體骨架
範例06 – 3D 物件偵測
本範例將說明如何操作 ZED 3D 攝影機對空間(僅適用 ZED2 / ZED2i) 中的人體進行偵測、分類與定位。偵測與定位可於靜止或移動的攝影機狀態下進行。
註:原廠頁面每段都提供了 C++ / Python / C# 的範例程式,在此只列出 Python 範例。
以下執行畫面來自 ZED 原廠文件,除了可看到正確框住人體之外,也有標示不同ID與移動軌跡線(下右圖):
前置作業
- 下載最新版的 ZED SDK (請點我))
- 下載 Image Capture 範例程式,提供 C++, Python 與 C# 等版本
- 在 Windows 或 Linux OS上,建置 C++ 環境(請點我) 或執行 Python 範例,本系列文章將使用 Python (教學請點我)
程式總覽
開啟攝影機
本範例將使用 ZED SDK 中的 Object Detection AI 模組。如先前範例,首先要建立、設定並開啟攝影機。
[pastacode lang=”python” manual=”%23%20Create%20ZED%20objects%0Azed%20%3D%20sl.Camera()%0Ainit_params%20%3D%20sl.InitParameters()%0Ainit_params.camera_resolution%20%3D%20sl.RESOLUTION.HD720%0Ainit_params.depth_mode%20%3D%20sl.DEPTH_MODE.ULTRA%0Ainit_params.sdk_verbose%20%3D%20True%0A%0A%23%20Open%20the%20camera%0Aerr%20%3D%20zed.open(init_params)%0Aif%20err%20!%3D%20sl.ERROR_CODE.SUCCESS%3A%0A%20%20%20%20%23%20Quit%20if%20an%20error%20occurred%0A%20%20%20%20exit()” message=”open the camera” highlight=”” provider=”manual”/]啟用 3D 物件偵測
在啟用物件偵測之前要先指定 AI 模組的 ObjectDetectionParameters。本範例使用設定如下:
image_sync:決定要在每一張畫面中都偵測物件,或在獨立執行緒中以非同步方式執行。enable_tracking:決定是否要在不同畫面中追蹤物件,並盡可能保留相同的 ID。一定要先啟用 positional tracking 才能從不同的攝影機動態中獨立偵測物件的動作。enable_mask_output:對已偵測到的物件輸出 2D 遮罩。由於這需要額外的運算,如果不會用到的話請將其停用。
啟用物件偵測時會一併載入 AI 模型,這項操作需要幾秒鐘。首次使用 AI 模型時,模型會根據您的硬體進行大約數分鐘的最佳化作業,不過別擔心,這個神經網路模型最佳化作業只要執行一次就好。
[pastacode lang=”python” manual=”print(%22Object%20Detection%3A%20Loading%20Module…%22)%0Aerr%20%3D%20zed.enable_object_detection(detection_parameters)%0Aif%20err%20!%3D%20sl.ERROR_CODE.SUCCESS%3A%0A%20%20%20%20print(%22Error%20%7B%7D%2C%20exit%20program%22.format(err))%0A%20%20%20%20zed.close()%0A%20%20%20%20exit()” message=”load module and check errors” highlight=”” provider=”manual”/]取得物件資料
使用 retrieveObjects() 函式搭配用於儲存物件資料的 Objects 參數,即可取得影像中已偵測到的物件相關資料。
由於已啟用 image_sync,因此對於每個 grab 呼叫而言,影像都會被送入 AI 模組中並輸出各 frame 中已偵測到的物件。另外也把信心閾值設為 40,來保留一定信心程度以上的偵測結果。
停用模組並離開程式
退出程式之前需要先停用各模組並關閉攝影機。請注意也可透過 zed.close() 語法來正確停用所有啟用中的模組。有必要的話,也可透過 destructor 自動呼叫close() 函式。
這樣就完成啦!
下一步
您現在已經知道如何取得來自 ZED 立體攝影機的影像、深度與 3D 物件資料。如果想要偵測場景中的不同物體,並在即時點雲中顯示該物體的 3D 邊界框的話,請參考 3D Object Detection 範例。
註:本文經授權之後翻譯自 https://www.stereolabs.com/docs/tutorials/3d-object-detection/







