using HalconDotNet;
using System;
using System.Collections.Generic;
using System.IO;
namespace HalconTemplateMatch
{
    public class LogoTemplateTrainer
    {
        /// 
        /// 从多张样本图像生成模板并保存到文件
        /// 
        /// 训练图片路径集合
        /// 模板保存目录
        public void TrainAndSaveTemplates(List imagePaths, string saveDir)
        {
            if (!Directory.Exists(saveDir))
                Directory.CreateDirectory(saveDir);
            int index = 0;
            foreach (var path in imagePaths)
            {
                HObject ho_Image;
                HOperatorSet.ReadImage(out ho_Image, path);
                // 转灰度
                HOperatorSet.Rgb1ToGray(ho_Image, out HObject ho_Gray);
                // 二值化
                HOperatorSet.Threshold(ho_Gray, out HObject ho_Region, 128, 255);
                // 提取连通域
                HOperatorSet.Connection(ho_Region, out HObject ho_Connected);
                HOperatorSet.SelectShapeStd(ho_Connected, out HObject ho_Selected, "max_area", 70);
                // ROI 约束
                HOperatorSet.ReduceDomain(ho_Gray, ho_Selected, out HObject ho_ROI);
                // 创建形状模板
                HTuple modelID;
                HOperatorSet.CreateShapeModel(
                    ho_ROI,
                    "auto",
                    new HTuple(0).TupleRad(),
                    new HTuple(360).TupleRad(),
                    "auto",
                    "auto",
                    "use_polarity",
                    "auto",
                    "auto",
                    out modelID);
                // 保存模板到文件
                string modelFile = Path.Combine(saveDir, $"logo_model_{index}.shm");
                HOperatorSet.WriteShapeModel(modelID, modelFile);
                Console.WriteLine($"训练完成并保存模板: {modelFile}");
                index++;
            }
        }
    }
}