Skip to content

Latest commit

 

History

History
681 lines (522 loc) · 21.3 KB

USAGE.md

File metadata and controls

681 lines (522 loc) · 21.3 KB

PCO FLIM 相機使用手冊

買了這台相機,照著這份文件操作就行。


目錄

  1. 硬體安裝與第一次連線
  2. 軟體安裝
  3. 第一天:拍下第一張影像
  4. 離線參數規劃(沒相機也能做)
  5. FLIM 實驗工作流程
  6. 實驗設計與資料管理
  7. 影像排列順序
  8. 故障排除

1. 硬體安裝與第一次連線

1.1 開箱檢查

項目 說明
PCO FLIM 相機本體 確認型號(如 pco.flim)
USB 3.0 傳輸線 藍色接頭(USB 3.0 Type-B 或 Type-C)
電源供應器 12V DC 變壓器
電源線 依地區規格
(選配)水冷管線 若搭配 pco.aquamatic III 水冷系統

1.2 連接步驟

Step 1: 電源供應器接上相機 DC IN,另一端插市電
Step 2: USB 3.0 線接上相機與電腦(用 USB 3.0 埠)
Step 3: (選配)水冷系統連接相機 IN/OUT 接頭
Step 4: 按相機電源開關

1.3 確認相機狀態

相機面板 LED 指示燈:

LED 顏色 狀態
藍燈恆亮 電源正常,待命中
綠燈閃爍 正在擷取影像
黃燈 感測器冷卻中(開機初期正常)
紅燈 錯誤(過熱或硬體故障)

開機後等 5-10 分鐘,讓感測器冷卻到目標溫度(低於 5°C 比較好)。

1.4 Windows 驅動確認

# 開啟裝置管理員,確認以下項目:
# 展開「相機」或「影像裝置」→ 應看到 "pco.flim"
# 若出現黃色驚嘆號,表示驅動沒裝好

pip install pco 會自動裝 Windows 驅動 DLL(sc2_cam.dll)。 若裝置管理員出現未辨識裝置,重執行:

pip uninstall pco -y && pip install pco

2. 軟體安裝

2.1 系統需求

項目 需求
作業系統 Windows 10/11 64-bit(PCO SDK 只支援 x64)
Python 3.10 或更新版本(64-bit)
VC++ Redistributable 2015 以上(下載)
USB 埠 USB 3.0(建議)或 USB 2.0

2.2 安裝 Python

# 從 python.org 下載
# https://www.python.org/downloads/
# → 下載 Windows x64 installer
# → 務必勾選 "Add Python to PATH"
# → 安裝完成後驗證:
python --version
# 預期輸出: Python 3.10.x 或 3.11.x

2.3 安裝此專案

# 1. 進入專案目錄
cd PCO-FLIM_camera_control

# 2. 建立虛擬環境
python -m venv venv

# 3. 啟動虛擬環境
# Windows PowerShell:
.\venv\Scripts\Activate.ps1
# 若出現執行原則錯誤,先執行:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned

# Windows cmd:
# .\venv\Scripts\activate.bat

# 4. 安裝依賴套件
pip install -r requirements.txt

# 5. 安裝 pco_flim 套件(開發模式,讓 import 可以找到)
pip install -e .

# 6. (選配)TIFF 儲存支援
pip install tifffile

2.4 驗證安裝(沒相機也能測)

# 測試 pco_flim 匯入(不需要相機)
python -c "from pco_flim import FLIMCamera, list_cameras; print('套件匯入成功')"

# 偵測相機(沒接相機時回傳 {},這正常)
python -c "from pco_flim import list_cameras; print(list_cameras())"
# 輸出: {}  ← 沒找到相機,但不影響學習參數設定

3. 第一天:拍下第一張影像

帶你從開機到成功取得第一張 FLIM 影像。

3.1 開機與冷卻

# 1. 確定相機已開機(藍燈恆亮)
# 2. 等 5 分鐘讓感測器降溫
# 3. 執行溫度檢查:
python -c "
from pco_flim import FLIMCamera
with FLIMCamera() as cam:
    info = cam.get_info()
    temp = info.get('temperature', {})
    if isinstance(temp, dict):
        print(f'感測器溫度: {temp.get(\"sensor temperature\", \"N/A\")}°C')
        print(f'機身溫度: {temp.get(\"camera temperature\", \"N/A\")}°C')
"
# 理想: 感測器 < 5°C

3.2 第一張快拍(非 FLIM)

先確認相機能正常拍攝,再進入 FLIM 模式:

python examples/01_basic_capture.py

預期輸出:

==================================================
  PCO FLIM 基本連線與快拍
==================================================
==================================================
  相機型號:pco.flim
  序號:XXXXX
  介面:USB 3.0
  ...
==================================================

設定參數:曝光 10 ms, ROI 512×512

正在擷取影像...

影像資訊:
  形狀 (H, W):(512, 512)
  資料型別:uint16
  像素值範圍:[100, 45000]
  平均值:8200.5

訊號強度在理想範圍內!

遇到問題,§8 故障排除 有解法。

3.3 即時預覽(Live View)

確認快拍成功後,試試即時影像串流:

python examples/03_flim_live_view.py

操作方式:

  • 按 q 退出預覽
  • 按 s 儲存當前幀為 TIFF

影像太暗,加大曝光時間;太亮(飽和),減少曝光時間或降低光源。

3.4 第一次 FLIM 擷取

用標準 4 相位設定(最常用的起點):

python examples/02_flim_4phase.py

預期輸出(最後幾行):

FLIM 4 相位擷取與分析完成!

此腳本會:

  1. 設定 20 MHz 調變頻率、正弦波
  2. 設定 4 相位 + singular + both
  3. 自動 ArmCamera
  4. 擷取 4 張相位影像
  5. 計算 Phasor G, S
  6. 計算螢光壽命 τ_φ, τ_m
  7. 繪製視覺化圖表

壽命值驗證:若用 Fluorescein 標準片(4.0 ns),測得 τ ≈ 3.5-4.5 ns 代表系統正常。

3.5 第一天結束 Checklist

項目 完成?
相機可開機、LED 狀態正常 ☐
list_cameras() 回傳非空 ☐
basic_capture.py 顯示影像 ☐
live_view.py 即時串流流暢 ☐
flim_4phase.py 算出合理壽命 ☐
感測器溫度低於 5°C ☐

4. 離線參數規劃(沒相機也能做)

沒相機的電腦上也能先規劃參數。等接上相機後直接套用。

4.1 查詢影像排列順序

from pco_flim import describe_order, PHASE_4, TAP_BOTH

info = describe_order(PHASE_4, tap_select=TAP_BOTH)
print(f"SDK 輸出順序: {info['sdk_order_str']}")
print(f"重排後順序:  {info['target_order_str']}")
print(f"影像張數:    {info['n_images']}")

完整對照表見 IMAGE_ORDER.md。

4.2 了解可用參數

from pco_flim import (
    PHASE_2, PHASE_4, PHASE_8, PHASE_16,   # 相位數
    TAP_BOTH, TAP_A, TAP_B,                 # Tap 選擇
    SYMMETRY_SINGULAR, SYMMETRY_TWICE,      # 對稱性
    MOD_SOURCE_INTERNAL, MOD_SOURCE_EXTERNAL, # 調變來源
    WAVEFORM_SINUSOIDAL, WAVEFORM_RECTANGULAR, # 波形
)
from pco_flim.presets import (
    FLIM_4PHASE_DEFAULT,
    FLIM_FRET,
    FLIM_OXYGEN_SENSING,
    FLIM_HIGH_SPEED_2PHASE,
    FLIM_8PHASE_PRECISE,
)

4.3 預先寫好擷取腳本

# my_flim_experiment.py — 可先寫好,有相機再執行
from pco_flim import FLIMCamera

# ============================================
# 實驗參數設定區(先在此規劃)
# ============================================
EXPOSURE = 0.01          # 曝光時間 [秒]
ROI = (1, 1, 512, 512)   # ROI
FREQUENCY = 20e6         # 調變頻率 [Hz]
N_IMAGES = 4             # 4 phases × singular × both = 4 張

print("=== 實驗設定摘要 ===")
print(f"  曝光: {EXPOSURE*1000:.0f} ms")
print(f"  頻率: {FREQUENCY/1e6:.0f} MHz")

with FLIMCamera() as cam:
    cam.print_info()
    cam.set_exposure(EXPOSURE)
    cam.set_roi(*ROI)
    cam.set_flim_4phase(FREQUENCY)
    images = cam.capture(N_IMAGES)
    print(f"擷取完成: {images.shape}")

4.4 參數決定流程

你的實驗樣本是什麼?
       │
       ▼
┌─────────────────────────────────────┐
│ 螢光壽命大約多少?                    │
│ (查文獻或先測標準片)                  │
└──────────┬──────────────────────────┘
           │
           ▼
┌─────────────────────────────────────┐
│ 計算最佳調變頻率                      │
│ f_opt = 1 / (2πτ)                   │
│                                     │
│ τ = 4 ns   → 40 MHz                 │
│ τ = 10 ns  → 16 MHz                 │
│ τ = 100 ns → 1.6 MHz                │
└──────────┬──────────────────────────┘
           │
           ▼
┌─────────────────────────────────────┐
│ 選擇相位數 (影響影像張數)             │
│                                     │
│ 快速掃描 → 2 相位(2 張)             │
│ 標準 FLIM → 4 相位(4 張)推薦       │
│ 多成分分析 → 8 相位(8 張)           │
│ 精細分布 → 16 相位(16 張)           │
└──────────┬──────────────────────────┘
           │
           ▼
┌─────────────────────────────────────┐
│ 選擇曝光時間                          │
│ (目標: 滿幅的 68-72%)                │
│ 起點: 10 ms (4-phase FLIM)           │
│ 太暗 → 增加曝光                       │
│ 飽和 → 減少曝光或降低光源              │
└─────────────────────────────────────┘

4.5 常用參數組合

應用場景 頻率 相位數 張數 曝光起點 備註
標準 FLIM 起點 20 MHz 4 4 10 ms 通用,先試這個
FRET 測量 40 MHz 4 8 (twice) 10 ms 短壽命,高頻
氧氣感測 5 MHz 4 4 50 ms 長壽命,低頻
快速掃描 20 MHz 2 2 5 ms 犧牲解析度換速度
多成分分析 20 MHz 8 16 (twice) 10 ms 需要較多光子
校準 (Fluorescein) 5-40 MHz 4 4 10 ms 掃描所有頻率

5. FLIM 實驗工作流程

5.1 標準 4 相位流程

Step 1: 開機 → 等冷卻(5-10 分鐘)
Step 2: 設定曝光 → set_exposure(0.01)
Step 3: 設定調變 → set_flim_modulation(source=0, waveform=1, frequency=20e6)
Step 4: 設定相位 → set_flim_phase_sequence(phase_number=2, ...)
Step 5: ArmCamera → arm()               ← 最關鍵
Step 6: 擷取影像 → capture(4)
Step 7: 計算 Phasor → compute_phasor(images)
Step 8: 計算壽命 → compute_lifetime_from_phasor(g, s, 20e6)

5.2 參數設定順序(不可顛倒)

with FLIMCamera() as cam:
    # 1. 一般參數(先設定,即時生效)
    cam.set_exposure(0.01)
    cam.set_roi(1, 1, 512, 512)

    # 2. FLIM 調變參數(即時生效)
    cam.set_flim_modulation(source=0, waveform=1, frequency=20e6)

    # 3. FLIM 相位序列參數(需 ArmCamera)
    cam.set_flim_phase_sequence(phase_number=2, symmetry=0, tap_select=0)

    # 4. ArmCamera(必須!否則 FLIM 參數不生效)
    cam.arm()

    # 5. 擷取
    images = cam.capture(4)

5.3 ArmCamera 的重要性

pco.flim 用 FPGA 產生調變訊號與控制相位序列。改參數後:

你的 Python 程式             相機 FPGA
    │                           │
    ├─ set_flim_modulation()    │ 參數暫存在暫存器
    ├─ set_flim_phase_sequence()│ 參數暫存在暫存器
    │                           │
    ├─ arm()  ────────────────► │  參數寫入 FPGA!
    │                           │
    ├─ capture(4)              │  用新參數拍攝

忘記 arm() → 相機用舊參數拍攝 → 拿到錯的順序或頻率 → 算出的壽命完全錯誤。

5.4 實驗注意事項

訊號強度控制:

  • FLIM 的理想訊號強度為滿幅的 68-72%(約 44600-47200 counts for 16-bit)
  • 低於此範圍 → 增加曝光時間或光源強度
  • 高於此範圍(飽和)→ 減少曝光時間或降低光源強度
  • 01_basic_capture.py 會自動提示強度是否在理想範圍

溫度控制:

  • 感測器溫度應低於 5°C 以獲得最佳 SNR
  • 開機後等 5-10 分鐘讓 cooler 穩定
  • 用 cam.check_temperature_stable() 確認
  • 若溫度持續過高:檢查風扇是否運轉、水冷系統是否正常

校準:

  • 用已知螢光壽命的標準片(如 Fluorescein, τ ≈ 4.0 ns)
  • 進行多頻率掃描(5-40 MHz)驗證系統一致性
  • 見 examples/04_modulation_sweep.py

6. 實驗設計與資料管理

6.1 檔案命名慣例

建議這樣命名,方便日後查找:

{樣本}_{條件}_{日期}_{流水號}.tif

例如:
fluorescein_ph7.4_20260610_001.tif
cells_fret_40MHz_20260611_001.tif
oxygen_sensor_5MHz_20260612_001.tif

6.2 Metadata 管理

方法一:用 tifffile 在 TIFF 中嵌入 metadata(見範例 5):

import tifffile
tifffile.imwrite("output.tif", images, metadata={
    "description": "FLIM 4-phase measurement",
    "acquisition": {
        "frequency_hz": 20e6,
        "exposure_time_s": 0.01,
    },
})

方法二:將實驗參數另存為 JSON(與 TIFF 放同目錄):

{
    "sample": "Fluorescein pH 7.4",
    "date": "2026-06-10",
    "camera": "pco.flim",
    "settings": {
        "exposure_time_s": 0.01,
        "frequency_hz": 20000000,
        "phase_number": 4,
        "symmetry": "singular",
        "tap_select": "both"
    },
    "results": {
        "tau_phi_mean_ns": 4.02,
        "tau_mod_mean_ns": 4.15
    }
}

6.3 每天開始實驗前

☐ 開啟相機電源
☐ 確認冷卻溫度 < 5°C
☐ 執行 basic_acq.py 確認相機正常
☐ 設定今日實驗的 flim_config.json
☐ (每週)執行 Fluorescein 標準片校準

6.4 校準週期

頻率 目的
每次實驗前 快速確認(單張快拍 + 4-phase FLIM)
每週 Fluorescein 標準片頻率掃描(5-40 MHz)
每月 完整校準(含 dark noise、flat field)

6.5 與 MicroManager 的操作差異

本專案除了自行開發的 Python SDK,這台 PCO FLIM 相機也能透過 MicroManager(μManager) 搭配內建 PCO_Camera device adapter 操作。以下是兩者差異與已知問題。

6.5.1 操作方式對比

面向 Python SDK(本專案) MicroManager 2.0
安裝難度 pip install -e . 一行完成 需裝 μManager + PCO adapter + Java
使用者介面 文字終端機 / Python 腳本 圖形化 GUI
FLIM 參數控制 set_flim_4phase(20e6) 一行搞定 需透過 Device Properties 面板逐項設定
即時顯示 需自行寫 OpenCV(範例 03) 內建 Live View
Phasor 分析 內建 compute_phasor() 需額外裝 FLIMJ plugin(ImageJ)
自動化批次 腳本迴圈即可 無內建批次
影像排列順序 capture(reorder=True) 自動處理 需自行留意 SDK 原始順序
Crash 穩定性 穩定(已驗證) 有已知問題(見下方)

6.5.2 MicroManager 已知 crash 問題

以下問題經由分析本機 MicroManager 2.0 安裝(mmgr_dal_PCO_Camera.dll v2.0.0.59,2021 年 7 月建置)與 JVM crash log 確認。

症狀: MicroManager 在初始化 PCO 相機時不定期 shutdown,無錯誤訊息直接消失。

根因:

mmgr_dal_PCO_Camera.dll v2.0.0.59 的 NULL pointer bug:
  1. 呼叫 PCO_OpenCamera() 失敗(錯誤碼 35,通訊失敗)
  2. 回傳值未檢查 → 拿到 NULL handle
  3. 把 NULL handle 傳給下一支 API
  4. EXCEPTION_ACCESS_VIOLATION → JVM 崩潰 → 整個程式 shutdown

Crash log 中明確記錄:
  [ERR,Core:dev:pco_camera] Error in device "pco_camera":
    Unable to communicate with the device. (35)
  下一行就是 Access Violation。

為什麼 Python SDK 不會 crash?

# Python pco 套件在每支 C API 呼叫後都檢查回傳值
# 失敗時拋出 Exception,可以被 try/except 接住
# 而且 pip install pco 確保 SDK DLL 版本與 wrapper 完全匹配

try:
    with pco.Camera() as cam:   # 內部呼叫 PCO_OpenCamera()
        pass
except Exception as e:
    print(f"相機連線失敗: {e}")  # 乾淨的錯誤訊息,不會 crash

如果你仍然需要使用 MicroManager,建議:

  1. 先開相機電源,等待 30 秒,再開啟 MicroManager(避免觸發 NULL pointer bug)
  2. 不要在 Live 模式下調整參數(可能觸發 JNI race condition)
  3. 不要透過 Hardware Configuration Wizard 重新初始化已連接的裝置
  4. 如果需要穩定的 FLIM 控制,建議以本專案的 Python SDK 為主

6.5.3 建議

兩種工具是互補關係,不是競爭關係:

用途 建議工具
第一次連線測試、Quick look MicroManager(先開相機)
例行標準化 FLIM 測量 本專案的 Python SDK
自動化批次實驗(>10 個樣本) 本專案的 Python SDK
開發新的 FLIM 分析方法 本專案的 Python SDK
需要圖形化介面的日常操作 MicroManager(注意開機順序)

Python SDK 完全穩定、可自動化、可客製化,建議作為主要的 FLIM 控制方案。 MicroManager 可留作輔助工具,但需注意其 device adapter 的已知問題。


7. 影像排列順序

7.1 核心概念

pco.flim 的 Dual Tap 感測器在每次曝光中同時讀出兩個通道:

Double Image #1: A(0°) + B(180°)
Double Image #2: A(90°) + B(270°)

SDK 輸出: [A(0°), B(180°), A(90°), B(270°)]  ← A/B 交錯
重排後:   [A(0°), A(90°), B(180°), B(270°)]  ← 升冪 (0°→360°)

7.2 查詢任何設定的排列順序

from pco_flim import describe_order, PHASE_4, TAP_BOTH, SYMMETRY_TWICE

# 標準設定
info = describe_order(PHASE_4, tap_select=TAP_BOTH)
print(info["sdk_order_str"])      # [A@0°, B@180°, A@90°, B@270°]
print(info["target_order_str"])   # [A@0°, A@90°, B@180°, B@270°]
print(info["permutation"])        # [0, 2, 1, 3]

# Twice 模式(8 張)
info = describe_order(PHASE_4, SYMMETRY_TWICE, tap_select=TAP_BOTH)
print(info["sdk_order_str"])      # [A@0°, B@180°, A@90°, B@270°, A@180°, B@0°, ...]
print(info["target_order_str"])   # [A@0°, B@0°, A@90°, B@90°, ...]

7.3 離線展示

python examples/00_reorder_demo.py

完整對照表(2/4/8/16-phase × 所有參數組合)見 IMAGE_ORDER.md。


8. 故障排除

8.1 安裝問題

問題 可能原因 解決方案
pip install pco 失敗 缺少 VC++ Redistributable 安裝 VC++ Redistributable
ImportError: DLL load failed Python 非 64-bit 或 DLL 損毀 確認 python -c "import struct; print(struct.calcsize('P')*8)" 輸出 64
No module named 'pco' pco 未安裝 pip install pco

8.2 連線問題

問題 可能原因 解決方案
No camera found USB 未連接或驅動問題 檢查 USB 線、重新安裝 pco、檢查裝置管理員
相機在裝置管理員有驚嘆號 驅動未正確安裝 pip uninstall pco -y && pip install pco
list_cameras() 回傳 {} 相機未開機 / USB 不通 確認電源 LED、換 USB 埠、換線

8.3 影像問題

問題 可能原因 解決方案
影像全黑 曝光不足、光源未開 增加曝光時間、開啟光源、檢查快門
影像全白(飽和) 曝光過度 減少曝光時間、降低光源強度、加 ND 濾鏡
影像有條紋 電源干擾 確認電源穩定、檢查 USB 線屏蔽
影像雜訊過高 溫度過高 等 cooler 降溫至 < 5°C
感測器溫度降不下來 風扇故障 / 水冷問題 檢查風扇運轉、水冷幫浦、室溫

8.4 FLIM 參數問題

問題 可能原因 解決方案
Phasor 值異常 順序錯誤 / 忘記 reorder 確認 capture(reorder=True)
ArmCamera 失敗 頻率超出硬體限制 確認頻率在 5 kHz~40 MHz
壽命隨頻率變化 多成分樣本(正常!) 用多頻率分析,非硬體問題
不同頻率壽命不一致 系統未校準 執行 Fluorescein 標準片掃描

8.5 API 探索

若遇到 AttributeError(方法名稱不匹配),可用以下方式探索 SDK 實際 API:

import pco
with pco.Camera() as cam:
    print("=== cam 屬性 ===")
    print([a for a in dir(cam) if not a.startswith('_')])
    print("\n=== cam.sdk 方法 ===")
    print([a for a in dir(cam.sdk) if not a.startswith('_')])

8.6 偵錯模式

import logging
logging.basicConfig(level=logging.DEBUG)
# 或只針對 pco_flim
logging.getLogger("pco_flim").setLevel(logging.DEBUG)

8.7 環境驗證腳本

python deployment/scripts/verify_environment.py

此腳本會檢查:Python 版本、套件安裝、DLL 存在、設定檔完整性。