========================================================================
クラス設計 (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` を確認してスレッドセーフに呼び出す.