为了更好地去学习WPF+Halcon,我决定去报个班学一下。原因无非是想换个工作。相关的教学视频来源于下方的Up主的提供的教程。这里只做笔记分享,想要源码或者教学视频可以和他联系一下。
在Halcon中绘制分为三种方式:
前两种方式之前的博客已经讲解过了,这次我们讲解第三种方式。
我们需要右键的时候取消Halcon绘制事件
在Halcon中,绘制图案是会导致UI线程锁死的。这里我们需要用到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());
}));
}
我写代码的时候出现了一个空值的异常,非常的奇怪
按理来说的添加的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的相关开发。