本文為 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 模組。如先前範例,首先要建立、設定並開啟攝影機。
# Create ZED objects
zed = sl.Camera()
init_params = sl.InitParameters()
init_params.camera_resolution = sl.RESOLUTION.HD720
init_params.depth_mode = sl.DEPTH_MODE.ULTRA
init_params.sdk_verbose = True
# Open the camera
err = zed.open(init_params)
if err != sl.ERROR_CODE.SUCCESS:
# Quit if an error occurred
exit()
open the camera
啟用 3D 物件偵測
在啟用物件偵測之前要先指定 AI 模組的 ObjectDetectionParameters
。本範例使用設定如下:
# Define the Object Detection module parameters
detection_parameters = sl.ObjectDetectionParameters()
detection_parameters.image_sync = True
detection_parameters.enable_tracking = True
detection_parameters.enable_mask_output = True
# Object tracking requires camera tracking to be enabled
if detection_parameters.enable_tracking:
zed.enable_positional_tracking()
enable 3D object detection
image_sync
:決定要在每一張畫面中都偵測物件,或在獨立執行緒中以非同步方式執行。
enable_tracking
:決定是否要在不同畫面中追蹤物件,並盡可能保留相同的 ID。一定要先啟用 positional tracking 才能從不同的攝影機動態中獨立偵測物件的動作。
enable_mask_output
:對已偵測到的物件輸出 2D 遮罩。由於這需要額外的運算,如果不會用到的話請將其停用。
啟用物件偵測時會一併載入 AI 模型,這項操作需要幾秒鐘。首次使用 AI 模型時,模型會根據您的硬體進行大約數分鐘的最佳化作業,不過別擔心,這個神經網路模型最佳化作業只要執行一次就好。
print("Object Detection: Loading Module...")
err = zed.enable_object_detection(detection_parameters)
if err != sl.ERROR_CODE.SUCCESS:
print("Error {}, exit program".format(err))
zed.close()
exit()
load module and check errors
取得物件資料
使用 retrieveObjects()
函式搭配用於儲存物件資料的 Objects
參數,即可取得影像中已偵測到的物件相關資料。
由於已啟用 image_sync
,因此對於每個 grab
呼叫而言,影像都會被送入 AI 模組中並輸出各 frame 中已偵測到的物件。另外也把信心閾值設為 40,來保留一定信心程度以上的偵測結果。
# Set runtime parameter confidence to 40
detection_parameters_runtime = sl.ObjectDetectionRuntimeParameters()
detection_parameters_runtime.detection_confidence_threshold = 40
objects = sl.Objects()
# Grab new frames and detect objects
while zed.grab() == sl.ERROR_CODE.SUCCESS:
err = zed.retrieve_objects(objects, detection_parameters_runtime)
if objects.is_new:
# Count the number of objects detected
print("{} Object(s) detected".format(len(objects.object_list)))
if len(objects.object_list):
# Display the 3D location of an object
first_object = objects.object_list[0]
position = first_object.position
print(" 3D position : [{0},{1},{2}]".format(position[0],position[1],position[2]))
# Display its 3D bounding box coordinates
bounding_box = first_object.bounding_box
print(" Bounding box 3D :")
for it in bounding_box:
print(" " + str(it),end='')
detect objects with AI module
停用模組並離開程式
退出程式之前需要先停用各模組並關閉攝影機。請注意也可透過 zed.close()
語法來正確停用所有啟用中的模組。有必要的話,也可透過 destructor 自動呼叫close()
函式。
# Disable object detection and close the camera
zed.disable_object_detection()
zed.close()
disable modules and exit
這樣就完成啦!
下一步
您現在已經知道如何取得來自 ZED 立體攝影機的影像、深度與 3D 物件資料。如果想要偵測場景中的不同物體,並在即時點雲中顯示該物體的 3D 邊界框的話,請參考 3D Object Detection 範例。
註:本文經授權之後翻譯自 https://www.stereolabs.com/docs/tutorials/3d-object-detection/