# 色補正処理仕様 (Color Correction Specification)

## 処理の全体フロー (Overall Flow)

```text
1. ArUco マーカー検出（DetectChart）
       ↓
2. チャート固定判定
       ↓
3. ホワイトバランス自動調整（ゲイン更新）
       ↓
4. TCC 変換行列の計算（CalcTcc）
       ↓
5. 変換行列の保存・撮影の有効化
```

## チャート検出（DetectChart） (Chart Detection)

### ArUco マーカー検出

- 辞書: Dict4X4_50（4×4 ビット，50種）
- 使用マーカー ID: 40（チャート上端），41（チャート下端）
- 両方のマーカーが検出できない場合は処理をスキップする．
- ID40 の Y 座標が ID41 より大きい場合（上下逆）は警告を表示する．

### チャート固定判定

- ID40 の検出座標と前フレームの座標の距離を計算する．
- 距離 < `Calib/ChartSetCriteria` が `Calib/ChartSetCount` フレーム連続したら固定と判断する．
- 動きを検出したらカウントをリセットする．

### ホモグラフィ計算とチャートマスク作成

- 2つのマーカーの角点（計8点）からホモグラフィ行列を計算する．
- ホモグラフィで画像を 1545×810 px に正面化する．
- 正面化画像上で 24 色票の ROI を定義し（6列×4行，各 80×80 px），元の画像座標系に逆変換してマスクを生成する．
- 生成したマスクを `_chartMasks` リスト（インデックス 0〜23）に格納する．

## TCC 変換行列の計算（CalcTcc） (TCC Matrix Calculation)

### チャート RGB 値の取得

- `_chartMasks` を使って 24 パッチの平均 RGB 値を測定する（24×3 行列）．

### 多項式拡張（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チャンネルの積として計算する．

### 変換行列の算出（CalcConvertMatrix）

- 拡張行列（24×N）と目標行列（24×3）から最小二乗法（SVD分解）で変換行列（N×3）を算出する．
- `Cv2.Solve(..., DecompTypes.SVD)` を使用する．

### 算出する変換行列の種類

- RGB→sRGB: カメラ RGB から sRGB への変換行列
- RGB→XYZ: カメラ RGB から XYZ 色空間への変換行列
- sRGB→XYZ: sRGB から XYZ 色空間への変換行列
- 各行列は指定した次元数ぶん計算・保存される．

### TCC参照値ファイル

- `tcc_srgb.csv`: 24色票の標準 sRGB 値（24×3 行列）
- `tcc_xyz.csv`: 24色票の標準 XYZ 値（24×3 行列）
- アプリ起動時に読み込み，`CameraBase` に保持する．

## 画像の色変換（ConvertImage） (Image Color Conversion)

1. 入力画像を `CV_64FC3`（64bit浮動小数点3チャンネル）に変換する
2. 画像を1次元（ピクセル数×3）に変形（Reshape）する
3. 多項式拡張（ExtendMat）でピクセル数×N 行列にする
4. 変換行列（N×3）を右から掛けて変換後の値を得る
5. `CV_8UC3`（8bit整数）に変換して出力する

- 変換後の値は 0〜255 の範囲に自動クリップされる（`ConvertTo` による飽和）．
