# クラス設計 (Class Design)

## 1. クラス一覧 (Class Overview)

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

- ファイル: `CameraBase.cs`
- カメラに共通する処理をまとめた抽象クラス．
- IScam・Lucam の両方が継承する．

**IScam**

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

**Lucam**

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

**Form1**

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

**PreviewMonitor**

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

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

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

**LightSource**

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

## 2. 継承関係 (Inheritance)

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

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

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

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

### 3-2. 公開メソッド

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

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

- `BootCheck() : bool`: 起動時の前提条件チェック（設定・TCC参照ファイル）
- `DetectChart(img)`: ArUco マーカーによるチャート検出
- `CalcTcc(img)`: TCC 変換行列の計算・保存
- `ConvertImage(src, conv) : Mat`: 画像の色変換
- `SaveThread(numImages)`: 画像保存スレッド処理
- `GetRatio(value, target) : float`: ゲイン更新比率の計算

### 3-4. 主なフィールド

- `_calibrating`: キャリブレーション残りフレーム数（0 で完了）
- `_calibrated`: キャリブレーション完了フラグ
- `_chartMasks`: 24色票の ROI マスクリスト
- `_convRGB2SRGB`: 次元数をキーとした RGB→sRGB 変換行列の辞書
- `_roi`: ROI 矩形（IScam のみ使用）
- `_shots`: 撮影済み画像バッファ

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

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