ZED 景深攝影機範例#2/8 – Image Capture

本文為 ZED 景深攝影機原廠範例,共有八個範例,請根據 ZED 的範例程式頁面,取得 C++ / Python 兩種語言的範例原始碼。說明如下:

  1. Hello ZED: 入門範例,說明如何連接 ZED 攝影機,並於終端機中顯示裝置序列編號。
  2. Image Capture: 開啟 ZED 攝影機,取得影像,並於終端機中顯示時間戳記、影像尺寸。
  3. Depth Perception: 取得畫面的深度資料與點雲,並於終端機中顯示指定點的距離。
  4. Camera Tracking: 啟用位置追蹤,可即時更新攝影機的位置與指向。
  5. Spatial Mapping: 啟用地圖繪製,可擷取環境的網格或融合點雲。
  6. 3D Object Detection: 偵測畫面中的物體,並進行 3D 定位 (只適用於 ZED 2 機型)。
  7. Using Sensors: 取得攝影機的 IMU、氣壓計與磁力感測器資料。
  8. Body Tracking: 追蹤人體骨架

範例02 – Image Capture

本範例將說明如何截取ZED攝影機左側鏡頭的影像,並將影像之時間戳記與尺寸顯示於終端機中,程式會不斷執行直到成功截取50張影像為止。我們假設您已經順利完成上一個 Hello ZED 範例。

註:原廠頁面每段都提供了 C++ / Python / C# 的範例程式,在此只列出 Python 範例

前置作業

  • 下載最新版的 ZED SDK (請點我)
  • 下載 Image Capture 範例程式,提供 C++, Python 與 C# 等版本
  • 在 Windows 或 Linux OS上,建置 C++ 環境(請點我) 或執行 Python 範例,本系列文章將使用 Python (教學請點我)

範例總覽

   開啟攝影機

如上一個 Hello ZED範例,在此會建立、設定並開啟ZED攝影機,我們會把它的解析度設定為 dual HD 1080,30 fps。

# Create a ZED camera object
zed = sl.Camera()

# Set configuration parameters
init_params = sl.InitParameters()
init_params.camera_resolution = sl.RESOLUTION.HD1080  # Use HD1080 video mode
init_params.camera_fps = 30  # Set fps at 30

# Open the camera
err = zed.open(init_params)
if err != sl.ERROR_CODE.SUCCESS:
    exit(1)
Create a ZED camera object - python

取得影像資料

ZED 攝影機開啟之後,就可以擷取來自攝影機的即時串流影像了,在此建立一個迴圈來擷取50張影像,完成之後退出。

在此會呼叫 zed.grab 函式來擷取單張影像並處理。本函式也可接受執行階段參數,但本範例為求簡便採用預設設定。

如果回傳結果為 SUCCESS代表成功擷取一張新的影像並已可用,您也可檢視 grab() 狀態來得知擷取影像過程中是否發生錯誤。

# Grab an image
runtime_parameters = sl.RuntimeParameters()
if zed.grab(runtime_parameters) == sl.ERROR_CODE.SUCCESS:
    # A new image is available if grab() returns ERROR_CODE.SUCCESS
capture image data - python

擷取完成之後,就可以取得新的影像與其後設資料(metadata),本範例會使用retrieveImage()getTimestamp() 語法來取得左側鏡頭影像與其時間戳記。

retrieveImage() 會接受 image = sl.Mat() 以及 VIEW 模式作為參數。建立 Mat, 還不需要分配記憶體。首次呼叫retrieveImage() 時,sl.Mat() 會被填入影像資料且自動分配記憶體。

# Capture 50 frames and stop
i = 0
image = sl.Mat()
runtime_parameters = sl.RuntimeParameters()
while i < 50:
    # Grab an image, a RuntimeParameters object must be given to grab()
    if zed.grab(runtime_parameters) == sl.ERROR_CODE.SUCCESS:
        # A new image is available if grab() returns ERROR_CODE.SUCCESS
        zed.retrieve_image(image, sl.VIEW.LEFT) # Get the left image
        timestamp = zed.get_timestamp(sl.TIME_REFERENCE.IMAGE)  # Get the image timestamp
        print("Image resolution: {0} x {1} || Image timestamp: {2}\n".format(image.get_width(), image.get_height(), timestamp.get_milliseconds()))
        i = i + 1
Capture 50 frames and stop - python

注意:影像的時間戳記單位為奈秒,且為 Epoch 格式。比較兩次 zed.grab 函式之間的時間戳記,應該相當接近幀率 (前提是未掉幀)。

更多關於攝影機與影片參數請參考原廠文件 Using the Video API.

關閉攝影機

擷取50張影像之後,關閉攝影機並退出程式。

# Close the camera
zed.close()
close the camera - python

更多範例

想學習曝光、增益、對比與銳利度這類相機設定,並顯示於結果影像的話,請參考 Camera Control 範例。

下一步

您現在已經知道如何開啟/存取/設定攝影機了,也知道如何取得單張影像與其後設資料。

下一個範例要說明如何從  ZED 攝影機取得深度地圖。

註:本文經授權之後翻譯自 https://www.stereolabs.com/docs/tutorials/image-capture/

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。