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

文章目录

前言

为了更好地去学习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任务

csharp 复制代码
  /// <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;
  }

按钮点击事件

csharp 复制代码
        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

csharp 复制代码
//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

圆形鼠标绘制

代码

圆形绘制代码

csharp 复制代码
     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;
     }

圆形鼠标绘制按钮

csharp 复制代码
        private void DrawCircleByMouse()
        {
            HCircleObjByMouse = new HCircleObj(HalconWindow, hImage);

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

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

运行结果

课程完结:

我们的Halcon部分代码已经全部结束了。后面主要就是讲解偏WPF的相关开发。我这个记录只是做一个思路,就是跑通WPF和Halcon对接的一些功能。后面的往上做就是把WPF部分或者Halcon部分往上做了。这里就不做更多的说明了。

个人目前的安排就是去了解一些OpenCV。了解就是OpenCV是怎么跑的,怎么用的,环境怎么配置。Python也顺便了解一下。

目前个人的打算是明年3月份左右开始找工作,顺利的话大概4月份就能入职了。再干个一两年看看,实在不行就回家摆烂了。

相关推荐
avi91112 天前
电影开源Jevdo - 源码介绍(vue版)没有android 和 没有wpf
android·wpf·框架·数据爬虫·meego·电影管理
苏州福兰克3 天前
没有3D内容,裸眼3D显示器还能用吗?
3d·计算机外设
豪气的程序猿3 天前
Windows 11 外接键盘偶尔漏键?用键盘小鹿练习前先做双设备对照
计算机外设·电脑
苏州福兰克3 天前
长期看裸眼3D显示器容易视觉疲劳吗?
3d·计算机外设
苏州福兰克3 天前
商用裸眼3D显示器和家用款主要差别在哪里?
3d·计算机外设
Rudon滨海渔村3 天前
台式机Win10实现“音量+”和“音量-”,键盘映射方案
windows·计算机外设·powertoys
吾与谁归in3 天前
C#脚本工具,支持智能提示自动补全(WPF + Roslyn + AvalonEdit)
开发语言·c#·wpf
昂好的day3 天前
WPF 从零入门(上):WPF 是什么、XAML 语法、布局与样式全解
开发语言·c#·wpf
影寂ldy4 天前
WPF导航窗体+Page页面跳转 知识点整理
wpf
He BianGu4 天前
【WPF-Control教程】IOC 依赖注入
c#·wpf·wpf-control