//using HalconDotNet; //using System; //using System.Collections.Generic; //using System.Drawing.Imaging; //using System.IO; //namespace HalconTemplateMatch //{ // public class LogoMatcher // { // private List modelHandles = new List(); // /// // /// 从文件加载多个模板 // /// // public void LoadTemplates(string dir) // { // foreach (var file in Directory.GetFiles(dir, "*.shm")) // { // HTuple modelID; // HOperatorSet.ReadShapeModel(file, out modelID); // modelHandles.Add(modelID); // Console.WriteLine($"加载模板: {file}"); // } // } // /// // /// 在测试图像中查找 Logo // /// // /// true = OK,false = NG // public bool FindLogo(string testImagePath) // { // HObject ho_TestImage; // HOperatorSet.ReadImage(out ho_TestImage, testImagePath); // HOperatorSet.Rgb1ToGray(ho_TestImage, out ho_TestImage); // foreach (var modelID in modelHandles) // { // HOperatorSet.FindShapeModel( // ho_TestImage, // modelID, // new HTuple(0).TupleRad(), // new HTuple(360).TupleRad(), // 0.5, // 最低分数 // 1, // 最大匹配数 // 0.5, // 重叠度 // "least_squares", // 0, // 0.9, // out HTuple row, // out HTuple col, // out HTuple angle, // out HTuple score); // if (score.Length > 0 && score[0].D > 0.5) // { // Console.WriteLine($"找到 Logo: Row={row[0]}, Col={col[0]}, Score={score[0]}"); // return true; // 找到即返回成功 // } // } // return false; // 没找到 // } // /// // /// 重载FindLogo函数(double返回) // /// // /// // /// // public double FindLogo(Bitmap bmp) // { // // Bitmap 转 HObject // HObject ho_TestImage; // Bitmap2HObject(bmp, out ho_TestImage); // HOperatorSet.Rgb1ToGray(ho_TestImage, out ho_TestImage); // double bestScore = -1; // foreach (var modelID in modelHandles) // { // HOperatorSet.FindShapeModel( // ho_TestImage, // modelID, // new HTuple(0).TupleRad(), // new HTuple(360).TupleRad(), // 0.5, // 最低分数 // 1, // 最大匹配数 // 0.5, // 重叠度 // "least_squares", // 0, // 0.9, // out HTuple row, // out HTuple col, // out HTuple angle, // out HTuple score); // if (score.Length > 0 && score[0].D > bestScore) // { // bestScore = score[0].D; // } // } // ho_TestImage.Dispose(); // return bestScore; // -1 = 没找到 // } // /// // /// Bitmap 转 Halcon HObject // /// // private void Bitmap2HObject(Bitmap bmp, out HObject hobj) // { // HOperatorSet.GenEmptyObj(out hobj); // Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height); // BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); // try // { // HOperatorSet.GenImageInterleaved( // out hobj, // bmpData.Scan0, // "bgr", // Bitmap 默认是 BGR // bmp.Width, // bmp.Height, // 0, // "byte", // bmp.Width, // bmp.Height, // 0, // 0, // -1, // 0 // ); // } // finally // { // bmp.UnlockBits(bmpData); // } // } // } //} using HalconDotNet; using NPOI.OpenXmlFormats.Vml; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.IO; namespace HalconTemplateMatch { public class LogoMatcher { private readonly List modelHandles = new List(); /// /// 从指定目录加载所有 .shm 模板文件 /// public void LoadTemplates(string dir) { try { string fullPath = Path.GetFullPath(dir); if (!Directory.Exists(fullPath)) { Console.WriteLine($"[警告] 模型目录不存在: {fullPath}"); return; } string[] modelFiles = Directory.GetFiles(fullPath, "*.shm", SearchOption.TopDirectoryOnly); if (modelFiles.Length == 0) { Console.WriteLine($"[警告] 模型目录中没有任何 .shm 文件: {fullPath}"); return; } foreach (var file in modelFiles) { try { HTuple modelID; HOperatorSet.ReadShapeModel(file, out modelID); modelHandles.Add(modelID); Console.WriteLine($"[加载成功] 模板: {file}"); } catch (HOperatorException ex) { Console.WriteLine($"[错误] 无法加载模板 {file}: {ex.Message}"); } } if (modelHandles.Count == 0) { Console.WriteLine($"[警告] 没有成功加载任何模板文件。"); } } catch (Exception ex) { Console.WriteLine($"[异常] 加载模板目录出错: {ex.Message}"); } } /// /// 匹配并返回最高得分(double返回) /// public double FindLogo(Bitmap bmp) { if (modelHandles.Count == 0) { Console.WriteLine("[警告] 尚未加载任何模板。"); return -1; } // Bitmap 转 Halcon 对象 HObject ho_TestImage; Bitmap2HObject(bmp, out ho_TestImage); HOperatorSet.Rgb1ToGray(ho_TestImage, out ho_TestImage); double bestScore = -1; foreach (var modelID in modelHandles) { try { HOperatorSet.FindScaledShapeModel( ho_TestImage, modelID, new HTuple(0).TupleRad(), new HTuple(360).TupleRad(), 0.8, 1.2, 0.5, 1, 0.5, "least_squares_high", 0, 0.9, out HTuple row, out HTuple col, out HTuple angle, out HTuple scale, out HTuple score ); if (score.Length > 0 && score[0].D > bestScore) bestScore = score[0].D; } catch (HOperatorException ex) { Console.WriteLine($"[错误] 模板匹配失败: {ex.Message}"); } } ho_TestImage.Dispose(); return bestScore; } /// /// Bitmap 转 Halcon HObject /// private void Bitmap2HObject(Bitmap bmp, out HObject hobj) { HOperatorSet.GenEmptyObj(out hobj); Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height); BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); try { HOperatorSet.GenImageInterleaved( out hobj, bmpData.Scan0, "bgr", bmp.Width, bmp.Height, 0, "byte", bmp.Width, bmp.Height, 0, 0, -1, 0); } finally { bmp.UnlockBits(bmpData); } } } }