在实际项目中经常会遇到需要绘制ROI的情况,之前一直是用darw_circle,darw_Rectangle1等系列的算子。虽然很简单,一行代码就能搞定,但是在交互体验上非常差。用这种算子绘制完ROI之后如果想修改roi只能重新绘制非常不方便。直到发现了HDrawingObject这个类。
目录
一、效果展示
先看下面效果图
开发环境:vs2022 halcon23.11
ROI可以随意拖动,双击选中后颜色变成绿色,拖动或缩放ROI时将roi的参数信息实时更新至右边的lable上。
二、HDrawingObject需要用到的方法
1.创建绘制对象的类型
halcon一共提供了9种绘图对象类型,详情如下
CreateDrawingObjectCircle | 创建一个可以交互式修改的圆圈。 | |
CreateDrawingObjectCircleSector | 创建一个可以交互式修改的圆形扇区。 | |
CreateDrawingObjectEllipse | 创建一个可以交互式修改的椭圆。 | |
CreateDrawingObjectEllipseSector | 创建一个可以交互式修改的椭圆扇区。 | |
CreateDrawingObjectLine | 创建可交互式修改的行。 | |
CreateDrawingObjectRectangle1 | 创建一个平行于坐标轴的矩形,该矩形可以是 以交互方式修改。 | |
CreateDrawingObjectRectangle2 | 创建可以交互式修改的任何方向的矩形。 | |
CreateDrawingObjectText | 创建一个可以交互式移动的文本对象。 | |
CreateDrawingObjectXld | 创建可交互式修改的 XLD 轮廓。 |
2.将绘图对象显示到halcon窗口上
AttachBackgroundToWindow | 将背景图像附加到 HALCON 窗口。 |
3.回调函数
OnAttach | 相应的回调将在对象之后立即调用 已附加到 HALCON 窗口,并已准备好进行交互。 |
OnDetach | 相应的回调将在对象之后立即调用 已从窗口中分离,不再可用于交互。 |
OnDrag | 相应的回调将在对象之后立即调用 已通过鼠标交互进行拖动。 |
OnResize | 相应的回调将在对象之后立即调用 已通过鼠标交互调整了大小。 |
OnSelect | 相应的回调将在对象之后立即调用 已通过鼠标交互进行选择。 |
详情可以查阅下方的官方文档
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 |
详情可以查阅下方的官方文档
三、代码实现
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方面的内容