文章目录
- 前言
- 相关链接
- 项目专栏
- 运行环境
- 匹配图片
- 矩形鼠标绘制
- 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);
//新建异步,防止阻塞UI
Task.Run(() => HRectangleObjByMouse.Draw(() =>
{
//打印绘制结果
MsgHelper.Success("鼠标绘图绘制成功!" + HRectangleObjByMouse.ToString());
}));
}
运行结果
个人引用问题
我写代码的时候出现了一个空值的异常,非常的奇怪
C#怎么判断2个对象引用的是同一个地址
按理来说的添加的HalconWindow是引用类型,引用类型存的相对应用的空间应该是一样的。
原因推测
内存地址简称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的相关开发。