WPF+Halcon 培训项目实战(13):HS 鼠标绘制图形
2024-01-01 16:28:23
前言
为了更好地去学习WPF+Halcon,我决定去报个班学一下。原因无非是想换个工作。相关的教学视频来源于下方的Up主的提供的教程。这里只做笔记分享,想要源码或者教学视频可以和他联系一下。
相关链接
项目专栏
运行环境
- .net core 8.0
- visual studio 2022
- halcon HDevelop 20.11
- windows 11
匹配图片
矩形鼠标绘制
在Halcon中绘制分为三种方式:
- 直接绘制
- 生成之后拖动缩放
- 鼠标直接框选
前两种方式之前的博客已经讲解过了,这次我们讲解第三种方式。
Halcon添加右键事件
我们需要右键的时候取消Halcon绘制事件
Task封装
在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的相关开发。
文章来源:https://blog.csdn.net/qq_44695769/article/details/135313429
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!