Halcon WPF 开发学习笔记(4):Halcon 锚点坐标打印

文章目录

专栏

Halcon开发 博客专栏
WPF/HALCON机器视觉合集

前言

Halcon控件C#开发是我们必须掌握的,因为只是单纯的引用脚本灵活性过低,我们要拥有Halcon辅助开发的能力

锚点开发是我们常用的开发方式,用于寻找相似点。如图为锚点

锚点二次开发

添加回调函数

回调函数在HDrawingObject的OnDrag函数中,

csharp 复制代码
/// <summary>
/// 画圆
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button_Click_1(object sender, RoutedEventArgs e)
{

    //创建一个圆形,圆心为(100,100),半径为50
    var drawingObject = HDrawingObject.
        CreateDrawingObject(HDrawingObject.HDrawingObjectType.CIRCLE, new HTuple[] { 100, 100, 50 });

    //添加回调
    drawingObject.OnDrag(HDrawingObjectCallbackClass);
    //临时存放List
    drawingObjects.Add(drawingObject);

    //将圆画再hSmart画布上面
    hSmart.HalconWindow.AttachDrawingObjectToWindow(drawingObject);
	

}


/// <summary>
/// 回调函数
/// </summary>
/// <param name="drawid">回调物体</param>
/// <param name="window">窗体</param>
/// <param name="type">类型</param>
public void HDrawingObjectCallbackClass(HDrawingObject drawid, HWindow window, string type)
{
	//由于是圆形锚点,所以有x,y,radius三个属性
	var htuples = new HTuple[] {
	    drawid.GetDrawingObjectParams("row"),//x轴坐标
	    drawid.GetDrawingObjectParams("column"),//y轴坐标
	    drawid.GetDrawingObjectParams("radius"),//半径
	};

}

辅助Model类

在Halcon控件中,每个被创建的控件都会有一个唯一的ID,用于区别每个的信息。如果我想实时更新被拖动锚点的坐标,我就需要去调用HDrawingObject的GetDrawingObjectParams方法,就比较麻烦。所以我们可以通过自定义一个类用于方便的管理

csharp 复制代码
/// <summary>
/// 因为HDrawingObject没有坐标参数,所以我们为了方便操作添加创建了一个HDrawingObjectModel
/// </summary>
public class HDrawingObject_CircleModel
{
    public HTuple? Row { get; set; }

    public HTuple? Column { get; set; }

    public HTuple? Radius { get; set; }

    public readonly HDrawingObject HDrawingObject;

    public readonly long Id;

    public HDrawingObject_CircleModel(HDrawingObject hDrawingObject)
    {
        HDrawingObject = hDrawingObject;
        Id = HDrawingObject.ID;

        Update(HDrawingObject);
    }



    public void Print()
    {
        System.Diagnostics.Debug.WriteLine($"id:[{HDrawingObject.ID}],row:[{Row}],column:[{Column}],radius:[{Radius}]");

    }

    public void Update(HDrawingObject hDrawingObject)
    {
        Row = hDrawingObject.GetDrawingObjectParams("row");
        Column = hDrawingObject.GetDrawingObjectParams("column");
        Radius = hDrawingObject.GetDrawingObjectParams("radius");
    }

}

然后我们新建一个List用于存放新增的锚点

csharp 复制代码
/// <summary>
/// 用来存放后面所有新增的锚点
/// </summary>
private List<HDrawingObject_CircleModel> drawingObjects;

更新点击事件代码

csharp 复制代码
/// <summary>
/// 画圆
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button_Click_1(object sender, RoutedEventArgs e)
{

    //创建一个圆形,圆心为(100,100),半径为50
    var drawingObject = HDrawingObject.
        CreateDrawingObject(HDrawingObject.HDrawingObjectType.CIRCLE, new HTuple[] { 100, 100, 50 });

    //----添加回调---
	//添加拖拽回调
	drawingObject.OnDrag(HDrawingObjectCallbackClass);
	//放缩变化
	drawingObject.OnResize(HDrawingObjectCallbackClass);

    var model = new HDrawingObject_CircleModel(drawingObject);
    //临时存放List
    drawingObjects.Add(model);
    model.Print();

    //将圆画再hSmart画布上面
    hSmart.HalconWindow.AttachDrawingObjectToWindow(drawingObject);


}

/// <summary>
/// 回调函数
/// </summary>
/// <param name="drawingObject">回调物体</param>
/// <param name="window">窗体</param>
/// <param name="type">类型</param>
public void HDrawingObjectCallbackClass(HDrawingObject drawid, HWindow window, string type)
{

    var drawObj = drawingObjects.FirstOrDefault(t => t.HDrawingObject.ID.Equals(drawid.ID));

    //如果不为空则打印
    if (drawObj != null)
    {
        drawObj.Update(drawid);
        drawObj.Print();
    }
    else
    {
        Debug.WriteLine($"drawid.id[{drawid.ID} is not find!]");
    }

}

结果

下集预告

下一期我将会讲解如何使用Halcon和C#进行混合开发,因为难度较大,所以我会咕咕咕一段时间,去了解一下怎么使用。应该是难度不大的,就是把Halcon的语言翻译一下。

相关推荐
Hello_Embed4 小时前
STM32HAL 快速入门(二十):UART 中断改进 —— 环形缓冲区解决数据丢失
笔记·stm32·单片机·学习·嵌入式软件
咸甜适中4 小时前
rust语言 (1.88) 学习笔记:客户端和服务器端同在一个项目中
笔记·学习·rust
Grassto5 小时前
RAG 从入门到放弃?丐版 demo 实战笔记(go+python)
笔记
Magnetic_h5 小时前
【iOS】设计模式复习
笔记·学习·ios·设计模式·objective-c·cocoa
研梦非凡6 小时前
ICCV 2025|从粗到细:用于高效3D高斯溅射的可学习离散小波变换
人工智能·深度学习·学习·3d
limengshi1383927 小时前
机器学习面试:请介绍几种常用的学习率衰减方式
人工智能·学习·机器学习
知识分享小能手7 小时前
React学习教程,从入门到精通,React 组件核心语法知识点详解(类组件体系)(19)
前端·javascript·vue.js·学习·react.js·react·anti-design-vue
周周记笔记8 小时前
学习笔记:第一个Python程序
笔记·学习
丑小鸭是白天鹅8 小时前
Kotlin协程详细笔记之切线程和挂起函数
开发语言·笔记·kotlin
潘达斯奈基~8 小时前
《大数据之路1》笔记2:数据模型
大数据·笔记