本文為 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: 追蹤人體骨架
範例08 – 人體追蹤
本範例將說明如何使用 ZED 3D 攝影機的人體追蹤模組(ZED Body Tracking module)來偵測與追蹤人體。
以下關節編號圖片來自 ZED 原廠文件:,分別為 34 點姿勢(POSE_34
)以及 18 點姿勢 (POSE_18
)
前置作業
- 下載最新版的 ZED SDK (請點我)
- 下載 Image Capture 範例程式,提供 C++, Python 與 C# 等版本
- 在 Windows 或 Linux OS上,建置 C++ 環境(請點我) 或執行 Python 範例,本系列文章將使用 Python (教學請點我)
程式總覽
開啟攝影機
本範例會用到 ZED SDK 中的 Body Tracking 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 物件偵測
首先要啟用 Object Detection 模組才能執行人體追蹤。別忘了要先設定該模組的 ObjectDetectionParameters
才能啟用物件偵測功能喔 (詳細作法請回顧範例06物件偵測)。請注意物件追蹤也須用到位置追蹤功能才能在世界參考坐標中來追蹤想要的物件。
# Define the Object Detection module parameters
obj_param = sl.ObjectDetectionParameters()
# Different model can be chosen, optimizing the runtime or the accuracy
obj_param.detection_model = sl.DETECTION_MODEL.HUMAN_BODY_FAST
# run detection for every Camera grab
obj_param.image_sync = True
# Enable tracking to detect objects across time and space
obj_param.enable_tracking = True
# Optimize the person joints position, requires more computations
obj_param.enable_body_fitting = True
# If you want to have object tracking you need to enable positional tracking first
if obj_param.enable_tracking:
positional_tracking_param = sl.PositionalTrackingParameters()
zed.enable_positional_tracking(positional_tracking_param)
enable body tracking
啟用物件偵測時會一併載入 AI 模型,這項操作需要幾秒鐘。首次使用 AI 模型時,模型會根據您的硬體進行大約數分鐘的最佳化作業,不過別擔心,這個神經網路模型最佳化作業只要執行一次就好。
print("Object Detection: Loading Module...")
err = zed.enable_object_detection(obj_param)
if err != sl.ERROR_CODE.SUCCESS:
print(repr(err))
zed.close()
exit(1)
start module and load AI model
擷取資料
物件偵測的信心閾值可於執行過程中隨時調整,讓您可根據場景複雜度來選擇是否只要偵測最相關的人體骨架。由於相關參數已被設為 image_sync
,因此對於每次 grab
呼叫來說, 影像都會被送進 AI 模組並輸出個畫面的偵測結果。
# Set runtime parameter confidence to 40
obj_runtime_param = sl.ObjectDetectionRuntimeParameters()
obj_runtime_param.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, obj_runtime_param)
if objects.is_new:
# Count the number of objects detected
obj_array = objects.object_list
print(str(len(obj_array)) + " Person(s) detected\n")
if len(obj_array) > 0:
first_object = objects.object_list[0]
# Display the 3D keypoint coordinates of the first detected person
print("\n Keypoint 3D ")
keypoint = first_object.keypoint
for it in keypoint:
print(" " + str(it))
capture data
停用模組並離開程式
程式結束時,會一併停用模組並關閉攝影機。由於 zed.close()
會負責停用所有模組,因此這個步驟並非必要。。有必要的話,也可透過 destructor 自動呼叫close()
函式。
大功告成!
下一步
如果想知道如何偵測場景中的人體並將其 3D 骨架顯示於即時影像上(如本文開頭影片),請參考 3D Object Detection 進階範例。
註:本文經授權之後翻譯自 https://www.stereolabs.com/docs/tutorials/body-tracking/