操作指南:使用 Sequencer 模式和 PyPylon 通过 Basler 相机进行 HDR 成像#
本文介绍了如何使用配有 Sequencer Mode 和 PyPylon SDK 的 Basler 相机采集和处理 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
HDR 采集工作流程#
曝光序列配置#
相机配置有一系列以微秒为单位的 Exposure Time:
每个 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 图像处理#
分步流程:#
- 从磁盘加载 16 位 TIFF。
- 进行位移操作以提取 12 位值。
- 归一化为 [0,1] 范围内的 float32。
- 应用三角形权重函数。
- 计算辐射图。
- 使用 Reinhard 算子进行色调映射。
- 将结果保存为 PNG。
示例图像#
以下输入图像使用不同的 Exposure Time 捕获:
| Exposure Time | 图像 |
|---|---|
| 50 µs | ![]() |
| 500 µs | ![]() |
| 5000 µs | ![]() |
| 50000 µs | ![]() |
HDR 融合结果#
最终经过色调映射的图像结合了所有曝光的细节:

注意事项和建议#
- 确保在所有曝光过程中相机位置和光照保持固定。
- Sequencer 设置将一直保留,直到相机断电或重置。
- 如果需要,使用 OpenCV EXR 支持保存真正的 HDR (
cv2.imwrite("output.exr", hdr_image))。 - 对于彩色相机,需要进行额外的去马赛克和白平衡步骤。
故障排除#
| 问题 | 原因 | 解决方法 |
|---|---|---|
| GrabTimeout | Exposure Time 太长或 FPS 太低 | 增加超时时间 |
| 无 HDR 效果 | Exposure Time 范围太窄 | 使用更多样化的时间 |
| 文件读取错误 | TIFF 文件未写入或路径错误 | 请检查权限和文件夹 |



