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