#pragma once // // Recipe.h - ノーコード「検査レシピ」のデータモデル(UI/画像ライブラリ非依存)。 // // パラダイム: ブロックをワイヤで繋ぐノードグラフではなく、 // 「上から下へ順に実行するステップの縦リスト」= 料理のレシピ / 検査チェックリスト。 // ステップは2種: 処理(画像を加工) と 検査(値を測って範囲判定=PASS/FAIL に寄与)。 // #include #include // CRect #include namespace core { // ステップ種別。process=画像加工 / inspect=測定+判定。 enum class StepKind { // --- 処理(画像を加工する) --- Grayscale, // カラー→グレー(24bit→8bit) Median, // 3x3 メディアン(ノイズ除去) Binarize, // 二値化(帯 [L,H]) Otsu, // 大津の二値化(自動しきい値) Gamma, // ガンマ補正 Contrast, // コントラスト伸長 // --- 検査(測定して範囲で合否) --- InspectBrightness, // 平均輝度が [min,max] に入れば OK InspectWhiteRatio, // 二値化後の白画素率(%) が [min,max] に入れば OK InspectBlobCount, // 二値化+ラベリングで「塊(キズ/穴)の数」が [min,max] に入れば OK }; // 1つのパラメータ(数値)。UI はこの記述を見て入力欄を作る。 struct StepParam { CString key; // 内部キー CString label; // 画面表示名 double value; // 現在値 double lo; // 入力下限(UIヒント) double hi; // 入力上限(UIヒント) }; // 実行後の結果(検査ステップのみ意味を持つ)。 struct StepResult { bool ran = false; // 実行された bool ok = true; // 検査OK(処理ステップは常に true) double measured = 0.0; // 測定値(検査ステップ) CString text; // 表示用の説明(測定値/エラー等) }; // レシピの1ステップ。 struct Step { StepKind kind; std::vector params; StepResult result; double Param(LPCWSTR key, double def = 0.0) const { for (const auto& p : params) if (p.key == key) return p.value; return def; } void SetParam(LPCWSTR key, double v) { for (auto& p : params) if (p.key == key) { p.value = v; return; } } }; // 検査レシピ = ステップの並び + 検査範囲(ROI)。 struct Recipe { std::vector steps; // 検査範囲(画像ピクセル座標)。空のときは画像全体を検査。複数指定すると各範囲を合算。 // 本アプリの処理ステップは寸法を変えないため、ROI は全ステップで同座標系で有効。 std::vector rois; }; } // namespace core