엔지니어링 · 2023
ICCD 카메라 시간분해 분광 계측 프로그램
게이트 타이밍을 바꿔 가며 영상과 스펙트럼을 기록하고 분석하는 Windows 데스크톱 앱
게이트 지연을 손으로 바꿔 가며 반복하던 시간분해 측정을, 타이밍 목록을 미리 정해 두면 순서대로 촬영하고 그때의 카메라 조건까지 데이터에 함께 담는 프로그램으로 만들었습니다. 촬영한 영상을 파장축 스펙트럼으로 바로 확인하고 내보내는 것까지 한 화면에서 합니다.
- 고객
- 비공개 고객
- 분야
- 엔지니어링

개요
PyCO는 PCO ICCD 카메라를 제어해 시간분해 영상과 분광 데이터를 기록하는 Windows 데스크톱 프로그램입니다. 나노초 단위로 게이트 지연과 노출을 바꿔 가며 촬영하고, 찍은 데이터를 그 자리에서 영상과 스펙트럼으로 확인하고, 필요한 구간만 골라 내보내는 것까지 한 프로그램 안에서 합니다.
방전이나 플라즈마처럼 짧은 시간에 빛이 났다가 사라지는 현상을 관측하는 실험에 쓰입니다. 카메라 제어, 측정 조건 기록, 파장 보정, 스펙트럼 확인을 각각 다른 도구로 하던 작업을 하나로 묶는 것이 목표였습니다.

과제
장비 제조사가 제공하는 소프트웨어는 카메라 자체는 다룰 수 있지만, 측정 과정을 다루지는 않습니다. 시간분해 측정을 하려면 사람이 그 사이를 메워야 했습니다.
- 시간분해 측정은 게이트 지연을 조금씩 옮겨 가며 같은 촬영을 반복하는 작업인데, 지연값을 매번 손으로 바꿔 넣고 촬영을 다시 걸어야 했습니다.
- 촬영에 쓴 노출, 지연, ROI, 증배관 전압 같은 조건이 영상과 따로 남아, 나중에 어떤 조건에서 찍은 데이터인지 맞춰 보는 일이 필요했습니다.
- 분광기에 붙여 쓰면 영상의 가로축이 픽셀입니다. 파장으로 보려면 데이터를 다른 도구로 옮겨야 했습니다.
- 카메라는 영상을 본체 메모리에 먼저 쌓습니다. 영상 크기와 장수를 잘못 잡으면 촬영을 시작한 뒤에 멈췄습니다.
해결 방법
측정의 흐름을 프로그램 쪽으로 옮겼습니다.
타이밍 목록으로 촬영
노출과 지연 쌍을 최대 10개까지 미리 적어 두면, 프로그램이 첫 타이밍으로 카메라를 맞추고 정해진 장수를 찍은 다음 스스로 다음 타이밍으로 넘어갑니다. 한 번 걸어 두면 목록이 끝날 때까지 사람이 손댈 일이 없습니다.

조건을 데이터에 붙여 저장
촬영이 시작될 때마다 그 시점의 노출, 지연, 트리거 모드, ROI, 비닝, 노이즈 필터, 증배관 전압, 게이팅 모드, 형광체 감쇠 시간, 그리고 분광 설정을 함께 읽어 영상 옆에 붙입니다. 저장 파일 하나에 영상과 조건이 같이 들어가므로, 나중에 파일만 열면 어떤 조건에서 찍은 것인지 바로 보입니다.
픽셀을 파장으로
알고 있는 파장의 선 몇 개를 픽셀 위치와 짝지어 넣으면, 1~4차 다항식으로 맞춰 가로축을 파장으로 바꿉니다. 맞춘 결과는 결정계수와 함께 그래프로 보여 줍니다.

촬영 중 안전장치
촬영을 걸기 전에 카메라가 담을 수 있는 장수를 먼저 확인하고, 요구 장수가 그보다 많으면 시작하지 않고 어느 값을 줄여야 하는지 로그에 적습니다. Safe Mode에서는 한 장씩 찍고 매번 포화를 확인해, 16비트 전체 범위의 95%를 넘는 화소가 있으면 경고를 띄우고 촬영을 멈춥니다.
분석과 내보내기
스펙트럼 위에 구간을 지정하면 Gaussian, Lorentzian, Voigt 중 하나로 선을 맞춰 중심 파장, 반치폭, 결정계수를 화면에 띄웁니다. 기준선은 1~4차 다항식 중에서 고릅니다. 결과는 영상과 스펙트럼을 PNG, JPEG, CSV로, 측정 조건을 CSV로 내보냅니다.

시스템 구조
한 프레임 안에 네 개의 패널을 나눠 놓고, 창 분할로 크기를 조절하는 단일 창 구조입니다.
- 상단 메뉴 패널 — 촬영 모드 버튼, 카메라 상태 표시등, 센서·본체·전원 온도
- 그림 패널 — VisPy 캔버스 두 개. 하나는 영상, 하나는 스펙트럼이며 영상만, 스펙트럼만, 둘 다 중에서 고릅니다
- 설정 패널 — 접히는 구역으로 나뉜 카메라 설정. 카메라 정보, 영상 정보, 촬영 장수, 타이밍, 영상 크기, 센서 제어, 증배관 제어
- 로그 패널 — 카메라 서술자, 설정 적용 결과, 촬영 진행 상황, 경고와 오류

데이터 흐름은 이렇습니다.
- 카메라 스캔 — SDK로 카메라를 열고 서술자를 읽어, 각 입력 칸의 최솟값·최댓값·증분을 장비가 실제로 받는 범위로 맞춥니다
- 설정 적용 — 패널의 값을 SDK 호출로 카메라에 씁니다
- 촬영 — 카메라 본체 메모리에 쌓은 뒤 호스트로 복사하고, 그 시점의 설정을 함께 읽어 붙입니다
- 표시 — ROI 안쪽 행을 평균해 1차원 스펙트럼으로 만들고, 보정식으로 가로축을 파장으로 바꿔 그립니다
- 저장과 내보내기 — 영상과 조건을 한 파일로 저장하거나, 선택한 구간만 이미지·CSV로 내보냅니다
구현
촬영 모드
용도에 따라 다섯 가지로 나뉩니다. Fixed Time은 한 타이밍에서 정해진 장수를 연속으로 찍습니다. Time Table은 목록을 따라 타이밍을 옮겨 가며 찍습니다. 두 모드에는 한 장씩 찍고 매번 확인하는 Safe Mode 짝이 있고, Live는 최근 N장만 남기며 계속 갱신합니다.
Lucky 모드는 Safe Mode 위에 얹은 것으로, 모든 화소가 기준값보다 낮은 영상은 신호가 없는 것으로 보고 버립니다. 발광이 드문드문 일어나는 실험에서 빈 영상이 메모리를 채우는 것을 막습니다. 건너뛴 장수는 로그에 함께 적습니다.
긴 작업과 UI
촬영 상태 확인, 카메라 건강 상태 확인, 여러 파일 불러오기는 각각 별도 스레드에서 돌고, 화면 갱신은 wx.CallAfter로 UI 스레드에 넘깁니다. 촬영 중에는 설정을 건드릴 수 없어야 하므로, 위젯을 세 묶음으로 나눠 카메라 없음·준비됨·촬영 중 세 상태에 따라 한꺼번에 켜고 끕니다.
장비 상태 읽기
카메라 건강 상태는 비트 플래그로 돌아옵니다. 전원 전압, 전원 온도, 본체 온도, 센서 온도, 외부 배터리, 오프셋 조정 범위의 경고 비트와, 거기에 인터페이스·RAM·메인보드·헤드보드 고장을 더한 오류 비트를 각각 풀어 사람이 읽을 수 있는 문장으로 로그에 남깁니다.
영상 표시
2048×2048까지 가는 16비트 영상을 끊김 없이 넘겨 보려면 일반적인 그리기로는 부족해서, VisPy의 GPU 캔버스를 썼습니다. 명암 범위는 자동 0~100%, 자동 10~90%, 수동 중에서 고르고, 색지도는 Grays, Viridis, HSL을 지원합니다. 마우스를 올리면 그 자리의 픽셀 번호와 값을, 스펙트럼에서는 픽셀 번호와 파장과 세기를 함께 보여 줍니다.
설정 보존
분광 설정과 타이밍 목록은 사용자 문서 폴더에 자동 저장되어, 다음에 프로그램을 켜면 그대로 돌아옵니다. 카메라를 다시 스캔할 때도 장비에 들어 있던 설정을 먼저 백업하고 초기화한 뒤 되돌려 놓아, 스캔 때문에 설정이 날아가지 않게 했습니다.

결과
측정 조건을 바꿔 가며 반복하던 작업을 목록 하나로 걸어 둘 수 있게 되었고, 촬영 중에는 진행 상황과 카메라 상태를 보면서 기다리면 됩니다.
어떤 조건에서 찍은 데이터인지를 따로 적어 두지 않아도 됩니다. 조건이 영상과 같은 파일에 들어 있으므로, 나중에 파일만 열면 그때의 설정이 그대로 보이고 같은 조건으로 다시 찍을 수 있습니다.
픽셀로 나오던 영상을 프로그램 안에서 파장축 스펙트럼으로 보고, 선 맞춤으로 중심 파장과 반치폭까지 확인한 뒤 필요한 것만 내보내게 되었습니다. 측정하고 눈으로 확인하는 과정이 한 화면 안에서 끝납니다.
사용 기술
- Python
- wxPython
- VisPy
- NumPy
- SciPy
- matplotlib
화면





진행하려는 프로젝트가 있으신가요?
해결하려는 문제와 지금 상황을 알려 주시면, 어떤 방식이 맞을지 함께 검토합니다.
프로젝트 문의하기