C#与Halcon联合编程实现鼠标对区域的选择

C#与Halcon联合编程实现鼠标对区域的选择

在视觉检测项目中,有时可能需要选择某一个已经提取出区域,查看其面积、圆度等参数。在HDevelop中已经提供了这个功能,只需鼠标点击即可选择相应的区域,但是在C#与Halcon联合编程时,调用的hWindowControl这个控件没有提供现成的区域选择功能。由于当前项目中需要用到区域选择功能,所以对这个功能进行了开发验证,下面的实现的效果图,包括显示区域的两种风格。
C#与Halcon联合编程实现鼠标对区域的选择_第1张图片
引用halcon库、添加相关控件等不做过多介绍。
下面贴出所有代码,代码中注释详细,无需过多介绍。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using HalconDotNet;
using System.IO;

namespace SelectRegion
{
    public partial class Form1 : Form
    {
        private HWindow hWindow = null;//窗口变量
        private HImage image = null;//图像变量
        private HRegion allRegions = null;//提取区域变量
        private HRegion selectRegions = null;//选择的区域变量

        private int index = 0;//选择区域的显示样式,0显示整体,1显示轮廓
        int mouse_X0, mouse_Y0;//用来记录按下鼠标时的坐标位置
        public Form1()
        {
            InitializeComponent();
            hWindow = hWindowControl1.HalconWindow;
            hWindow.SetColor("red");//设置窗口显示的区域为红色
            selectRegions = new HRegion();

            comboBox1.Items.Add("整体");//向combox中添加内容
            comboBox1.Items.Add("轮廓");
            comboBox1.SelectedIndex = 0;//combox选择默认项
        }
        private void button_ReadImage_Click(object sender, EventArgs e)
        {
            //点击读取图像按钮事件
            image = new HImage();
            image.ReadImage(@"d:\TestImage.bmp");//读取测试图像

            int width, height;
            image.GetImageSize(out width, out height);//获取图像宽度和高度
            hWindow.SetPart(0, 0, height - 1, width);//根据读取的图像设置HWindow中显示图像的宽度和高度

            hWindow.DispObj(image);//显示读取的图像
            allRegions = new HRegion();//实例化区域对象

            allRegions = image.Threshold(128.0, 255.0).Connection();//通过固定阈值提取图像中的白色形状区域,且返回经过连通处理后的区域
        }
        private void HDWindowControl_HMouseUp(object sender, HMouseEventArgs e)
        {
            //鼠标按键按下事件
            if (e.Button == MouseButtons.Left)
            {
                int mouse_X1, mouse_Y1;
                if (mouse_X0 == 0 || mouse_Y0 == 0)
                    return;
                try
                {
                    int tempNum = 0;
                    hWindow.GetMposition(out mouse_X1, out mouse_Y1, out tempNum);//接收鼠标在hWindowControl控件中所在的位置
                    if(mouse_X1==mouse_X0&&mouse_Y1==mouse_Y0)
                    {
                    //按下鼠标按键和抬起鼠标按键的位置相同时认为是区域选择动作
                    //之所以使用这样的条件,是因为后续还要在hWindowControl控件中添加了鼠标拖动图片的功能
                        selectRegion(mouse_X0, mouse_Y0);
                    }
                }
                catch (HalconException ex)
                {
                }
            }
        }

        private void HDWindowControl_HMouseDown(object sender, HMouseEventArgs e)
        {
            //鼠标按键抬起事件
            if (e.Button == MouseButtons.Left)
            {
                try
                {
                    int tempNum = 0;
                    hWindow.GetMposition(out mouse_X0, out mouse_Y0, out tempNum);
                }
                catch (Exception ee)
                {
                }
            }
        }

        private void selectRegion(int position_X,int position_Y)
        {
            HRegion tempRegion = new HRegion();//创建一个局部变量并实例化,用来保存鼠标点击的区域
            tempRegion.GenRegionPoints(position_X, position_Y);//根据鼠标点击的位置创建一个Point区域
            selectRegions = allRegions.SelectShapeProto(tempRegion, "overlaps_abs", 1.0, 5.0);//选择与该点存在重合面积在1到5个像素之间的区域
            int temp = selectRegions.CountObj();//判断是否选择到了区域
            if(temp>0)
            {
                hWindow.DispObj(allRegions);//将提取的区域全部刷新为红色
                if(index==1)
                {
                    //index的值为1是以轮廓的方式显示选择的区域
                    hWindow.DispObj(image);
                    hWindow.DispObj(allRegions);

                    selectRegions = selectRegions.Boundary("outer");//提取选择区域的外边缘
                    selectRegions = selectRegions.DilationCircle(2.0);//对外边缘进行膨胀
                }
                hWindow.SetColor("green");//将选择的区域显示为绿色
                hWindow.DispObj(selectRegions);//显示选择的区域
                hWindow.SetColor("red");

                double area=selectRegions.RegionFeatures("area");//计算选择区域的面积
                label1.Text = "区域面积:" + area.ToString();//显示计算出的区域面积
            }
        }

        private void button_ClearRegion_Click(object sender, EventArgs e)
        {
            //点击清除区域按钮事件
            hWindow.DispObj(image);//显示图像
        }

        private void button_DispRegion_Click(object sender, EventArgs e)
        {
            //点击显示区域按钮事件
            hWindow.DispObj(allRegions);//显示区域
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            //combox内容选择事件
            index=comboBox1.SelectedIndex==0?0:1;//切换显示选择区域的显示风格
        }
    }
}

在界面上用鼠标右键点击用来显示图像的hWindowControl控件-----选择属性,选择下图中红色框框选的事件按钮,在HMouseDown选项中添加我们已经创建的HDWindowControl_HMouseDown这个函数,在HMouseUp选项中添加HDWindowControl_HMouseUp这个函数。到此,所有工作均已完成。
C#与Halcon联合编程实现鼠标对区域的选择_第2张图片
关于鼠标拖动图片的程序:
https://blog.csdn.net/biggestcherry/article/details/88719304

水平有限,难免有错误和不足之处,恳请批评指正。

你可能感兴趣的:(Halcon)