WPF之算法的单例模式

在这里插入图片描述

全局变量

    public class GlobalParamters
    {

        //一 加载halcon引擎
        public static HDevEngine myEngine = new HDevEngine();

        public static bool IsDeug = false;
    }

ZWModel

    /// <summary>
    /// 检测脏污参数
    /// </summary>
    public class ZWModel
    {
        [Category("缺陷检测参数"), Description("宽度阈值,高于阈值,算缺陷")]
        public double Width_Thre { get; set; } = 10;
        [Category("缺陷检测参数"), Description("高度阈值,高于阈值,算缺陷")]
        public double Height_Thre { get; set; } = 10;
        [Category("缺陷检测参数"), Description("面积阈值,高于阈值,算缺陷")]
        public double Area_Thre { get; set; } = 100;
    }

一 HalconAlgo

using HalconDotNet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WPF之AOI缺陷检测软件.Models;

namespace WPF之AOI缺陷检测软件.Algorithm
{
    /// <summary>
    /// Halcon算法类
    /// </summary>
    public class HalconAlgo
    {
        //一 加载halcon引擎
        //二 设置halcon引擎初始化halcon文件位置
        //三 获取调用方法
        //四 初始化程序调用变量
        //五 设置输入参数
        //六 运行执行函数
        //七获得运行的结果


        public HalconAlgo()
        {
            //二 设置halcon引擎初始化halcon文件位置
            GlobalParamters.myEngine.SetProcedurePath(@"C:\\Users\\Jumy\\Desktop\\工业机器视觉之AOI外观检测软件(WinForm+Halcon+海康相机)-V1\\代码程序\\四 算法模块");
        }

        public HObject DetectZW(HObject image, ZWModel zWModel)
        {


            //三 获取调用方法
            HDevProcedure fun1 = new HDevProcedure("DetectZW2");

            //四 初始化程序调用变量
            HDevProcedureCall fun1_call = new HDevProcedureCall(fun1);
            //五 设置输入参数
            fun1_call.SetInputIconicParamObject("Image", image);
            //六 运行执行函数
            if (GlobalParamters.IsDeug)
            {
                fun1_call.SetWaitForDebugConnection(true);

            }
            else
            {
                fun1_call.SetWaitForDebugConnection(false);
            }

            fun1_call.Execute();

            //七获得运行的结果


            HObject defectRegion = fun1_call.GetOutputIconicParamObject("SelectedRegions1");


            double areaThre = zWModel.Area_Thre;
            double widthThre = zWModel.Width_Thre;
            double heightThre = zWModel.Height_Thre;


            HOperatorSet.RegionFeatures(defectRegion, "area", out HTuple Area);
            HOperatorSet.RegionFeatures(defectRegion, "width", out HTuple Width);
            HOperatorSet.RegionFeatures(defectRegion, "height", out HTuple Height);


            if (Area.Length > 0)
            {
                // 任意一个参数超过阈值我们就返回缺陷区域,否则返回null
                if (Area.D >= areaThre || Width.D >= widthThre || Height.D >= heightThre)
                {
                    return defectRegion;

                }
                else
                {
                    return null;
                }



            }
            else
            {
                return null;
            }




        }
    }
}

二 AlgorithmService

using HalconDotNet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WPF之AOI缺陷检测软件.Models;

namespace WPF之AOI缺陷检测软件.Algorithm
{
    public class AlgorithmService
    {
        //1. 私有静态变量(在第四步供外界使用),创建类的实例
        //2. 私有构造函数,确保外部无法直接实例化(确保是单个实例)
        //3. 确定供外界调用的代码资源
        //4. 公开静态属性,供外界使用(把第一步类的实例,开放出去)
        //5. 外界使用

        //1. 私有静态变量(在第四步供外界使用),创建类的实例
        private static AlgorithmService instance = new AlgorithmService();



        //2. 私有构造函数,确保外部无法直接实例化(确保是单个实例)
        private AlgorithmService()
        {

        }

        //4. 公开静态属性,供外界使用(把第一步类的实例,开放出去)
        public static AlgorithmService Instance
        {
            get { return instance; }
        }



        //3. 确定供外界调用的代码资源
        public HalconAlgo halconAlgo = new HalconAlgo();


        /// <summary>
        /// 检测脏污缺陷
        /// </summary>
        /// <param name="image"></param>
        /// <param name="zWModel"></param>
        /// <returns></returns>
        public HObject DetectZW(HObject image, ZWModel zWModel)
        {
            return halconAlgo.DetectZW(image, zWModel);
        }

    }
}

三 UI

3.1 安装:Extended.Wpf.Toolkit

在这里插入图片描述

3.2 UI

在这里插入图片描述

引入命名空间

        xmlns:extoolkit="http://schemas.xceed.com/wpf/xaml/toolkit"
 <!--缺陷检测界面-->
 <TabItem Header="缺陷检测">
     <Grid >
         <Grid.ColumnDefinitions>
             <ColumnDefinition Width="2*"/>
             <ColumnDefinition Width="6*"/>
             <ColumnDefinition Width="2*"/>
         </Grid.ColumnDefinitions>

         <extoolkit:PropertyGrid Name="propertyGrid_DefectParams" Background="AliceBlue" Grid.Column="0" ></extoolkit:PropertyGrid>

         <WindowsFormsHost Grid.Column="1">
             <halconTool:HWindow_Final x:Name="hWindow_Final_DetectWin"/>
         </WindowsFormsHost>

         <StackPanel Grid.Column="2">
             <Button x:Name="btn_LoadImage_MaoCi" Content="加载图像" Margin="10" Command="{Binding btn_LoadImage_MaoCi_Command}"></Button>
             <Button x:Name="btn_Detect" Content="缺陷检测" Margin="10" Command="{Binding btn_Detect_Command}" Cursor="Hand"></Button>
             <Button x:Name="btn_SaveParams" Content="保存算法参数" Margin="10" Command="{Binding btn_SaveParams_Command}" Cursor="Hand"></Button>

         </StackPanel>



     </Grid>


 </TabItem>

加载图像命令

        #region 加载图像

        public RelayCommand btn_LoadImage_MaoCi_Command
        {
            get { return new RelayCommand(LoadImage); }
        }

        HObject CurrImage;


        public void LoadImage()
        {

            System.Windows.Forms.OpenFileDialog fileDialog = new System.Windows.Forms.OpenFileDialog();

            if (fileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                string fileName = fileDialog.FileName;
                // 根据路径,输出图像
                HOperatorSet.ReadImage(out CurrImage, fileName);
                Application.Current.Dispatcher.BeginInvoke((Action)(() => {
                    // 1.获取到_mainWindow窗口
                    var _mainWindow = Application.Current.Windows.Cast<Window>().FirstOrDefault(window => window is MainWindow) as MainWindow;
                    // 2.获取窗口上的Halcon的显示控件,显示图像
                    _mainWindow.hWindow_Final_DetectWin.HobjectToHimage(CurrImage);
                }));
            }

        }
        #endregion

检测缺陷命令

    #region 检测缺陷

    public RelayCommand btn_Detect_Command
    {
        get { return new RelayCommand(DetectImage); }
    }


    public void DetectImage()
    {


        Application.Current.Dispatcher.BeginInvoke((Action)(() => {

            // 1.获取到_mainWindow窗口
            var _mainWindow = Application.Current.Windows.Cast<Window>().FirstOrDefault(window => window is MainWindow) as MainWindow;

            HObject ZWRegion = AlgorithmService.Instance.DetectZW(CurrImage, (ZWModel)(_mainWindow.propertyGrid_DefectParams.SelectedObject));


            // 2.获取窗口上的Halcon的显示控件,显示图像
            _mainWindow.hWindow_Final_DetectWin.HobjectToHimage(CurrImage);


            if (ZWRegion != null)
            {
                _mainWindow.hWindow_Final_DetectWin.DispObj(ZWRegion, "red");

            }
        }));

    }
    #endregion

保存算法参数

  #region 保存算法参数

  public RelayCommand btn_SaveParams_Command
  {
      get { return new RelayCommand(SaveParams); }
  }


  public void SaveParams()
  {


      Application.Current.Dispatcher.BeginInvoke((Action)(() => {

          // 1.获取到_mainWindow窗口
          var _mainWindow = Application.Current.Windows.Cast<Window>().FirstOrDefault(window => window is MainWindow) as MainWindow;


          ZWModel zWModelParam = (ZWModel)_mainWindow.propertyGrid_DefectParams.SelectedObject;


          XmlSerializerHelper.WriteXML(zWModelParam, @"D:\\AOI外观检测软件参数\\ZWModel.xml", typeof(ZWModel));

          MessageBox.Show("保存成功!");
      }));

  }
  #endregion

加载算法参数

        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = new MainWindowViewModel();
            // 读取XML文件
            if (File.Exists(@"D:\\AOI外观检测软件参数\\ZWModel.xml"))
            {
                propertyGrid_DefectParams.SelectedObject = XmlSerializerHelper.ReadXML(@"D:\\AOI外观检测软件参数\\ZWModel.xml", typeof(ZWModel));
            }
            else
            {
                // 加载模板匹配参数
                propertyGrid_DefectParams.SelectedObject = new ZWModel();
            }

        }
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐