| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- using System;
- using System.Collections.Generic;
- using System.Threading;
- using HalconDotNet;
- using TeamAAS.FlowEditor.Execution;
- using TeamAAS.FlowEditor.Models;
- using TeamAAS.FlowEditor.Plugins;
- using Plugins.Halcon.Models;
- using Plugins.Halcon;
- namespace Plugins.Halcon
- {
- // ─────────────────────────────────────────────────────────────────────
- // HALCON 检测识别分类算子(新增)。
- // ─────────────────────────────────────────────────────────────────────
- /// <summary>H边缘提取:Sobel 梯度 + 阈值,输出边缘区域(可配合形状筛选取感兴趣边缘)。</summary>
- [Serializable]
- [Plugin("H边缘提取", PluginCategory.Halocn模块, typeof(HalconEdgeModel), "VectorLine",
- NodeShape = NodeCategory.Normal, IsSubFlowNode = true, VisionCategory = VisionPlugin.检测识别,
- Description = "Sobel 边缘提取:梯度幅值 + 灰度阈值 → 边缘区域;高级编辑可加载图像调试")]
- public class HalconEdgePlugin : BasePlugin<HalconEdgeModel>
- {
- public override List<OutputField> DeclareOutputs() => new List<OutputField>
- {
- new OutputField("边缘区域", typeof(object)),
- new OutputField("结果", typeof(bool)),
- };
- public override NodeRunStatus PluginRun(CancellationToken token, out Dictionary<string, object> results)
- {
- var res = new Dictionary<string, object>();
- results = res;
- NodeRunStatus Fail(string m) { res["Error"] = m; res["结果"] = false; Log(1, $"边缘提取失败: {m}", TeamAAS.LogLevel.Error); return NodeRunStatus.Failed; }
- bool owned = false;
- HObject image = null;
- HObject edgeAmp = null;
- try
- {
- var src = GetResolve(Model.ImageSource);
- if (src == null) return Fail("未获取到输入图像(请绑定「输入图像」,例如 &{输入.图像})");
- owned = !(src is HObject);
- image = HalconRuntime.ToHObject(src);
- Log(3, $"边缘提取:Sobel[{Model.FilterType}] 孔径={Model.ApertureSize},阈值[{Model.MinGray},{Model.MaxGray}]");
- HOperatorSet.SobelAmp(image, out edgeAmp, Model.FilterType, Model.ApertureSize);
- var edges = HalconRuntime.Threshold(edgeAmp, Model.MinGray, Model.MaxGray);
- res["边缘区域"] = edges;
- res["结果"] = true;
- HalconEditorPreview.Show(Model, src, edges, "green"); // 底图 + 边缘叠加
- Log(2, $"边缘提取完成:区域对象数={HalconRuntime.CountObj(edges)}");
- return NodeRunStatus.Success;
- }
- catch (Exception ex) { return Fail(ex.Message); }
- finally
- {
- if (edgeAmp != null) { try { edgeAmp.Dispose(); } catch { } }
- if (owned) HalconRuntime.Dispose(image);
- }
- }
- }
- }
- namespace Plugins.Halcon.Models
- {
- using PropertyGridLib.Attributes;
- using PropertyGridLib.Controls;
- using System.ComponentModel;
- using TeamAAS.FlowEditor.Plugins;
- using TeamAAS.FlowEngine.FormulaData;
- /// <summary>边缘提取模型。</summary>
- [Serializable]
- public class HalconEdgeModel : HalconOperatorModelBase
- {
- [Category("I.输入")]
- [DisplayName("1.输入图像")]
- [Description("上游图像(GenImage/HObject)。子流程内通常绑定 &{输入.图像}")]
- [FormulaEditor(typeof(PluginDataProvider))]
- public FormulaBound<object> ImageSource { get; set; } = new FormulaBound<object>();
- [Category("II.参数")]
- [DisplayName("1.滤波类型")]
- [Description("Sobel 算子组合方式:sum_abs(常用)/sum_sqrt/sum_col/sum_row")]
- public string FilterType { get; set; } = "sum_abs";
- [Category("II.参数")]
- [DisplayName("2.孔径尺寸")]
- [Description("Sobel 滤波核尺寸(奇数):3/5/7,越大抗噪越强、定位越粗")]
- public int ApertureSize { get; set; } = 3;
- [Category("II.参数")]
- [DisplayName("3.最小梯度")]
- [Description("梯度阈值下限(含),低于此梯度不视为边缘")]
- public int MinGray { get; set; } = 30;
- [Category("II.参数")]
- [DisplayName("4.最大梯度")]
- [Description("梯度阈值上限(含)")]
- public int MaxGray { get; set; } = 255;
- }
- }
|