diff --git "a/docs/02_ENV/ENV_01_\351\226\213\347\231\272\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" "b/docs/02_ENV/ENV_01_\351\226\213\347\231\272\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" index ff098cb..975f2fe 100644 --- "a/docs/02_ENV/ENV_01_\351\226\213\347\231\272\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" +++ "b/docs/02_ENV/ENV_01_\351\226\213\347\231\272\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" @@ -1,8 +1,8 @@ # 開発環境構築手順 (Development Environment Setup) -## 1. セットアップ方法の選択 (Setup Method) +## セットアップ方法の選択 (Setup Method) -### 1-1. 自動セットアップ(推奨) +### 自動セットアップ(推奨) リポジトリルートの `setup.ps1` を使用することで,Visual Studio のインストール,データフォルダの作成,NuGet パッケージの復元を自動化できる. @@ -28,7 +28,7 @@ ``` 5. スクリプト完了後,IC Imaging Control SDK を手動でインストールする. - - 詳細は「2-2. IC Imaging Control SDK」を参照する. + - 詳細は「必要なソフトウェア — IC Imaging Control SDK」を参照する. **自動化される内容** @@ -42,30 +42,30 @@ - IC Imaging Control SDK のインストール - 実行時設定ファイルの配置(config.xml,カメラ設定 XML,CSV) -### 1-2. 手動セットアップ +### 手動セットアップ -スクリプトを使用しない場合は,以下のセクション 2〜4 の手順に従って手動で構築する. +スクリプトを使用しない場合は,以下の「必要なソフトウェア」〜「実行時の準備」の手順に従って手動で構築する. -## 2. 必要なソフトウェア (Required Software) +## 必要なソフトウェア (Required Software) -### 2-1. Visual Studio 2022 +### Visual Studio 2022 - 公式サイトからインストーラをダウンロードしてインストールする. - ワークロード選択で「.NET デスクトップ開発」を有効にする. - リポジトリルートの `.vsconfig` をインストーラで読み込むと,必要なワークロードが自動で提案される. -### 2-2. IC Imaging Control SDK +### IC Imaging Control SDK - The Imaging Source が提供するカメラ制御ライブラリ. - ImagingSource 製カメラ(DFK33UX178,DFK23UX249)の使用に必要. - インストール後,参照 DLL が Visual Studio から認識されることを確認する. -### 2-3. Lumenera SDK +### Lumenera SDK - Lumenera 製カメラ(Lw110)の使用に必要. - `lumenera.api.dll` はリポジトリ内に同梱されている. -## 3. リポジトリのセットアップ (Repository Setup) +## リポジトリのセットアップ (Repository Setup) 1. リポジトリのクローン @@ -88,26 +88,26 @@ 4. ビルド - 「ビルド」→「ソリューションのビルド」を実行し,エラーがないことを確認する. -## 4. 実行時の準備 (Runtime Preparation) +## 実行時の準備 (Runtime Preparation) -### 4-1. 設定ファイルの配置 +### 設定ファイルの配置 - `TIASshot/config.xml` が実行ファイルと同じディレクトリに存在することを確認する. - パラメータの詳細は `SPEC_02_設定ファイル仕様.md` を参照する. -### 4-2. カメラ設定ファイルの確認 +### カメラ設定ファイルの確認 - ImagingSource カメラを使用する場合,以下のファイルが同ディレクトリに必要. - `DFK33UX178.xml` - `DFK23UX249.xml` -### 4-3. TCC参照ファイルの確認 +### TCC参照ファイルの確認 - 以下の CSV ファイルが実行ファイルと同じディレクトリに必要. - `tcc_srgb.csv`: sRGB 変換の参照値 - `tcc_xyz.csv`: XYZ 変換の参照値 -### 4-4. データ保存フォルダの確認 +### データ保存フォルダの確認 - `config.xml` の `` に指定したフォルダへの書き込み権限があることを確認する. - デフォルトは `C:\TIAS_Data`. diff --git "a/docs/02_ENV/ENV_02_\343\203\207\343\202\243\343\203\254\343\202\257\343\203\210\343\203\252\346\247\213\346\210\220.md" "b/docs/02_ENV/ENV_02_\343\203\207\343\202\243\343\203\254\343\202\257\343\203\210\343\203\252\346\247\213\346\210\220.md" index e3a9c28..98dfbbb 100644 --- "a/docs/02_ENV/ENV_02_\343\203\207\343\202\243\343\203\254\343\202\257\343\203\210\343\203\252\346\247\213\346\210\220.md" +++ "b/docs/02_ENV/ENV_02_\343\203\207\343\202\243\343\203\254\343\202\257\343\203\210\343\203\252\346\247\213\346\210\220.md" @@ -1,8 +1,8 @@ # ディレクトリ構成 (Directory Structure) -## 1. 全体構成 (Overview) +## 全体構成 (Overview) -``` +```text TIASshot/ ├── CLAUDE.md ← AI向けガイドライン(ドキュメント・コーディング規則の参照) ├── README.md ← プロジェクト概要 @@ -11,11 +11,11 @@ └── docs/ ← ドキュメント ``` -## 2. メインプロジェクト TIASshot/ (Main Project) +## メインプロジェクト TIASshot/ (Main Project) -### 2-1. ソースコード +### ソースコード -``` +```text ├── Program.cs ← エントリポイント ├── Form1.cs ← メインフォーム(UI・操作イベント) ├── Form1.Designer.cs ← メインフォームのデザイナー自動生成コード @@ -28,9 +28,9 @@ └── LightSource.cs ← 光源(シリアル通信)制御 ``` -### 2-2. 設定・データファイル +### 設定・データファイル -``` +```text ├── config.xml ← アプリケーション設定(パラメータ定義) ├── DFK33UX178.xml ← ImagingSource DFK33UX178 カメラ設定 ├── DFK23UX249.xml ← ImagingSource DFK23UX249 カメラ設定 @@ -38,9 +38,9 @@ └── tcc_xyz.csv ← TCC XYZ 変換参照値(24色票×3ch) ``` -### 2-3. 外部ライブラリ・リソース +### 外部ライブラリ・リソース -``` +```text ├── lumenera.api.dll ← Lumenera SDK(同梱) ├── lumenera.api.xml ← Lumenera SDK ドキュメント ├── CalibDone.wav ← キャリブレーション完了音 @@ -49,9 +49,9 @@ └── main.ico ← アプリケーションアイコン ``` -### 2-4. プロジェクト設定 +### プロジェクト設定 -``` +```text ├── TIASshot.csproj ← プロジェクトファイル ├── App.config ← .NET アプリケーション設定 ├── packages.config ← NuGet パッケージ一覧 @@ -61,9 +61,9 @@ └── Settings.Designer.cs ← アプリ設定自動生成コード ``` -## 3. ドキュメント docs/ (Documents) +## ドキュメント docs/ (Documents) -``` +```text docs/ ├── 01_GUIDE/ ← チームルール・規約(命名,Git,コーディング,コメント) ├── 02_ENV/ ← 開発環境・構成に関するドキュメント(本ディレクトリ) diff --git "a/docs/02_ENV/ENV_03_\344\276\235\345\255\230\343\203\251\343\202\244\343\203\226\343\203\251\343\203\252\344\270\200\350\246\247.md" "b/docs/02_ENV/ENV_03_\344\276\235\345\255\230\343\203\251\343\202\244\343\203\226\343\203\251\343\203\252\344\270\200\350\246\247.md" index d2cd34a..3ef2eac 100644 --- "a/docs/02_ENV/ENV_03_\344\276\235\345\255\230\343\203\251\343\202\244\343\203\226\343\203\251\343\203\252\344\270\200\350\246\247.md" +++ "b/docs/02_ENV/ENV_03_\344\276\235\345\255\230\343\203\251\343\202\244\343\203\226\343\203\251\343\203\252\344\270\200\350\246\247.md" @@ -1,11 +1,11 @@ # 依存ライブラリ一覧 (Dependency List) -## 1. 開発環境 (Development Environment) +## 開発環境 (Development Environment) - IDE: Visual Studio 2022 - ターゲットフレームワーク: .NET Framework 4.8 -## 2. NuGet パッケージ (NuGet Packages) +## NuGet パッケージ (NuGet Packages) `packages.config` で管理する.Visual Studio のパッケージ復元で自動取得される. @@ -26,7 +26,7 @@ - `System.Runtime.CompilerServices.Unsafe` (6.0.0) - `System.ValueTuple` (4.5.0) -## 3. 外部 SDK(別途インストールが必要) (External SDKs) +## 外部 SDK(別途インストールが必要) (External SDKs) **IC Imaging Control SDK (The Imaging Source)** diff --git "a/docs/03_SPEC/SPEC_01_\346\251\237\350\203\275\344\273\225\346\247\230.md" "b/docs/03_SPEC/SPEC_01_\346\251\237\350\203\275\344\273\225\346\247\230.md" index d558243..7feab10 100644 --- "a/docs/03_SPEC/SPEC_01_\346\251\237\350\203\275\344\273\225\346\247\230.md" +++ "b/docs/03_SPEC/SPEC_01_\346\251\237\350\203\275\344\273\225\346\247\230.md" @@ -1,6 +1,6 @@ # 機能仕様 (Feature Specification) -## 1. 対応カメラ (Supported Cameras) +## 対応カメラ (Supported Cameras) 起動時に Lucam → ImagingSource の順で接続を試みる. @@ -16,27 +16,27 @@ - 対応機種: Lw110 - SDK: Lumenera SDK(`lumenera.api.dll`) -## 2. プレビュー (Preview) +## プレビュー (Preview) - 起動後,接続したカメラのライブ映像をメインウィンドウに表示する. - サブモニタへのプレビュー表示にも対応する(PreviewMonitor). - ImagingSource カメラはプレビュー時に ROI クリップを適用する. -## 3. 自動キャリブレーション (Auto Calibration) +## 自動キャリブレーション (Auto Calibration) プレビュー中に舌診チャートを検出すると自動でキャリブレーションを開始する. -### 3-1. チャート検出 +### チャート検出 - ArUco マーカー(ID 40, 41)を使用してチャートを自動検出する. - チャートが一定フレーム数静止したことを確認してからキャリブを開始する. -### 3-2. ホワイトバランス調整 +### ホワイトバランス調整 - チャートの白色票(24色票の13番)を基準にカメラのゲインを自動調整する. - 目標値は `config.xml` の `Calib/Reference` で指定する. -### 3-3. TCC(色変換行列)計算 +### TCC(色変換行列)計算 - 24パッチの平均 RGB 値を計測し,最小二乗法(SVD)で変換行列を算出する. - 変換次元数(多項式の次数)は `Calib/ConversionChannels` で指定する. @@ -46,7 +46,7 @@ - 複数の次元数をカンマ区切りで同時に指定可能(例: `4,10,17`). - 算出した変換行列は CSV ファイルに保存される. -## 4. 撮影 (Shooting) +## 撮影 (Shooting) キャリブレーション完了後に撮影ボタンが有効になる. @@ -64,7 +64,7 @@ - 元画像(RGB): `Shot{NO}.png` - sRGB 変換画像: `sRGB{CN}_{NO}.jpg`(指定した次元数ぶん生成される) -## 5. データ保存 (Data Saving) +## データ保存 (Data Saving) 撮影・キャリブレーション結果は保存フォルダ以下に日時フォルダで自動保存される. @@ -88,7 +88,7 @@ - `Shot{NO}.png`: 元画像(RGB) - `sRGB{CN}_{NO}.jpg`: sRGB 変換画像 -## 6. 光源制御 (Light Source Control) +## 光源制御 (Light Source Control) - シリアル通信(USB-シリアル変換)で光源の ON/OFF を制御する. - 対応デバイス: Silicon Labs CP210x(`config.xml` で変更可能). diff --git "a/docs/03_SPEC/SPEC_02_\350\250\255\345\256\232\343\203\225\343\202\241\343\202\244\343\203\253\344\273\225\346\247\230.md" "b/docs/03_SPEC/SPEC_02_\350\250\255\345\256\232\343\203\225\343\202\241\343\202\244\343\203\253\344\273\225\346\247\230.md" index 58b6447..24a3266 100644 --- "a/docs/03_SPEC/SPEC_02_\350\250\255\345\256\232\343\203\225\343\202\241\343\202\244\343\203\253\344\273\225\346\247\230.md" +++ "b/docs/03_SPEC/SPEC_02_\350\250\255\345\256\232\343\203\225\343\202\241\343\202\244\343\203\253\344\273\225\346\247\230.md" @@ -5,7 +5,7 @@ ※ ファイル名・保存先のテンプレート変数: `{NO}` は4桁連番,`{CN}` は2桁の次元数に展開される. -## 1. Lucam カメラ設定 (Lucam Camera) +## Lucam カメラ設定 (Lucam Camera) Lumenera Lw110 の初期パラメータ. @@ -22,7 +22,7 @@ - ``: レッドゲイン - 例: `1.70` -## 2. ImagingSource カメラ設定 (ImagingSource Camera) +## ImagingSource カメラ設定 (ImagingSource Camera) 各カメラの ROI(関心領域)設定.カメラ名はデバイス名と一致させる. @@ -36,7 +36,7 @@ ※ ImagingSource カメラは画像を転置してから ROI を切り出す.X・Y・W・H は転置後の座標系で指定する. -## 3. キャリブレーション設定 (Calibration) +## キャリブレーション設定 (Calibration) **``** @@ -60,9 +60,9 @@ - ``: 変換行列の次元数 - 4 (1次式),10 (2次式),17 (3次式) から選択する. - カンマ区切りで複数指定可能(例: `4,10,17`). - - 詳細は `SPEC_01_機能仕様.md` の「3-3. TCC計算」を参照. + - 詳細は `SPEC_01_機能仕様.md` の「TCC(色変換行列)計算」を参照. -## 4. 撮影設定 (Shot) +## 撮影設定 (Shot) **``** @@ -75,7 +75,7 @@ - ``: データ名の初期値(UI のテキストボックスに表示) - 例: `無記名` -## 5. ファイル設定 (File) +## ファイル設定 (File) **``** @@ -108,7 +108,7 @@ - ``: RGB→XYZ 変換行列(旧形式)CSV のファイル名 - 例: `Conv_RGB-XYZold.csv` -## 6. 光源設定 (Light Source) +## 光源設定 (Light Source) **``** @@ -117,7 +117,7 @@ - ``: シリアル通信のボーレート (bps) - 例: `38400` -## 7. サウンド設定 (Sound) +## サウンド設定 (Sound) **``** diff --git "a/docs/04_TECH/TECH_01_\343\202\257\343\203\251\343\202\271\350\250\255\350\250\210.md" "b/docs/04_TECH/TECH_01_\343\202\257\343\203\251\343\202\271\350\250\255\350\250\210.md" index 2677e8c..b861ef5 100644 --- "a/docs/04_TECH/TECH_01_\343\202\257\343\203\251\343\202\271\350\250\255\350\250\210.md" +++ "b/docs/04_TECH/TECH_01_\343\202\257\343\203\251\343\202\271\350\250\255\350\250\210.md" @@ -1,6 +1,6 @@ # クラス設計 (Class Design) -## 1. クラス一覧 (Class Overview) +## クラス一覧 (Class Overview) **CameraBase(抽象基底クラス)** @@ -41,28 +41,28 @@ - ファイル: `LightSource.cs` - シリアル通信(USB-シリアル変換)による光源の ON/OFF 制御. -## 2. 継承関係 (Inheritance) +## 継承関係 (Inheritance) -``` +```text CameraBase(抽象) ├── IScam ← ImagingSource カメラ └── Lucam ← Lumenera カメラ ``` -## 3. CameraBase の主なメンバ (CameraBase Members) +## CameraBase の主なメンバ (CameraBase Members) -### 3-1. 抽象メソッド(派生クラスで実装する) +### 抽象メソッド(派生クラスで実装する) - `Connect() : bool`: カメラに接続する - `Disconnect()`: カメラを切断する - `Shot(numImages, interval)`: 撮影処理 -### 3-2. 公開メソッド +### 公開メソッド - `ShotOne()`: 1枚撮影 - `ShotMulti()`: 連続撮影 -### 3-3. 保護メソッド(派生クラスから呼ぶ) +### 保護メソッド(派生クラスから呼ぶ) - `BootCheck() : bool`: 起動時の前提条件チェック(設定・TCC参照ファイル) - `DetectChart(img)`: ArUco マーカーによるチャート検出 @@ -71,7 +71,7 @@ - `SaveThread(numImages)`: 画像保存スレッド処理 - `GetRatio(value, target) : float`: ゲイン更新比率の計算 -### 3-4. 主なフィールド +### 主なフィールド - `_calibrating`: キャリブレーション残りフレーム数(0 で完了) - `_calibrated`: キャリブレーション完了フラグ @@ -80,7 +80,7 @@ - `_roi`: ROI 矩形(IScam のみ使用) - `_shots`: 撮影済み画像バッファ -## 4. Form1 とカメラの関係 (Form1 and Camera) +## Form1 とカメラの関係 (Form1 and Camera) - Form1 は `CameraBase` 型の `_camera` フィールドを持つ. - 起動時に Lucam → IScam の順で接続を試みる(詳細は `TECH_02` 参照). diff --git "a/docs/04_TECH/TECH_02_\343\202\253\343\203\241\343\203\251\345\210\266\345\276\241\344\273\225\346\247\230.md" "b/docs/04_TECH/TECH_02_\343\202\253\343\203\241\343\203\251\345\210\266\345\276\241\344\273\225\346\247\230.md" index 796d58f..adec6b7 100644 --- "a/docs/04_TECH/TECH_02_\343\202\253\343\203\241\343\203\251\345\210\266\345\276\241\344\273\225\346\247\230.md" +++ "b/docs/04_TECH/TECH_02_\343\202\253\343\203\241\343\203\251\345\210\266\345\276\241\344\273\225\346\247\230.md" @@ -1,6 +1,6 @@ # カメラ制御仕様 (Camera Control Specification) -## 1. 起動時のカメラ接続フロー (Startup Connection Flow) +## 起動時のカメラ接続フロー (Startup Connection Flow) Form1 ロード時に以下の順で接続を試みる. @@ -15,54 +15,54 @@ 3. どのカメラも接続できない場合 - エラーダイアログを表示してアプリを終了する -## 2. IScam(ImagingSource カメラ)の制御 (IScam Control) +## IScam(ImagingSource カメラ)の制御 (IScam Control) -### 2-1. 接続 +### 接続 - `[デバイス名].xml` からカメラ設定をロードする. - `config.xml` の `<カメラ名>/ROI` から ROI 設定を読み込む. - `FrameQueueSink` をシンクに設定してライブ開始する. -### 2-2. プレビュー(フレーム取得コールバック) +### プレビュー(フレーム取得コールバック) - `FrameQueueSink` の `Retrieve` コールバックでフレームを受け取る. - 受け取った画像を転置(`.T()`)し,ROI を切り出して表示する. - キャリブレーション中は白色票の測定・ゲイン更新も行う(後述). -### 2-3. ROI クリップ +### ROI クリップ - ImagingSource カメラは横向きに画像を出力するため,転置して縦向きに変換する. - 転置後の画像座標系で ROI(X,Y,W,H)を切り出す. -### 2-4. 撮影 +### 撮影 - シンクを `FrameQueueSink` → `FrameSnapSink` に切り替える. - `SnapSingle()` で1フレームずつ取得して `_shots` に蓄積する. - 撮影完了後,シンクを `FrameQueueSink` に戻す. - 最初の1フレームは捨てる(カメラの安定待ち). -## 3. Lucam(Lumenera カメラ)の制御 (Lucam Control) +## Lucam(Lumenera カメラ)の制御 (Lucam Control) -### 3-1. 接続 +### 接続 - `LucamNumCameras()` で接続台数を確認する(0台または2台以上はエラー). - カメラ ID から機種を特定する(`0x49f` → Lw110). - `LucamRgbPreviewCallback` コールバックを登録する. - `config.xml` の `` からカメラパラメータを設定して,プレビューを開始する. -### 3-2. プレビュー(フレーム取得コールバック) +### プレビュー(フレーム取得コールバック) - `LucamRgbPreviewCallback` でフレームを受け取る. - 受け取った画像を転置(`.T()`)して表示する(ROI クリップなし). - キャリブレーション中は白色票の測定・ゲイン更新も行う(後述). -### 3-3. 撮影 +### 撮影 - `LucamEnableFastFrames()` でスナップ撮影モードに切り替える. - `LucamTakeFastFrame()` でRAW画像を取得し,`LucamConvertFrameToRgb24()` でRGB変換する. - 撮影完了後,`LucamDisableFastFrames()` で通常モードに戻す. -## 4. ホワイトバランス自動調整 (White Balance Calibration) +## ホワイトバランス自動調整 (White Balance Calibration) チャート検出後(`_calibrating` が `Calib/Frames` にセットされた後),各フレームで以下の処理を行う. @@ -75,11 +75,11 @@ 3. `_calibrating` をデクリメントし,0 になったら `CalcTcc()` を呼び出す -## 5. データ保存フォルダの生成 (Save Folder) +## データ保存フォルダの生成 (Save Folder) `SetSaveFolder(note)` が保存先フォルダを以下の書式で生成する. -``` +```text [SaveFolder]/[yyyy-MM-dd]/[HH_mm_ss]-[note]/ ``` diff --git "a/docs/04_TECH/TECH_03_\350\211\262\350\243\234\346\255\243\345\207\246\347\220\206\344\273\225\346\247\230.md" "b/docs/04_TECH/TECH_03_\350\211\262\350\243\234\346\255\243\345\207\246\347\220\206\344\273\225\346\247\230.md" index 30b55d3..c320182 100644 --- "a/docs/04_TECH/TECH_03_\350\211\262\350\243\234\346\255\243\345\207\246\347\220\206\344\273\225\346\247\230.md" +++ "b/docs/04_TECH/TECH_03_\350\211\262\350\243\234\346\255\243\345\207\246\347\220\206\344\273\225\346\247\230.md" @@ -1,8 +1,8 @@ # 色補正処理仕様 (Color Correction Specification) -## 1. 処理の全体フロー (Overall Flow) +## 処理の全体フロー (Overall Flow) -``` +```text 1. ArUco マーカー検出(DetectChart) ↓ 2. チャート固定判定 @@ -14,67 +14,67 @@ 5. 変換行列の保存・撮影の有効化 ``` -## 2. チャート検出(DetectChart) (Chart Detection) +## チャート検出(DetectChart) (Chart Detection) -### 2-1. ArUco マーカー検出 +### ArUco マーカー検出 - 辞書: Dict4X4_50(4×4 ビット,50種) - 使用マーカー ID: 40(チャート上端),41(チャート下端) - 両方のマーカーが検出できない場合は処理をスキップする. - ID40 の Y 座標が ID41 より大きい場合(上下逆)は警告を表示する. -### 2-2. チャート固定判定 +### チャート固定判定 - ID40 の検出座標と前フレームの座標の距離を計算する. - 距離 < `Calib/ChartSetCriteria` が `Calib/ChartSetCount` フレーム連続したら固定と判断する. - 動きを検出したらカウントをリセットする. -### 2-3. ホモグラフィ計算とチャートマスク作成 +### ホモグラフィ計算とチャートマスク作成 - 2つのマーカーの角点(計8点)からホモグラフィ行列を計算する. - ホモグラフィで画像を 1545×810 px に正面化する. - 正面化画像上で 24 色票の ROI を定義し(6列×4行,各 80×80 px),元の画像座標系に逆変換してマスクを生成する. - 生成したマスクを `_chartMasks` リスト(インデックス 0〜23)に格納する. -## 3. TCC 変換行列の計算(CalcTcc) (TCC Matrix Calculation) +## TCC 変換行列の計算(CalcTcc) (TCC Matrix Calculation) -### 3-1. チャート RGB 値の取得 +### チャート RGB 値の取得 - `_chartMasks` を使って 24 パッチの平均 RGB 値を測定する(24×3 行列). -### 3-2. 多項式拡張(ExtendMat) +### 多項式拡張(ExtendMat) 3チャンネル(R,G,B)を指定の次元数に拡張する. **次元数と項の対応** | 次元数 | 追加される項 | -| ------ | ------------ | +| --- | --- | | 4 (1次式) | 1, R, G, B | | 10 (2次式) | + RG, RB, GB, R², G², B² | | 17 (3次式) | + R²B, R²G, G²R, G²B, B²R, B²G, RGB | - 各項は `ExtendChannels` テーブルで定義した3チャンネルの積として計算する. -### 3-3. 変換行列の算出(CalcConvertMatrix) +### 変換行列の算出(CalcConvertMatrix) - 拡張行列(24×N)と目標行列(24×3)から最小二乗法(SVD分解)で変換行列(N×3)を算出する. - `Cv2.Solve(..., DecompTypes.SVD)` を使用する. -### 3-4. 算出する変換行列の種類 +### 算出する変換行列の種類 - RGB→sRGB: カメラ RGB から sRGB への変換行列 - RGB→XYZ: カメラ RGB から XYZ 色空間への変換行列 - sRGB→XYZ: sRGB から XYZ 色空間への変換行列 - 各行列は指定した次元数ぶん計算・保存される. -### 3-5. TCC参照値ファイル +### TCC参照値ファイル - `tcc_srgb.csv`: 24色票の標準 sRGB 値(24×3 行列) - `tcc_xyz.csv`: 24色票の標準 XYZ 値(24×3 行列) - アプリ起動時に読み込み,`CameraBase` に保持する. -## 4. 画像の色変換(ConvertImage) (Image Color Conversion) +## 画像の色変換(ConvertImage) (Image Color Conversion) 1. 入力画像を `CV_64FC3`(64bit浮動小数点3チャンネル)に変換する 2. 画像を1次元(ピクセル数×3)に変形(Reshape)する diff --git "a/docs/05_PLAN/PLAN_01_\343\203\252\343\203\225\343\202\241\343\202\257\343\202\277\343\203\252\343\203\263\343\202\260\350\250\210\347\224\273.md" "b/docs/05_PLAN/PLAN_01_\343\203\252\343\203\225\343\202\241\343\202\257\343\202\277\343\203\252\343\203\263\343\202\260\350\250\210\347\224\273.md" index 7ff1481..d8464c1 100644 --- "a/docs/05_PLAN/PLAN_01_\343\203\252\343\203\225\343\202\241\343\202\257\343\202\277\343\203\252\343\203\263\343\202\260\350\250\210\347\224\273.md" +++ "b/docs/05_PLAN/PLAN_01_\343\203\252\343\203\225\343\202\241\343\202\257\343\202\277\343\203\252\343\203\263\343\202\260\350\250\210\347\224\273.md" @@ -1,12 +1,12 @@ # リファクタリング計画 (Refactoring Plan) -## 0. 方針 (Policy) +## 方針 (Policy) - 処理の変更は一切行わない.構造の整理のみを目的とする. - 各フェーズ完了後に必ずテストを実施し,動作が変わっていないことを確認してから次へ進む. - テストの具体的な手順は `TEST_01_テスト仕様.md` を参照する. -## 1. 現状の問題点 (Current Issues) +## 現状の問題点 (Current Issues) `CameraBase.cs` に以下の責務が集中している. @@ -16,9 +16,9 @@ - ファイル I/O(CSV読み書き,保存フォルダ生成,撮影情報出力) - サウンド再生 -## 2. 目標とするディレクトリ構成 (Target Structure) +## 目標とするディレクトリ構成 (Target Structure) -``` +```text TIASshot/ ├── Cameras/ ← カメラ制御(CameraBase, IScam, Lucam) ├── ChartDetection/ ← チャート検出(CameraBaseから分離) @@ -29,9 +29,9 @@ └── Program.cs ← エントリポイント(変更なし) ``` -## 3. フェーズ構成 (Phases) +## フェーズ構成 (Phases) -### 3-1. フェーズ1: フォルダ整理とファイル移動 +### フェーズ1: フォルダ整理とファイル移動 **作業内容** @@ -46,7 +46,7 @@ - ビルドが成功することを確認する. - アプリが起動し,カメラが接続されることを確認する(手動). -### 3-2. フェーズ2: 色補正処理の分離 +### フェーズ2: 色補正処理の分離 **作業内容** @@ -61,9 +61,9 @@ - ビルドが成功することを確認する. - 回帰テスト: 同一入力画像から算出した変換行列が,リファクタリング前と一致することを確認する. - - 具体的な手順は `TEST_01_テスト仕様.md` の「2. 回帰テスト」を参照する. + - 具体的な手順は `TEST_01_テスト仕様.md` の「回帰テスト: 色補正処理」を参照する. -### 3-3. フェーズ3: チャート検出処理の分離 +### フェーズ3: チャート検出処理の分離 **作業内容** @@ -78,9 +78,9 @@ - ビルドが成功することを確認する. - 回帰テスト: 保存済みの実画像を入力として,チャートマスクの位置が一致することを確認する. - - 具体的な手順は `TEST_01_テスト仕様.md` の「3. チャート検出テスト」を参照する. + - 具体的な手順は `TEST_01_テスト仕様.md` の「チャート検出テスト」を参照する. -### 3-4. フェーズ4: ファイル I/O・サウンドの分離 +### フェーズ4: ファイル I/O・サウンドの分離 **作業内容** @@ -95,7 +95,7 @@ - 撮影からファイル保存までの一連の動作を手動で確認する. - 保存された CSV・画像の内容がリファクタリング前と一致することを確認する. -## 4. 共通ルール (Common Rules) +## 共通ルール (Common Rules) - 各フェーズは独立したブランチではなく,`refactor/code-cleanup` ブランチ上で順に進める. - フェーズ完了ごとにコミットする.コミットメッセージは `[clean]` タグを使用する. diff --git "a/docs/05_PLAN/PLAN_02_\343\203\220\343\202\260\344\277\256\346\255\243\350\250\210\347\224\273.md" "b/docs/05_PLAN/PLAN_02_\343\203\220\343\202\260\344\277\256\346\255\243\350\250\210\347\224\273.md" index 3f34971..2d3d5fb 100644 --- "a/docs/05_PLAN/PLAN_02_\343\203\220\343\202\260\344\277\256\346\255\243\350\250\210\347\224\273.md" +++ "b/docs/05_PLAN/PLAN_02_\343\203\220\343\202\260\344\277\256\346\255\243\350\250\210\347\224\273.md" @@ -1,20 +1,20 @@ # バグ修正計画 (Bug Fix Plan) -## 0. 前提 (Prerequisites) +## 前提 (Prerequisites) - `PLAN_01_リファクタリング計画.md` の全フェーズが完了し,動作がリファクタリング前と同一であることを確認してから着手する. - 修正は1件ずつ独立して行い,都度テストを実施する. - コミットメッセージは `[fix]` タグを使用する. - 例: `[fix] _shots へのスレッドセーフなアクセスに修正` -## 1. 症状 (Symptom) +## 症状 (Symptom) - 連続撮影で4枚以上取得するとアプリがたまにクラッシュする. - 再現性は不安定(毎回ではなく「たまに」落ちる). -## 2. 原因と修正方針 (Causes and Fix Policy) +## 原因と修正方針 (Causes and Fix Policy) -### 2-1. 優先度1: `_shots` へのスレッドセーフでないアクセス(根本原因) +### 優先度1: `_shots` へのスレッドセーフでないアクセス(根本原因) **原因** @@ -37,7 +37,7 @@ - 連続撮影を10枚以上で複数回繰り返し,クラッシュしないことを確認する. -### 2-2. 優先度2: `ConvertImage` 内の Mat 未 Dispose によるメモリ蓄積 +### 優先度2: `ConvertImage` 内の Mat 未 Dispose によるメモリ蓄積 **原因** @@ -53,7 +53,7 @@ - タスクマネージャでメモリ使用量を監視しながら連続撮影を繰り返し,撮影ごとにメモリが増加し続けないことを確認する. -### 2-3. 優先度3: `Parallel.For` 内での未捕捉例外 +### 優先度3: `Parallel.For` 内での未捕捉例外 **原因** @@ -70,7 +70,7 @@ - 例外発生時にアプリが落ちずエラーが表示されることを確認する. -### 2-4. 優先度4: `ConvertImage` による `_shots[i]` の in-place 書き換え +### 優先度4: `ConvertImage` による `_shots[i]` の in-place 書き換え **原因** @@ -86,7 +86,7 @@ - 複数チャンネル(例: `4,10,17`)で撮影し,各チャンネルの sRGB 変換画像が正しく出力されることを確認する. -### 2-5. 優先度5: Mat 未 Dispose によるメモリリーク +### 優先度5: Mat 未 Dispose によるメモリリーク **原因 A: `_shots.Clear()` で Mat が解放されない** @@ -104,10 +104,10 @@ - タスクマネージャでメモリ使用量を監視し,撮影・キャリブを繰り返してもメモリが増加し続けないことを確認する. -## 3. 修正順序まとめ (Summary) +## 修正順序まとめ (Summary) | 順位 | 原因 | クラッシュとの関連 | -| ---- | ---- | ------------------ | +| --- | --- | --- | | 1 | `_shots` のスレッドセーフでないアクセス | 直接原因(「たまに落ちる」に一致) | | 2 | `ConvertImage` 内の Mat 未 Dispose | 直接原因(OOM によるクラッシュ) | | 3 | `Parallel.For` 内の未捕捉例外 | 間接原因(2の修正で頻度減) | diff --git "a/docs/06_TEST/TEST_01_\343\203\206\343\202\271\343\203\210\344\273\225\346\247\230.md" "b/docs/06_TEST/TEST_01_\343\203\206\343\202\271\343\203\210\344\273\225\346\247\230.md" index f8860d5..fc177bf 100644 --- "a/docs/06_TEST/TEST_01_\343\203\206\343\202\271\343\203\210\344\273\225\346\247\230.md" +++ "b/docs/06_TEST/TEST_01_\343\203\206\343\202\271\343\203\210\344\273\225\346\247\230.md" @@ -1,6 +1,6 @@ # テスト仕様 (Test Specification) -## 0. 方針 (Policy) +## 方針 (Policy) リファクタリングによって処理が変わっていないことを確認するためのテスト仕様. 各フェーズの適用タイミングは `PLAN_01_リファクタリング計画.md` を参照する. @@ -11,7 +11,7 @@ - 回帰テスト: リファクタリング前後の出力が一致することを確認する - 手動テスト: 実機を使って動作を目視確認する -## 1. ビルドテスト (Build Test) +## ビルドテスト (Build Test) 全フェーズで実施する. @@ -25,11 +25,11 @@ - ビルドエラーが0件 -## 2. 回帰テスト: 色補正処理(フェーズ2) +## 回帰テスト: 色補正処理(フェーズ2) リファクタリング前に基準データを作成し,リファクタリング後の出力と比較する. -### 2-1. 基準データの作成(リファクタリング前に実施) +### 基準データの作成(リファクタリング前に実施) 1. 実機でキャリブレーションを実行する 2. 保存された以下のファイルを「基準データ」として別フォルダに保管する @@ -40,7 +40,7 @@ - `TCC_sRGB{CN}.csv` ← チャートのsRGB変換値 - `sRGB{CN}_0001.jpg` ← 撮影した sRGB 変換画像1枚 -### 2-2. 比較(リファクタリング後に実施) +### 比較(リファクタリング後に実施) 1. 同一のキャリブレーション画像・撮影条件で再度実行する - ※ 実機でのキャリブレーション再現が困難な場合は,TCC_RGB.csv を直接入力として行列計算のみ比較する @@ -51,16 +51,16 @@ - CSV の数値が全行・全列で一致する(または浮動小数点誤差 ±1e-6 以内) - 画像のピクセル値が全ピクセルで一致する -## 3. チャート検出テスト(フェーズ3) +## チャート検出テスト(フェーズ3) 保存済みの実画像を入力として,チャートマスクの位置を比較する. -### 3-1. 基準データの作成(リファクタリング前に実施) +### 基準データの作成(リファクタリング前に実施) 1. キャリブレーション時に保存される `TCC_ROIs.jpg` を基準データとして保管する - ※ TCC_ROIs.jpg はチャートの ROI マスク位置を緑色で重ねた確認画像 -### 3-2. 比較(リファクタリング後に実施) +### 比較(リファクタリング後に実施) 1. 同一条件でキャリブレーションを実行する 2. 出力された `TCC_ROIs.jpg` を基準データと目視比較する @@ -70,7 +70,7 @@ - マスクの位置・形状が基準データと目視で一致する -## 4. 手動テスト(全フェーズ) +## 手動テスト(全フェーズ) 実機を使った動作確認.フェーズごとに実施する.