# クラス設計 (Class Design)

## クラス一覧 (Class Overview)

**CameraBase（抽象基底クラス）**

- ファイル: `Cameras/CameraBase.cs`
- カメラに共通する処理をまとめた抽象クラス．
- IScam・Lucam の両方が継承する．
- チャート検出・色補正・ファイル I/O はそれぞれ `ChartDetector`・`ColorCorrector`・`IoUtil` に委譲する．

**IScam**

- ファイル: `Cameras/IScam.cs`
- ImagingSource カメラ（DFK33UX178，DFK23UX249）の実装．
- IC Imaging Control SDK（`TIS.Imaging`）を使用する．

**Lucam**

- ファイル: `Cameras/Lucam.cs`
- Lumenera カメラ（Lw110）の実装．
- Lumenera SDK（`lumenera.api.dll`）を使用する．

**Form1**

- ファイル: `UI/Form1.cs`
- メインウィンドウ．UI イベントの受け取りとカメラ・光源の操作を担う．

**PreviewMonitor**

- ファイル: `UI/PreviewMonitor.cs`
- サブモニタへのプレビュー表示フォーム．

**Config（静的クラス）**

- ファイル: `Config.cs`
- `config.xml` の読み込みユーティリティ．
- XPath を使って文字列・整数・浮動小数点数の値を取得する．

**LightSource**

- ファイル: `LightSource.cs`
- シリアル通信（USB-シリアル変換）による光源の ON/OFF 制御．

**ChartDetector**

- ファイル: `ChartDetection/ChartDetector.cs`
- ArUco マーカーによるチャート検出・ホモグラフィ計算・24色票の ROI マスク生成．
- `CameraBase` から委譲される．

**ColorCorrector**

- ファイル: `ColorCorrection/ColorCorrector.cs`
- TCC 変換行列の計算（次元拡張・SVD）と画像の色変換（RGB→sRGB）．
- `CameraBase` から委譲される．変換行列はチャネル数をキーとした辞書（`_convRGB2SRGB`）で保持する．

**IoUtil（静的クラス）**

- ファイル: `Utils/IoUtil.cs`
- ファイル I/O（CSV 読み書き・保存フォルダ生成・撮影情報出力）とサウンド再生．状態を持たない．
- `CameraBase` から委譲される．

## 継承関係 (Inheritance)

```text
CameraBase（抽象）
├── IScam       ← ImagingSource カメラ
└── Lucam       ← Lumenera カメラ
```

## CameraBase の主なメンバ (CameraBase Members)

### 抽象メソッド（派生クラスで実装する）

- `Connect() : bool`: カメラに接続する
- `Disconnect()`: カメラを切断する
- `Shot(numImages, interval)`: 撮影処理

### 公開メソッド

- `ShotOne()`: 1枚撮影
- `ShotMulti()`: 連続撮影

### 保護メソッド（派生クラスから呼ぶ）

- `BootCheck() : bool`: 起動時の前提条件チェック（設定・TCC参照ファイル）
- `DetectChart(img)`: チャート検出（`ChartDetector` に委譲）
- `CalcTcc(img)`: TCC 変換行列の計算・保存（`ColorCorrector` に委譲）
- `ProcessCalibrationFrame(img)`: プレビュー/校正フローの共通骨格（テンプレートメソッド）
- `RunShotLoop(numImages, interval)`: 撮影ループの共通骨格（テンプレートメソッド）
- `SaveImages(img, idx)`: 撮影画像の保存（RGB・sRGB 変換画像．色変換は `ColorCorrector` に委譲）
- `SaveThread(numImages)`: 画像保存スレッド処理
- `GetRatio(value, target) : float`: ゲイン更新比率の計算

### 主なフィールド

- `_calibrating`: キャリブレーション残りフレーム数（0 で完了）
- `_calibrated`: キャリブレーション完了フラグ
- `_chartMasks`: 24色票の ROI マスクリスト
- `_roi`: ROI 矩形（IScam のみ使用）
- `_shots`: 撮影済み画像バッファ（`BlockingCollection<Mat>`．撮影スレッドと保存スレッドの受け渡しに使用）

## Form1 とカメラの関係 (Form1 and Camera)

- Form1 は `CameraBase` 型の `_camera` フィールドを持つ．
- 起動時に Lucam → IScam の順で接続を試みる（詳細は `TECH_02` 参照）．
- UI スレッドとカメラスレッドをまたぐメソッド（`ShowMessage`，`EnableShots` 等）は `InvokeRequired` を確認してスレッドセーフに呼び出す．
