방법: Sequencer 모드와 PyPylon을 사용하여 Basler 카메라로 HDR 이미징 구현하기#
이 문서는 Sequencer Mode 및 PyPylon SDK를 사용하는 Basler 카메라로 HDR (High Dynamic Range) 이미지를 획득하고 처리하는 방법을 설명합니다. 카메라 측 설정과 OpenCV를 사용한 호스트 측 이미지 융합 및 톤 매핑을 모두 다룹니다.
이 도큐먼트는 ace 2 및 boost R 카메라를 기준으로 작성되었으나, 시퀀서 기능을 지원하는 다른 Basler 카메라에도 동일한 원리가 적용됩니다. 특정 카메라 모델에 맞게 코드를 적절히 수정하여 사용하십시오.
목적#
목표는 카메라의 내장 시퀀서를 사용하여 노출 시간이 다른 일련의 이미지를 캡처한 다음, 이를 병합하여 암부와 명부의 디테일이 향상된 단일 HDR 이미지를 생성하는 것입니다. 결과물은 디스플레이나 추가 처리에 적합한 톤 매핑된 이미지입니다.
하드웨어 및 소프트웨어 요구 사항#
하드웨어#
- Basler 영역 스캔 카메라(Sequencer mode 지원)
- 안정적인 조명 조건, 깜박이는 조명 없음
- 안정적인 장면(고정된 카메라 위치 및 대상)
소프트웨어#
- Python 3.8+
- PyPylon Python 바인딩
- OpenCV (cv2)
- NumPy
HDR 캡처 워크플로#
Exposure Sequence 설정#
카메라는 마이크로초 단위의 Exposure Time 목록으로 구성됩니다.
각 Exposure Time은 별도의 시퀀서 세트에 로드됩니다. 카메라는 각 트리거 후에 이러한 세트를 자동으로 순환하도록 설정됩니다.
주요 단계:
SequencerConfigurationMode = On- 설정
ExposureTime및SequencerSetNext - 구성
SequencerTriggerSource = ExposureStart - 각 세트를 저장하고 구성 모드 종료
일단 설정되면 카메라는 Burst Mode에서 트리거됩니다:
camera.AcquisitionBurstFrameCount = len(exposure_times_us)
camera.TriggerSource = "Software"
camera.TriggerSelector = "FrameBurstStart"
캡처된 이미지는 노출 시간이 파일 이름에 인코딩된 상태로(img_5000us.tiff) 폴더(예: raw_image/)에 16비트 TIFF 형식으로 저장됩니다.
HDR 이미지 처리#
단계별 프로세스:#
- 디스크에서 16비트 TIFF를 로드합니다.
- 비트 시프트하여 12비트 값을 추출합니다.
- [0,1] 범위의 float32로 정규화합니다.
- 삼각형 가중치 함수를 적용합니다.
- 휘도 맵을 계산합니다.
- Reinhard 연산자로 톤 매핑합니다.
- 결과를 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가 기록되지 않았거나 경로가 잘못되었습니다. | 권한 및 폴더를 확인하십시오. |



