文章目录
- 前言
- 相关链接
- 项目专栏
- 运行环境
- 匹配图片
- 矩形鼠标绘制
- Halcon添加右键事件
- Task封装
- 运行结果
- 个人引用问题
- 原因推测
- 圆形鼠标绘制
- 代码
- 运行结果
- 课程完结:
前言
为了更好地去学习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);//新建异步,防止阻塞UITask.Run(() => HRectangleObjByMouse.Draw(() =>{//打印绘制结果MsgHelper.Success("鼠标绘图绘制成功!" + HRectangleObjByMouse.ToString());}));}
运行结果
个人引用问题
我写代码的时候出现了一个空值的异常,非常的奇怪
C#怎么判断2个对象引用的是同一个地址
按理来说的添加的HalconWindow是引用类型,引用类型存的相对应用的空间应该是一样的。
原因推测
内存地址简称n,person1的内存地址简称n1
//p1 = n1Person person1 = new Person();//p2 = n2Person person2 = new Person();//p3 = n3Person person3 = new Person();//p3= n1person3 = person1;
// p1 = n2person1 = 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("请添加鼠标绘制任务!");//新建异步,防止阻塞UITask.Run(() => HCircleObjByMouse.Draw(() =>{//打印绘制结果MsgHelper.Success("鼠标绘图绘制成功!" + HCircleObjByMouse.ToString());}));}
运行结果
课程完结:
我们的Halcon部分代码已经全部结束了。后面主要就是讲解偏WPF的相关开发。我这个记录只是做一个思路,就是跑通WPF和Halcon对接的一些功能。后面的往上做就是把WPF部分或者Halcon部分往上做了。这里就不做更多的说明了。
个人目前的安排就是去了解一些OpenCV。了解就是OpenCV是怎么跑的,怎么用的,环境怎么配置。Python也顺便了解一下。
目前个人的打算是明年3月份左右开始找工作,顺利的话大概4月份就能入职了。再干个一两年看看,实在不行就回家摆烂了。