如何操作:使用 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
HDR 拍攝工作流程#
曝光序列設定#
相機已設定一組以微秒為單位的曝光時間清單:
每次曝光時間都會載入到一個獨立的序列器組中。相機已設定為在每次觸發後自動循環切換這些組別。
關鍵步驟:
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 影像處理#
逐步操作流程:#
- 從磁碟載入 16 位元 TIFF 檔案。
- 進行位移運算以萃取 12 位元數值。
- 將數值歸一化為 [0,1] 範圍內的 float32 型別。
- 套用三角權重函數。
- 計算輻照度圖。
- 使用 Reinhard 運算子的色調映射。
- 將結果儲存為 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 檔案未寫入或路徑錯誤 | 檢查權限與資料夾 |



