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。

[pastacode lang=”python” manual=”%23%20Create%20a%20ZED%20camera%20object%0Azed%20%3D%20sl.Camera()%0A%0A%23%20Set%20configuration%20parameters%0Ainit_params%20%3D%20sl.InitParameters()%0Ainit_params.camera_resolution%20%3D%20sl.RESOLUTION.HD1080%20%20%23%20Use%20HD1080%20video%20mode%0Ainit_params.camera_fps%20%3D%2030%20%20%23%20Set%20fps%20at%2030%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%20exit(1)” message=”Create a ZED camera object – python” highlight=”” provider=”manual”/]

取得影像資料

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

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

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

[pastacode lang=”python” manual=”%23%20Grab%20an%20image%0Aruntime_parameters%20%3D%20sl.RuntimeParameters()%0Aif%20zed.grab(runtime_parameters)%20%3D%3D%20sl.ERROR_CODE.SUCCESS%3A%0A%20%20%20%20%23%20A%20new%20image%20is%20available%20if%20grab()%20returns%20ERROR_CODE.SUCCESS” message=”capture image data – python” highlight=”” provider=”manual”/]

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

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

[pastacode lang=”python” manual=”%23%20Capture%2050%20frames%20and%20stop%0Ai%20%3D%200%0Aimage%20%3D%20sl.Mat()%0Aruntime_parameters%20%3D%20sl.RuntimeParameters()%0Awhile%20i%20%3C%2050%3A%0A%20%20%20%20%23%20Grab%20an%20image%2C%20a%20RuntimeParameters%20object%20must%20be%20given%20to%20grab()%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%20A%20new%20image%20is%20available%20if%20grab()%20returns%20ERROR_CODE.SUCCESS%0A%20%20%20%20%20%20%20%20zed.retrieve_image(image%2C%20sl.VIEW.LEFT)%20%23%20Get%20the%20left%20image%0A%20%20%20%20%20%20%20%20timestamp%20%3D%20zed.get_timestamp(sl.TIME_REFERENCE.IMAGE)%20%20%23%20Get%20the%20image%20timestamp%0A%20%20%20%20%20%20%20%20print(%22Image%20resolution%3A%20%7B0%7D%20x%20%7B1%7D%20%7C%7C%20Image%20timestamp%3A%20%7B2%7D%5Cn%22.format(image.get_width()%2C%20image.get_height()%2C%20timestamp.get_milliseconds()))%0A%20%20%20%20%20%20%20%20i%20%3D%20i%20%2B%201″ message=”Capture 50 frames and stop – python” highlight=”” provider=”manual”/]

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

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

關閉攝影機

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

[pastacode lang=”python” manual=”%23%20Close%20the%20camera%0Azed.close()” message=”close the camera – python” highlight=”” provider=”manual”/]

更多範例

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

下一步

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

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

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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *