| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- using System;
- using System.Collections.Generic;
- using System.Threading;
- using TeamAAS.FlowEditor.Execution;
- using TeamAAS.FlowEditor.Models;
- using TeamAAS.FlowEditor.Plugins;
- using Plugins.Vpp.Models;
- namespace Plugins.Vpp
- {
- // ─────────────────────────────────────────────────────────────────────
- // VisionPro 检测识别算子(算子级节点)。
- // 属性面板开放:输入图像绑定 + 高级编辑按钮(进原生工具界面改区域/参数/调试);
- // 工具实例随流程文件序列化,配置不丢。与 Halcon 算子操作习惯一致。
- // ─────────────────────────────────────────────────────────────────────
- /// <summary>VpBlob 分析:Blob 斑点分析,输出数量与重心。</summary>
- [Serializable]
- [Plugin("VpBlob分析", PluginCategory.Vpp模块, typeof(VpBlobModel), "EllipseOutline",
- NodeShape = NodeCategory.Normal, IsSubFlowNode = true, VisionCategory = VisionPlugin.检测识别,
- Description = "Cognex Blob 斑点分析:属性面板绑定图像,高级编辑进原生界面设置区域/极性;输出数量与重心")]
- public class VpBlobPlugin : VpToolPluginBase<VpBlobModel>
- {
- protected override string ToolTypeName => "CogBlobTool";
- /// <summary>预设终端:Blob 官方测量项(GetMeasure 机制;测量需在原生编辑器 Measurements 页启用后才有值)。</summary>
- public override VpPresetTerminal[] PresetTerminals => new[]
- {
- new VpPresetTerminal("面积1", "Results.GetBlobs[0]" + VpPresetTerminal.MeasureMarker + "Area"),
- new VpPresetTerminal("重心X1", "Results.GetBlobs[0]" + VpPresetTerminal.MeasureMarker + "CenterMassX"),
- new VpPresetTerminal("重心Y1", "Results.GetBlobs[0]" + VpPresetTerminal.MeasureMarker + "CenterMassY"),
- new VpPresetTerminal("面积2", "Results.GetBlobs[1]" + VpPresetTerminal.MeasureMarker + "Area"),
- new VpPresetTerminal("重心X2", "Results.GetBlobs[1]" + VpPresetTerminal.MeasureMarker + "CenterMassX"),
- new VpPresetTerminal("重心Y2", "Results.GetBlobs[1]" + VpPresetTerminal.MeasureMarker + "CenterMassY"),
- new VpPresetTerminal("周长1", "Results.GetBlobs[0]" + VpPresetTerminal.MeasureMarker + "Perimeter"),
- new VpPresetTerminal("圆度偏差1", "Results.GetBlobs[0]" + VpPresetTerminal.MeasureMarker + "Acircularity"),
- };
- protected override IEnumerable<OutputField> DeclareResultFields()
- {
- yield return new OutputField("数量", typeof(int));
- yield return new OutputField("首个重心行", typeof(double));
- yield return new OutputField("首个重心列", typeof(double));
- }
- protected override void ExtractResults(object tool, Dictionary<string, object> results)
- {
- results["数量"] = Get(tool, "Results.Count") ?? 0;
- results["首个重心行"] = Get(tool, "Results.GetBlobs[0].CenterOfMassX");
- results["首个重心列"] = Get(tool, "Results.GetBlobs[0].CenterOfMassY");
- Log(2, $"Blob 完成:数量={results["数量"]}");
- }
- }
- /// <summary>Vp模板匹配:PMAlign 模板定位,输出数量/分数/位姿。</summary>
- [Serializable]
- [Plugin("Vp模板匹配", PluginCategory.Vpp模块, typeof(VpPMAlignModel), "CrosshairsGps",
- NodeShape = NodeCategory.Normal, IsSubFlowNode = true, VisionCategory = VisionPlugin.检测识别,
- Description = "Cognex PMAlign 模板定位:高级编辑进原生界面训练模板/设置分数阈值;输出数量/分数/位姿")]
- public class VpPMAlignPlugin : VpToolPluginBase<VpPMAlignModel>
- {
- protected override string ToolTypeName => "CogPMAlignTool";
- /// <summary>预设终端:多目标定位(第 2/3 个目标的分数与位姿;第 1 个目标已由 类型化结果 覆盖)。</summary>
- public override VpPresetTerminal[] PresetTerminals => new[]
- {
- new VpPresetTerminal("分数2", "Results[1].Score"),
- new VpPresetTerminal("位置X2", "Results[1].GetPose.TranslationX"),
- new VpPresetTerminal("位置Y2", "Results[1].GetPose.TranslationY"),
- new VpPresetTerminal("角度2", "Results[1].GetPose.Rotation"),
- new VpPresetTerminal("分数3", "Results[2].Score"),
- new VpPresetTerminal("位置X3", "Results[2].GetPose.TranslationX"),
- new VpPresetTerminal("位置Y3", "Results[2].GetPose.TranslationY"),
- new VpPresetTerminal("角度3", "Results[2].GetPose.Rotation"),
- };
- protected override IEnumerable<OutputField> DeclareResultFields()
- {
- yield return new OutputField("数量", typeof(int));
- yield return new OutputField("分数", typeof(double));
- yield return new OutputField("位置X", typeof(double));
- yield return new OutputField("位置Y", typeof(double));
- yield return new OutputField("角度", typeof(double));
- }
- protected override void ExtractResults(object tool, Dictionary<string, object> results)
- {
- results["数量"] = Get(tool, "Results.Count") ?? 0;
- results["分数"] = Get(tool, "Results[0].Score");
- results["位置X"] = Get(tool, "Results[0].GetPose.TranslationX");
- results["位置Y"] = Get(tool, "Results[0].GetPose.TranslationY");
- results["角度"] = Get(tool, "Results[0].GetPose.Rotation");
- Log(2, $"PMAlign 完成:数量={results["数量"]},分数={results["分数"]}");
- }
- }
- }
- namespace Plugins.Vpp.Models
- {
- using TeamAAS.FlowEditor.Plugins;
- /// <summary>VpBlob 分析模型(工具实例/输入绑定/高级编辑按钮均在基类)。</summary>
- [Serializable]
- public class VpBlobModel : VpToolModelBase
- {
- }
- /// <summary>Vp模板匹配模型。</summary>
- [Serializable]
- public class VpPMAlignModel : VpToolModelBase
- {
- }
- }
|