======================================================================== 色補正処理仕様 (Color Correction Specification) ======================================================================== 1. 処理の全体フロー (Overall Flow) ------------------------------------------------------------------------ 1. ArUco マーカー検出(DetectChart) ↓ 2. チャート固定判定 ↓ 3. ホワイトバランス自動調整(ゲイン更新) ↓ 4. TCC 変換行列の計算(CalcTcc) ↓ 5. 変換行列の保存・撮影の有効化 2. チャート検出(DetectChart) (Chart Detection) ------------------------------------------------------------------------ 2-1. 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) ------------------------------------------------------------------------ 3-1. チャート RGB 値の取得 ・`_chartMasks` を使って 24 パッチの平均 RGB 値を測定する(24×3 行列). 3-2. 多項式拡張(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) ・拡張行列(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_srgb.csv`: 24色票の標準 sRGB 値(24×3 行列) ・`tcc_xyz.csv`: 24色票の標準 XYZ 値(24×3 行列) ・アプリ起動時に読み込み,`CameraBase` に保持する. 4. 画像の色変換(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` による飽和).