【C#】Winform + Halcon实现直线查找

该代码段展示了如何在Halcon环境下创建和应用计量模型来执行线测量。首先,它定义了相关参数,如测量长度、边缘阈值等,然后创建计量模型,并将对象添加到模型中。接着,代码设置了计量参数并应用模型到图像上,获取测量点和结果,并以图形方式显示测量的直线和点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 摘要: 本文描述如何使用Winform + Halcon实现直线查找功能。

  • 前言

    • HALCON 是一款由德国 MVTec 公司开发的功能强大的机器视觉软件,广泛应用于图像处理和机器视觉领域。
    • 它提供了丰富的图像处理算法和工具,支持多种编程语言接口(如 C、C++、C#、Python 等)。
    • 支持在 Windows、Linux 和 macOS 等多种操作系统上运行。
    • 实现步骤

      • 1、​创建计量模型
        • 使用 HMetrologyModel 创建一个计量模型,用于管理直线查找的相关参数和结果。
      • 2、添加计量对象
        • 使用 AddMetrologyObjectLineMeasure 方法,将直线查找的计量对象添加到模型中。需要指定直线的起点和终点,以及测量参数(如测量长度、宽度、阈值等)。
      • 3、设置计量对象参数
        • 通过 SetMetrologyObjectParam 方法,设置直线查找的参数,如测量长度、边缘阈值、边缘选择方式等。
      • 4、应用计量模型
        • 将计量模型应用到目标图像上,执行直线查找。
      • 5 、​获取测量结果
        • 使用 GetMetrologyObjectResult 方法,获取查找到的直线参数(如起点和终点坐标)。
      • 6、​显示结果
        • 使用 HALCON 的绘图功能,在图像上标记查找到的直线和测量点。

  • 环境

    • 操作系统: Windows 11
    • 编程软件: Visual studio 2022
    • .Net版本:. Net Framework 4.6.2
    • Halcon : Halcon 20.11

  • 预览

    • 运行效果1

    在这里插入图片描述

    • 运行效果2

    在这里插入图片描述


  • 代码

    	double r1 = 50.00, c1 = 300.0;
    	double r2 = 150.0, c2 = 300.0;
    	double measureLength1 = 10, measureLength2 = 10;
    	double measureSigma   = 1,  measureThreshold = 10;
    	HTuple genParamName = new HTuple();
    	HTuple genParamValue = new HTuple();
     	//*创建计量模型
     	HMetrologyModel metrologyHandle =new HMetrologyModel();
    	//*添加计量对象到线测量()
     	metrologyHandle.AddMetrologyObjectLineMeasure(r1,c1,r2,c2, 
     	measureLength1, measureLength2, measureSigma, measureThreshold,
    	genParamName, genParamValue);
     	//*设置计量对象参数
     	metrologyHandle.SetMetrologyObjectParam( 0, "measure_length1",100);
     	metrologyHandle.SetMetrologyObjectParam(0, "measure_length2",20);
     	metrologyHandle.SetMetrologyObjectParam(0, "measure_distance",10);
     	//*边缘阈值
     	metrologyHandle.SetMetrologyObjectParam(0, "measure_threshold",10);
     	//*边缘选择
     	metrologyHandle.SetMetrologyObjectParam(0, "measure_select","first");
     	//*过度方式
    	metrologyHandle.SetMetrologyObjectParam(0, "measure_transition","positive");
    	//ho_image为自己创建的HImage对象实例 HImage ho_image = new HImage()
    	//
     	metrologyHandle.ApplyMetrologyModel(ho_image);
     	//*显示测量点
     	HXLDCont contours = new HXLDCont();
     	contours = metrologyHandle.GetMetrologyObjectMeasures(0, "all", out HTuple row, out HTuple column);
     	HXLDCont xldCont = new HXLDCont();
     	xldCont.GenCrossContourXld(row, column, 10, 0.785398);
     	HTuple result = metrologyHandle.GetMetrologyObjectResult(0, "all", "result_type", 
                    new HTuple(new string[] { "row_begin", "column_begin", "row_end", "column_end" }));
     	//*获得测量直线
     	double row_begin = result[0];
     	double column_begin = result[1];
     	double row_end = result[2];
     	double column_end = result[3];
     	HXLDCont xldLine = new HXLDCont();
     	xldLine.GenContourPolygonXld(
     	new HTuple(new double[] { row_begin, row_end }),
     	new HTuple(new double[] { column_begin, column_end })
    	 );
     	//设置颜色并显示
     	//自己封装的方法
     	hWTool.DispObj(contours,"blue");//测量的直线范围
     	hWTool.DispObj(xldLine, "blue");//测量出来的直线
     	hWTool.DispObj(xldCont, "green");//测量出来的点
     	//hWindowControl1为HWindowControl对象实例
     	//hWindowControl1.HalconWindow.SetColor("blue");
     	//hWindowControl1.HalconWindow.DispObj(xldLine);//测量出来的直线
     	//hWindowControl1.HalconWindow.SetColor("red");
     	//hWindowControl1.HalconWindow.DispObj(contours);//测量的直线范围
     	// hWindowControl1.HalconWindow.SetColor("green");
     	//hWindowControl1.HalconWindow.DispObj(xldCont);//测量出来的点
    

  • 结语

    • 即是分享,也是备份
  • 最后

    • 如果有任何疑问,欢迎留言。
    • 如果你觉得这篇文章对你有帮助,不妨点个赞支持一下。
    • 也可以加入微信公众号 [编程笔记in] 社区,交流学习!

### 使用 WinformHalcon 实现 ROI 绘制功能 在 C# 的 Windows Forms 应用程序中,可以利用 HALCON 提供的 `HWindowControl` 控件来实现 ROI(感兴趣区域)的绘制功能。以下是详细的说明以及示例代码。 #### HWindowControl 控件简介 `HWindowControl` 是 HALCON 提供的一个自定义控件,用于嵌入 HALCON 图形窗口到 .NET 环境中。通过该控件,可以在图形界面中执行图像处理操作并支持交互式绘图[^1]。 #### 创建项目环境 为了使用 HALCON 功能,在 Visual Studio 中创建一个新的 WinForms 项目,并安装 MVTec.HALCON.DotNet NuGet 包以引入必要的库文件。 #### 初始化 HWindowControl 将 `HWindowControl` 添加至窗体设计视图中,并初始化其关联的 HALCON 图像窗口对象 (`HObject`): ```csharp using System; using System.Windows.Forms; using Mvtec.Halcon; namespace HalconRoiExample { public partial class MainForm : Form { private HDevelop hDevEnv; // 可选:调试工具 private HImage image; // 加载的原始图像 private HTuple row, col, phi, width, height; // 存储ROI参数 public MainForm() { InitializeComponent(); try { // 初始化Halcon开发环境 (可选) hDevEnv = new HDevelop(); // 设置HWindowControl与HALCON窗口绑定 halconWindow.HalconWindow = hDevEnv.GetDefaultWindowID(); LoadImage(); // 载入测试图像 SetupInteraction();// 配置交互模式 } catch (Exception ex) { MessageBox.Show($"Error initializing: {ex.Message}"); } } /// <summary> /// 加载一张测试图像 /// </summary> private void LoadImage() { string imagePath = @"path\to\your\image.jpg"; // 替换为实际路径 image = new HImage(imagePath); image.DispObj(halconWindow.HalconWindow); // 显示图像 } /// <summary> /// 启用交互模式以便绘制ROI /// </summary> private void SetupInteraction() { HHomMat2D identityMatrix = null; HOperatorSet.Identity(identityMatrix); // 开启交互模式 HOperatorSet.SetDraw(halconWindow.HalconWindow, "margin"); HOperatorSet.SetColor(halconWindow.HalconWindow, "green"); // 定义回调函数捕获用户输入事件 halconWindow.InteractionCallback += delegate (string eventStr, HTuple tupleIn, out HTuple tupleOut) { if (eventStr.Contains("draw_end")) { // 获取矩形ROI坐标数据 row = tupleIn.TupleSelect(0); col = tupleIn.TupleSelect(1); phi = tupleIn.TupleSelect(2); width = tupleIn.TupleSelect(3); height = tupleIn.TupleSelect(4); Console.WriteLine($"Rectangle drawn at ({row}, {col}), angle={phi}, size=({width}x{height})"); // 更新显示效果 HRoi roi = new HRoi(row.D(), col.D(), phi.D(), width.D(), height.D()); roi.DispRoi(halconWindow.HalconWindow); } tupleOut = null; // 不返回任何额外的数据给调用方 }; } } } ``` 上述代码实现了以下功能: - **加载图像**:从指定路径读取一幅图像并将其展示于 `HWindowControl` 上。 - **配置交互行为**:设置颜色样式、边框宽度等属性;注册鼠标点击/拖拽完成后的响应逻辑。 - **提取几何信息**:当用户结束绘制动作后,自动记录所生成矩形的位置及其尺寸特征[^2]。 #### 缩放同步机制 如果希望在调整窗口大小或者应用其他变换时保持 ROI 正确映射,则需重新计算对应关系。例如基于当前比例因子更新所有已存储的关键点位置。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程笔记in

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值