1. ArUco マーカー検出(DetectChart)
↓
2. チャート固定判定
↓
3. ホワイトバランス自動調整(ゲイン更新)
↓
4. TCC 変換行列の計算(CalcTcc)
↓
5. 変換行列の保存・撮影の有効化
- 辞書: 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)に格納する.
_chartMasks を使って 24 パッチの平均 RGB 値を測定する(24×3 行列).
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チャンネルの積として計算する.
- 拡張行列(24×N)と目標行列(24×3)から最小二乗法(SVD分解)で変換行列(N×3)を算出する.
Cv2.Solve(..., DecompTypes.SVD) を使用する.
- RGB→sRGB: カメラ RGB から sRGB への変換行列
- RGB→XYZ: カメラ RGB から XYZ 色空間への変換行列
- sRGB→XYZ: sRGB から XYZ 色空間への変換行列
- 各行列は指定した次元数ぶん計算・保存される.
tcc_srgb.csv: 24色票の標準 sRGB 値(24×3 行列)
tcc_xyz.csv: 24色票の標準 XYZ 値(24×3 行列)
- アプリ起動時に読み込み,
CameraBase に保持する.
- 入力画像を
CV_64FC3(64bit浮動小数点3チャンネル)に変換する
- 画像を1次元(ピクセル数×3)に変形(Reshape)する
- 多項式拡張(ExtendMat)でピクセル数×N 行列にする
- 変換行列(N×3)を右から掛けて変換後の値を得る
CV_8UC3(8bit整数)に変換して出力する
- 変換後の値は 0〜255 の範囲に自動クリップされる(
ConvertTo による飽和).
すぐに直す必要はないが,方針を考える必要がある課題.決まったら本節から外し,仕様に反映する.
- 状態: 保留(2026-10-09.直近の対応は不要.研究室・上流と相談して決める)
- 現象: 白色票やチャート外の白い台紙・枠など明るい白い部分で,17 次元(3 次)の変換がカメラの入力のばらつきを約 10 倍に増幅する.変換後の値が 0〜255 を外れ,上記の自動クリップで点状のノイズ・白飛び(255)になる.平均の色は合っている
- 回帰ではない: 上流 v1.6 と現行で同じ入力を通すと,変換後の画像がビット単位で一致する
- 考える必要があること: 色の再現性とノイズのどちらを優先するか.対策の候補は次のとおり(いずれも色の再現性に影響する)
- 使う次元を下げる(例: 3 次の項を使わない)
- 変換の入力・出力に制限をかける
- 色票の範囲外の明るい色を別に扱う
- 影響を受けるもの: 実機テストの白色票のしきい値(40)は,方針が決まるまで暫定
- 詳細(実測値・v1.6 との比較): PLAN_06「17 次元の変換のノイズ」