Halcon联合c#之HDrawingObject实现可以自由移动拖动的ROI

本文介绍了如何在C#中利用Halcon的HDrawingObject类创建交互式的ROI(ReturnonInvestment)图形,如圆圈、扇形、矩形和文本,实现实时参数更新和拖动效果,提升用户体验。
摘要由CSDN通过智能技术生成

在实际项目中经常会遇到需要绘制ROI的情况,之前一直是用darw_circle,darw_Rectangle1等系列的算子。虽然很简单,一行代码就能搞定,但是在交互体验上非常差。用这种算子绘制完ROI之后如果想修改roi只能重新绘制非常不方便。直到发现了HDrawingObject这个类。

目录

一、效果展示

 二、HDrawingObject需要用到的方法

        1.创建绘制对象的类型

        2.将绘图对象显示到halcon窗口上

        3.回调函数

        4.参数的设置及获取      

        5.参数类型

三、代码实现

        1.窗体界面

        2.变量的声明和初始化

        3.回调函数的实现

        4.创建绘画对象

        5.实现效果

  


一、效果展示

先看下面效果图

开发环境:vs2022 halcon23.11

ROI可以随意拖动,双击选中后颜色变成绿色,拖动或缩放ROI时将roi的参数信息实时更新至右边的lable上。

 二、HDrawingObject需要用到的方法

        1.创建绘制对象的类型

                     halcon一共提供了9种绘图对象类型,详情如下

CreateDrawingObjectCircle  创建一个可以交互式修改的圆圈。
CreateDrawingObjectCircleSector  创建一个可以交互式修改的圆形扇区。
CreateDrawingObjectEllipse  创建一个可以交互式修改的椭圆。
CreateDrawingObjectEllipseSector  创建一个可以交互式修改的椭圆扇区。
CreateDrawingObjectLine  创建可交互式修改的行。
CreateDrawingObjectRectangle1  创建一个平行于坐标轴的矩形,该矩形可以是 以交互方式修改。
CreateDrawingObjectRectangle2  创建可以交互式修改的任何方向的矩形。
CreateDrawingObjectText  创建一个可以交互式移动的文本对象。
CreateDrawingObjectXld  创建可交互式修改的 XLD 轮廓。

                       详情可以查阅下方的官方文档Class HDrawingObject [HALCON Operator Reference / Version 13.0.4] (mvtec.com)icon-default.png?t=N7T8https://www.mvtec.com/doc/halcon/13/en/HDrawingObject.html

        2.将绘图对象显示到halcon窗口上

                        

AttachBackgroundToWindow  将背景图像附加到 HALCON 窗口。

        3.回调函数

OnAttach相应的回调将在对象之后立即调用 已附加到 HALCON 窗口,并已准备好进行交互。
OnDetach相应的回调将在对象之后立即调用 已从窗口中分离,不再可用于交互。
OnDrag相应的回调将在对象之后立即调用 已通过鼠标交互进行拖动。
OnResize相应的回调将在对象之后立即调用 已通过鼠标交互调整了大小。
OnSelect相应的回调将在对象之后立即调用 已通过鼠标交互进行选择。

                        详情可以查阅下方的官方文档 

set_drawing_object_callback [HALCON Operator 参考/版本 13.0.4] (mvtec.com)icon-default.png?t=N7T8https://www.mvtec.com/doc/halcon/13/en/set_drawing_object_callback.html

                4.参数的设置及获取      

SetDrawingObjectParams设置图形对象的参数
GetDrawingObjectParams获取图形对象的参数

                5.参数类型

                   不同类型的绘制对象参数也不一样,但也有些设置外观的参数是通用的

        

circle

row:圆心的行坐标。

column:圆心的列坐标。

radius:圆的半径。

circle_secto

row:中心的行坐标。

column:中心的列坐标。

radius:圆的半径。

start_angle:圆弧的起始角度。

end_angle圆弧的端角。

ellipse

row:椭圆中心的行坐标。

column:椭圆中心的列坐标。

phi:前半轴的方向(以弧度为单位)。

radius1:前半轴的长度。

radius2:后半轴的长度。

ellipse_sector

row:椭圆扇区中心的行坐标。

column:椭圆扇区的中心的列坐标。

phi:前半轴的方向(以弧度为单位)。

radius1:前半轴的长度

radius2:后半轴的长度。

start_angle:椭圆弧的起始角度。

end_angle:椭圆弧的端角。

rectangle1

row1:左上角的行坐标。

column1:左上角的列坐标。

row2:右下角的行坐标。

column2:右下角的列坐标。

rectangle2

row:矩形中心的行坐标。

column:矩形中心的列坐标。

phi:前半轴的方向(以弧度为单位)。

length1:前半轴的长度。

length2:后半轴的长度。

line

row1:第一个线点的行坐标。

column1:第一个线点的列坐标。

row2:第二个线点的行坐标。

column2:第二个线点的列坐标。

xld

row1:等值线点的行坐标。

column:等值线点的列坐标。

text

row:文本位置的行坐标。

column:文本位置的列坐标。

string:要显示的文本字符串。

外观color,  font,   line_style,  line_width

                        详情可以查阅下方的官方文档 

set_drawing_object_params [HALCON Operator Reference / Version 13.0.4] (mvtec.com)icon-default.png?t=N7T8https://www.mvtec.com/doc/halcon/13/en/set_drawing_object_params.html

三、代码实现


         1.窗体界面

        窗口使用的是halcon带的hWindowControl控件

        2.变量的声明和初始化

 HDrawingObject HD_Roi;

            

  public void InitParm()
  {
      HD_Roi=new HDrawingObject();
  }

 

   public Form1()
   {
       InitializeComponent();
       InitParm();
   }

        3.回调函数的实现

                回调函数按照halcon给的格式写就行

 //鼠标双击选中时触发回调函数
 private void CallbackOnSelect(HDrawingObject drawid, HWindow window, string type)
 {
     //将绘图对象的颜色设置为绿色
     HD_Roi.SetDrawingObjectParams("color", "green");
 }
 //获取绘图对象参数并将参数显示至lable
private void CallbackDrwingObjParm(HDrawingObject drawid, HWindow window, string type)
 {
     
     HTuple hv_Parms="";
     string[] parms;
     string text="";
     try
     {
         //扇形roi参数获取
         if (radioButton_Arc.Checked)
         {
             parms = new string[] { "row", "column", "radius", "start_angle", "end_angle" };
             hv_Parms = HD_Roi.GetDrawingObjectParams(parms);
             text = "\r\n行:" + hv_Parms[0] + "\r\n列:" + hv_Parms[1] + "\r\n半径:" + hv_Parms[2]
                 + "\r\n起始角:" + hv_Parms[3] + "\r\n终止角:" + hv_Parms[4];
         }
         //矩形roi参数获取
         if (radioButton_Rectangle1.Checked)
         {
             parms = new string[] { "row1", "column1", "row2", "column2" };
             hv_Parms = HD_Roi.GetDrawingObjectParams(parms);
             text = "\r\n行1:" + hv_Parms[0] + "\r\n列1:" + hv_Parms[1] + "\r\n行2:" + hv_Parms[2]
                 + "\r\n列2:" + hv_Parms[3] ;
         }
         //带角度矩形roi参数获取
         if (radioButton_Rectangle2.Checked)
         {
             parms = new string[] { "row", "column", "length1", "length2" };
             hv_Parms = HD_Roi.GetDrawingObjectParams(parms);
             text = "\r\n行:" + hv_Parms[0] + "\r\n列:" + hv_Parms[1] + "\r\n长1:" + hv_Parms[2]
                 + "\r\n长2:" + hv_Parms[3];
         }
         //移动文本参数获取
         if (radioButton_Text.Checked)
         {
             parms = new string[] { "row", "column", "string" };
             hv_Parms = HD_Roi.GetDrawingObjectParams(parms);
             text = "\r\n行:" + hv_Parms[0] + "\r\n列:" + hv_Parms[1] + "\r\n文本内容:" + hv_Parms[2];
         }
         label1.Text = "Roi信息:" + text;
     }
     catch (Exception)
     {
     }
 }

        4.创建绘画对象

                给对应的radioButton添加相应的CheckedChanged事件

 // 圆弧扇形ROI
 private void radioButton_Circle_CheckedChanged(object sender, EventArgs e)
 {
     if (!radioButton_Arc.Checked) { return; }
     try
     {
         //清除绘制对象
         HD_Roi.ClearDrawingObject();
         //创建扇形绘制对象
         HD_Roi.CreateDrawingObjectCircleSector(35, 35, 150, 0, 3.14);
         //把绘制对象显示到halcon窗口上
         hWindowControl1.HalconWindow.AttachDrawingObjectToWindow(HD_Roi);
         //鼠标拖动时触发获取参数回调函数
         HD_Roi.OnDrag(CallbackDrwingObjParm);
         //尺寸改变时触发获取参数回调函数
         HD_Roi.OnResize(CallbackDrwingObjParm);
         //鼠标选中时触发改变颜色的回调函数
         HD_Roi.OnSelect(CallbackOnSelect);
     }
     catch (Exception)
     {
     }
 }
 // 绘制矩形ROI
 private void radioButton_Rectangle1_CheckedChanged(object sender, EventArgs e)
 {

     if (!radioButton_Rectangle1.Checked) { return; }
     try
     {
         //清除绘制对象
         HD_Roi.ClearDrawingObject();
         //创建矩形绘制对象
         HD_Roi.CreateDrawingObjectRectangle1(0, 0, 50, 50);
         //把绘制对象显示到halcon窗口上
         hWindowControl1.HalconWindow.AttachDrawingObjectToWindow(HD_Roi);
         //拖动时触发获取参数的回调函数
         HD_Roi.OnDrag(CallbackDrwingObjParm);
         //尺寸大小调整时触发获取参数的回调函数
         HD_Roi.OnResize(CallbackDrwingObjParm);
         //鼠标选中时触发改变颜色的回调函数
         HD_Roi.OnSelect(CallbackOnSelect);
         //鼠标选中时触发改变颜色的回调函数
         HD_Roi.OnSelect(CallbackOnSelect);
     }
     catch (Exception)
     {
     }     
 }
  // 带角度矩形ROI
  private void radioButton_Rectangle2_CheckedChanged(object sender, EventArgs e)
  {
      if (!radioButton_Rectangle2.Checked) { return; }
      try
      {
          //清除绘制对象
          HD_Roi.ClearDrawingObject();
          //创建带角度的矩形绘制对象
          HD_Roi.CreateDrawingObjectRectangle2(50,1.5, 50, 100, 50);
          //把绘制对象显示到halcon窗口上
          hWindowControl1.HalconWindow.AttachDrawingObjectToWindow(HD_Roi);
          //鼠标拖动时触发获取参数回调函数
          HD_Roi.OnDrag(CallbackDrwingObjParm);
          //尺寸改变时触发获取参数回调函数
          HD_Roi.OnResize(CallbackDrwingObjParm);
          //鼠标选中时触发改变颜色的回调函数
          HD_Roi.OnSelect(CallbackOnSelect);
      }
      catch (Exception)
      {
      }
  }
//不显示ROI
 private void radioButton1_CheckedChanged(object sender, EventArgs e)
 {
     if (!radioButton1.Checked) { return; }
     HD_Roi.ClearDrawingObject();
 }
  // 移动文本
  private void radioButton_Text_CheckedChanged(object sender, EventArgs e)
  {
      if (!radioButton_Text.Checked) { return; }
      try
      {
          //清除绘制对象
          HD_Roi.ClearDrawingObject();
          //创建可拖动的文本绘制对象
          HD_Roi.CreateDrawingObjectText(50, 50, "文本内容");
          //把绘制对象显示到halcon窗口上
          hWindowControl1.HalconWindow.AttachDrawingObjectToWindow(HD_Roi);
          //鼠标拖动时触发获取参数回调函数
          HD_Roi.OnDrag(CallbackDrwingObjParm);
          //尺寸改变时触发获取参数回调函数
          HD_Roi.OnResize(CallbackDrwingObjParm);
          //鼠标选中时触发改变颜色的回调函数
          HD_Roi.OnSelect(CallbackOnSelect);
   
      }
      catch (Exception)
      {
      }
  }

        5.实现效果

                1.圆弧扇形

                2.矩形

                3.带角度矩形

                4.移动文本

这里只演示4种类型,其他几种类型使用方法和上面一样。

码字不易,如果这篇内容对你有帮助的话,请给我点个赞,让我开心一下吧。

关注我我后续会更新更多c#与halcon方面的内容

  

  • 41
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

放牛娃王二狗

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

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

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

打赏作者

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

抵扣说明:

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

余额充值