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

如何使用 Sequencer Mode 和 PyPylon 透過 Basler 相機進行 HDR 拍攝#

本文說明如何使用具備 Sequencer Mode 的 Basler 相機與 PyPylon SDK 來擷取與處理 HDR (High Dynamic Range) 影像。內容涵蓋相機端的設定,以及使用 OpenCV 進行主機端的影像融合與色調對應。

本文針對 ace 2 和 boost R 相機編寫,但其原理也適用於其他支援 Sequencer 功能的 Basler 相機。請根據您的特定相機型號適當調整程式碼。

目標#

其目標是利用相機內建的 Sequencer 拍攝一系列具有不同 Exposure Time 的影像,然後將其合併為單一 HDR 影像,以改善陰影和高光處的細節。最終結果是適合顯示或進一步處理的色調對應影像。

硬體與軟體需求#

硬體#

  • Basler 面陣相機(支援 Sequencer Mode)
  • 穩定的照明條件,無燈光閃爍
  • 穩定的場景(固定的相機位置與目標)

軟體#

  • Python 3.8+
  • PyPylon Python 綁定
  • OpenCV (cv2)
  • NumPy
pip install pypylon opencv-python numpy

HDR 擷取工作流程#

Exposure Sequence Configuration#

相機已設定一組微秒單位的 Exposure Time 清單:

exposure_times_us = [50, 500, 5000, 50000]

每個 Exposure Time 都會載入至獨立的 Sequencer set 中。相機已設定為在每次觸發後自動循環切換這些 set。

關鍵步驟:

  • SequencerConfigurationMode = On
  • 設定 ExposureTime 和 SequencerSetNext
  • 設定 SequencerTriggerSource = ExposureStart
  • 儲存每個 set 並退出組態模式

設定完成後,相機會以 Burst Mode 觸發:

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

擷取的影像會以 16 位元 TIFF 格式儲存至資料夾(例如 raw_image/),檔案名稱中會編碼其 Exposure Time:img_5000us.tiff

HDR 影像處理#

逐步流程:#

  1. 從磁碟載入 16 位元 TIFF。
  2. 進行位元位移以擷取 12 位元數值。
  3. 將 [0,1] 範圍正規化為 float32。
  4. 套用三角形權重函數。
  5. 計算明亮度圖 (radiance map)。
  6. 使用 Reinhard 運算子進行色調對應。
  7. 將結果儲存為 PNG。

範例影像#

以下輸入影像是在使用不同的 Exposure Time 情況下擷取的:

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

HDR 融合結果#

最終經過色調對應的影像結合了所有曝光的細節:

色調對應影像結果

注意事項與建議#

  • 確保所有曝光期間的相機位置和光源維持固定。
  • Sequencer 設定將會保留,直到相機關機或重設為止。
  • 如有需要,可使用 OpenCV EXR 支援來儲存真實的 HDR(cv2.imwrite("output.exr", hdr_image))。
  • 對於彩色相機,則需要額外的去馬賽克與白平衡步驟。

故障排除#

問題 原因 修復
GrabTimeout 曝光時間過長或 FPS 過低 增加逾時時間
無 HDR 效果 曝光範圍過窄 使用更多樣化的時間
檔案讀取錯誤 TIFF 未寫入或路徑錯誤 檢查權限與資料夾

參考資料#

返回知識文章