跳至內容
測試伺服器
開發伺服器

如何操作:使用 Sequencer 模式與 PyPylon 搭配 Basler 相機進行 HDR 成像#

本文說明如何使用 Basler 相機、Sequencer 模式以及 PyPylon SDK 來擷取並處理 HDR(高動態範圍)影像。內容涵蓋相機端的設定,以及在主機端使用 OpenCV 進行影像融合與色調映射。

本文雖是針對 ace 2 及boost R 相機所撰寫,但其中所述原則同樣適用於其他支援序列器功能的 Basler 相機。請根據您所使用的具體相機型號,適當地調整程式碼。

目標#

目標是利用相機內建的連拍功能,拍攝一系列曝光時間各異的影像,然後將這些影像合併成一張 HDR 影像,藉此提升陰影和高光處的細節。最終產出的是一張經過色調映射處理的影像,適合直接顯示或進行後續處理。

硬體與軟體需求#

硬體#

  • Basler 區域掃描相機(支援序列器模式)
  • 照明條件穩定,燈光不閃爍
  • 穩定畫面(固定攝影機位置與拍攝對象)

軟體#

  • Python 3.8 及以上版本
  • PyPylon Python 綁定
  • OpenCV (cv2)
  • NumPy
pip install pypylon opencv-python numpy

HDR 拍攝工作流程#

曝光序列設定#

相機已設定一組以微秒為單位的曝光時間清單:

exposure_times_us = [50, 500, 5000, 50000]

每次曝光時間都會載入到一個獨立的序列器組中。相機已設定為在每次觸發後自動循環切換這些組別。

關鍵步驟:

  • SequencerConfigurationMode = On
  • 僅當模組輸入確實連接至無法停止的來源時,才設定 ExposureTime 進行明確的生命週期管理即呼叫 SequencerSetNext
  • 設定 SequencerTriggerSource = ExposureStart
  • 儲存每組設定並退出設定模式

完成設定後,攝影機會在 Burst Mode:

camera.AcquisitionBurstFrameCount = len(exposure_times_us)
camera.TriggerSource = "Software"
camera.TriggerSelector = "FrameBurstStart"

擷取的影像會以 16 位元 TIFF 格式儲存至某個資料夾中(例如raw_image/),檔案名稱則以曝光時間編碼:img_5000us.tiff

HDR 影像處理#

逐步操作流程:#

  1. 從磁碟載入 16 位元 TIFF 檔案。
  2. 進行位移運算以萃取 12 位元數值。
  3. 將數值歸一化為 [0,1] 範圍內的 float32 型別。
  4. 套用三角權重函數。
  5. 計算輻照度圖。
  6. 使用 Reinhard 運算子的色調映射。
  7. 將結果儲存為 PNG 檔。

範例圖片#

以下輸入圖像是使用不同的曝光時間拍攝的:

Exposure Time Image
50 微秒
500 µs
5000 µs
50000 µs

HDR 融合效果#

經過最終色調映射處理後的影像,融合了所有曝光畫面中的細節:

色調映射後影像的結果

備註與建議#

  • 請確保所有曝光畫面中的相機位置與照明均保持不變。
  • Sequencer 設定將保留至相機關機或重置為止。
  • 如有需要,請使用 OpenCV 的 EXR 支援功能來儲存真正的 HDR(cv2.imwrite("output.exr", hdr_image))。
  • 對於彩色相機而言,還需要進行額外的去馬賽克與白平衡處理步驟。

疑難排解#

問題 原因 修正
GrabTimeout 曝光時間過長或每秒幀數(FPS)過低 增加超時時間
無 HDR 效果 曝光範圍過窄 採用更多元化的時段
檔案讀取錯誤 TIFF 檔案未寫入或路徑錯誤 檢查權限與資料夾

References#

返回知識文章