WPF+Halcon 培训项目实战(13):HS 鼠标绘制图形

发布时间:2024年01月01日

前言

为了更好地去学习WPF+Halcon,我决定去报个班学一下。原因无非是想换个工作。相关的教学视频来源于下方的Up主的提供的教程。这里只做笔记分享,想要源码或者教学视频可以和他联系一下。

相关链接

微软系列技术教程 WPF 年度公益课程

Halcon开发 CSDN博客专栏

个人学习的Gitee 项目地址仓库

项目专栏

WPF+Halcon实战项目

运行环境

  • .net core 8.0
  • visual studio 2022
  • halcon HDevelop 20.11
  • windows 11

匹配图片

在这里插入图片描述

矩形鼠标绘制

在Halcon中绘制分为三种方式:

  • 直接绘制
  • 生成之后拖动缩放
  • 鼠标直接框选

前两种方式之前的博客已经讲解过了,这次我们讲解第三种方式。

Halcon添加右键事件

Halcon DrawRegion()后会阻塞直到右键按下,请问如何主动取消绘制区域

我们需要右键的时候取消Halcon绘制事件

在这里插入图片描述

Task封装

在Halcon中,绘制图案是会导致UI线程锁死的。这里我们需要用到Task任务

C# Task任务详解

添加Halcon任务

  /// <summary>
  /// 绘制图片,返回回调函数
  /// </summary>
  /// <param name="callback"></param>
  /// <returns></returns>
  public override Task Draw(Action callback)
  {
      //防止出现多个鼠标绘制任务。强制前一个任务放开
      HalconAPI.CancelDraw();
      HTuple row1 = new HTuple();
      HTuple row2 = new HTuple();
      HTuple column1 = new HTuple();
      HTuple column2 = new HTuple();

      //double row1,row2,column1,column2;
      HOperatorSet.DrawRectangle1(WindowControlWPF.HalconWindow, out row1, out column1, out row2, out column2);
      //WindowControlWPF.HalconWindow.DrawRectangle1(out row1, out column1, out row2, out column2);
      Row1 = row1;
      Row2 = row2;
      Column1 = column1;
      Column2 = column2;

      //获取接触的ROI区域
      Reduce();

      callback();
      return Task.CompletedTask;
  }

按钮点击事件


        private void DrawRectByMouse()
        {
            HRectangleObjByMouse = new HRectangleObj(HalconWindow, hImage);
            //新建异步,防止阻塞UI
            Task.Run(() => HRectangleObjByMouse.Draw(() =>
            {
                //打印绘制结果
                MsgHelper.Success("鼠标绘图绘制成功!" + HRectangleObjByMouse.ToString());
            }));

        }

运行结果

在这里插入图片描述

个人引用问题

我写代码的时候出现了一个空值的异常,非常的奇怪

C#怎么判断2个对象引用的是同一个地址

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

按理来说的添加的HalconWindow是引用类型,引用类型存的相对应用的空间应该是一样的。

原因推测

初始HS
Rect.HS赋值
初始HS指向新的HS,是开辟了一个新的空间
Rect.HS和初始的HS赋值不同

内存地址简称n,person1的内存地址简称n1


//p1 = n1
 Person person1 = new Person();
 //p2 = n2
 Person person2 = new Person();
 //p3 = n3
 Person person3 = new Person();
 //p3= n1
 person3 = person1;
// p1 = n2
 person1 = person2;

//比较p1和p3,因为p1和p3的内存指向发生了变化,p1=n2,p3=n1,所以内存地址不同,不是同一个对象
 Console.WriteLine(object.ReferenceEquals(person1,person3)); //False

圆形鼠标绘制

代码

圆形绘制代码

     public override Task Draw(Action callback)
     {
         //防止出现多个鼠标绘制任务。强制前一个任务放开
         HalconAPI.CancelDraw();
         HTuple row = new HTuple();
         HTuple column = new HTuple();
         HTuple radius = new HTuple();

         //double row1,row2,column1,column2;
         HOperatorSet.DrawCircle(WindowControlWPF.HalconWindow, out row, out column, out radius);
         //WindowControlWPF.HalconWindow.DrawRectangle1(out row1, out column1, out row2, out column2);
         Row = row;
         Column = column;
         Radius = radius;

         //获取接触的ROI区域
         Reduce();

         callback();
         return Task.CompletedTask;
     }

圆形鼠标绘制按钮

        private void DrawCircleByMouse()
        {
            HCircleObjByMouse = new HCircleObj(HalconWindow, hImage);

            MsgHelper.Info("请添加鼠标绘制任务!");

            //新建异步,防止阻塞UI
            Task.Run(() => HCircleObjByMouse.Draw(() =>
            {
                //打印绘制结果
                MsgHelper.Success("鼠标绘图绘制成功!" + HCircleObjByMouse.ToString());
            }));
        }

运行结果

在这里插入图片描述

后面安排

我们的Halcon部分代码已经全部结束了。后面主要就是讲解偏WPF的相关开发。

文章来源:https://blog.csdn.net/qq_44695769/article/details/135313429
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。