halcon+C#联合编程学习HDrawingObject类用法
最近在学习halcon自带的ROI绘制类,修改了halcon自带的demo(所用版本为halcon12,其他版本大同小异),demo路径:C:\Users\Public\Documents\MVTec\HALCON-12.0\examples
VS版本:VS2022;目标框架:.NETFrameWork4.5.2 使用的窗体:halcon自带的hWindowControl窗体控件
所实现的功能:1、选中或者新创建的ROI为蓝色,未选中的ROI为红色。2、ROI内的区域进行阈值分割,拖动ROI,修改ROI大小,都可以显示分割的结果。
UI界面:
后台代码:
注意事项:1.匹配两个HDrawingObject对象是否相等,通过匹配ID属性实现
2.可以学习如何使用ROI的回调函数
-
using HalconDotNet;
-
using System;
-
using System.Collections.Generic;
-
using System.ComponentModel;
-
using System.Data;
-
using System.Drawing;
-
using System.Linq;
-
using System.Runtime.CompilerServices;
-
using System.Text;
-
using System.Threading.Tasks;
-
using System.Windows.Forms;
-
-
namespace DrawingObject
-
{
-
public interface IHWindowGraphicStack
-
{
-
void DisplayResults();
-
void AddToStack(HObject o);
-
}
-
public partial class Form1 : Form, IHWindowGraphicStack
-
{
-
private List<HDrawingObject> list = new List<HDrawingObject>();
-
private Stack<HObject> graphic_stack = new Stack<HObject>();
-
private HDrawingObject selected_drawing_object = new HDrawingObject(250, 250, 100);
-
private HImage image = null;
-
private object stack_lock = new object();
-
HWindow window = null;
-
public Form1()
-
{
-
InitializeComponent();
-
}
-
-
//ROI内的区域加入Stack中
-
public void AddToStack(HObject obj)
-
{
-
lock (stack_lock)
-
{
-
graphic_stack.Push(obj);
-
}
-
}
-
//
-
public void DisplayResults()
-
{
-
try
-
{
-
hWindowControl1.BeginInvoke((MethodInvoker)(() =>
-
{
-
DisplayGraphicStack();
-
}));
-
}
-
catch (Exception ex)
-
{
-
MessageBox.Show(ex.ToString());
-
}
-
}
-
//
-
private void DisplayGraphicStack()
-
{
-
lock (stack_lock)
-
{
-
HSystem.SetSystem("flush_graphic", "false");
-
window.ClearWindow();
-
while (graphic_stack.Count > 0)
-
{
-
//显示ROI内效果,并移除
-
window.DispObj(graphic_stack.Pop());
-
}
-
HSystem.SetSystem("flush_graphic", "true");
-
}
-
window.DispCross(-10.0, -10.0, 3.0, 0.0);
-
}
-
//
-
-
-
private void Form1_Load(object sender, EventArgs e)
-
{
-
window = hWindowControl1.HalconWindow;
-
//图片
-
image = new HImage("fabrik");
-
image.GetImageSize(out HTuple width, out HTuple height);
-
window.SetPart(0, 0, height.I - 1, width.I - 1);
-
window.AttachBackgroundToWindow(image);
-
//
-
this.AttachDrawingObj(selected_drawing_object);
-
}
-
-
private void AttachDrawingObj(HDrawingObject obj)
-
{
-
//list添加
-
list.Add(obj);
-
//
-
obj.OnAttach(ProcessMethod);
-
obj.OnSelect(OnSelectDrawingObject);
-
obj.OnDrag(ProcessMethod);
-
obj.OnResize(ProcessMethod);
-
//
-
window.AttachDrawingObjectToWindow(obj);
-
-
}
-
//与委托参数匹配
-
private void OnSelectDrawingObject(HDrawingObject drawid, HWindow window, string type)
-
{
-
selected_drawing_object = drawid;
-
-
ProcessMethod(drawid, window, type);
-
}
-
private void ProcessMethod(HDrawingObject drawid, HWindow window, string type)
-
{
-
// drawid.SetDrawingObjectParams("color", "blue");
-
//color
-
foreach (HDrawingObject item in list)
-
{
-
//注意事项:改变ROI颜色的时候,一定要通过HDrawingObject对象的ID属性和list中的成员ID进行匹配,
-
//不能直接通过对象==对象的形式进行判断
-
if (item.ID == drawid.ID)
-
{
-
item.SetDrawingObjectParams("color", "blue");
-
}
-
else
-
{
-
item.SetDrawingObjectParams("color", "green");
-
}
-
}
-
-
HRegion region = new HRegion(drawid.GetDrawingObjectIconic());
-
//加入stack
-
window.SetColor("red");
-
this.AddToStack(image.ReduceDomain(region).Threshold(new HTuple(128), new HTuple(255)));
-
//展示并清空stack
-
this.DisplayResults();
-
}
-
//rec1
-
private void button1_Click(object sender, EventArgs e)
-
{
-
HDrawingObject rec1 = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE1,
-
100, 100, 210, 210);
-
this.AttachDrawingObj(rec1);
-
}
-
//rec2
-
private void button2_Click(object sender, EventArgs e)
-
{
-
HDrawingObject rec2 = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE2,
-
100, 100, 0, 100, 50);
-
this.AttachDrawingObj(rec2);
-
}
-
//Circle
-
private void button3_Click(object sender, EventArgs e)
-
{
-
HDrawingObject circle = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.CIRCLE,
-
200, 200, 70);
-
this.AttachDrawingObj(circle);
-
}
-
//清除所有ROI
-
private void button4_Click(object sender, EventArgs e)
-
{
-
lock (stack_lock)
-
{
-
foreach (HDrawingObject dobj in list)
-
{
-
dobj.Dispose();
-
}
-
list.Clear();
-
graphic_stack.Clear();
-
}
-
DisplayGraphicStack();
-
}
-
}
-
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhghekeg
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13