C#联合halcon--通过引用halcon程序导出的C#代码,进行引用和二次封装调用

软件准备 --vs2017 halcon2018

第一步:halcon程序

打开halcon软件,输入以下程序
实现功能:图像分割 ->>统计个数

输入以下程序

*1.读图
read_image (Test, 'F:/CYG/VirtualProject/C#example/exercise03/1.png')
*2.彩色图转灰度图
rgb1_to_gray (Test, GrayImage)
*3.二值化
threshold (GrayImage, Regions, 0, 248)
*4.孔洞填充
fill_up (Regions, RegionFillUp)
*5.区域分割
connection (RegionFillUp, ConnectedRegions)
*6.面积筛选
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 22504.6, 153432)
*7.统计个数
count_obj (SelectedRegions, Number)
area_center (SelectedRegions, Area, Row, Column)

结果如下:
在这里插入图片描述

第二步 导出C#程序

在这里插入图片描述

第三步 二次封装

01. 打开VS软件,新建类库TestValue;

右键解决方案的依赖项,选择“添加引用”;->添加
在这里插入图片描述
右键项目“TestValue”,点击“添加” ->“现有项”,选择刚才导出的程序文件;

在这里插入图片描述
将默认的Class1删除,并打开刚导入的类文件unnamed.cs,找到方法action(),除此方法外,将其他方法都删除,并将程序整理如下;



using HalconDotNet;

namespace CountObjTool
{
    public class CountObjTool
    {

        public void action()
        {

            // Local iconic variables

            HObject ho_Test, ho_GrayImage, ho_Regions;
            HObject ho_RegionFillUp, ho_ConnectedRegions, ho_SelectedRegions;

            // Local control variables

            HTuple hv_Number = new HTuple();
            // Initialize local and output iconic variables 
            HOperatorSet.GenEmptyObj(out ho_Test);
            HOperatorSet.GenEmptyObj(out ho_GrayImage);
            HOperatorSet.GenEmptyObj(out ho_Regions);
            HOperatorSet.GenEmptyObj(out ho_RegionFillUp);
            HOperatorSet.GenEmptyObj(out ho_ConnectedRegions);
            HOperatorSet.GenEmptyObj(out ho_SelectedRegions);
            //1.读图
            ho_Test.Dispose();
            HOperatorSet.ReadImage(out ho_Test, "C:/Users/Administrator/Desktop/test.png");
            //2.彩色图转灰度图
            ho_GrayImage.Dispose();
            HOperatorSet.Rgb1ToGray(ho_Test, out ho_GrayImage);
            //3.二值化
            ho_Regions.Dispose();
            HOperatorSet.Threshold(ho_GrayImage, out ho_Regions, 0, 248);
            //4.孔洞填充
            ho_RegionFillUp.Dispose();
            HOperatorSet.FillUp(ho_Regions, out ho_RegionFillUp);
            //5.区域分割
            ho_ConnectedRegions.Dispose();
            HOperatorSet.Connection(ho_RegionFillUp, out ho_ConnectedRegions);
            //6.面积筛选
            ho_SelectedRegions.Dispose();
            HOperatorSet.SelectShape(ho_ConnectedRegions, out ho_SelectedRegions, "area",
                "and", 52504.6, 153432);
            //7.统计个数
            hv_Number.Dispose();
            HOperatorSet.CountObj(ho_SelectedRegions, out hv_Number);


            ho_Test.Dispose();
            ho_GrayImage.Dispose();
            ho_Regions.Dispose();
            ho_RegionFillUp.Dispose();
            ho_ConnectedRegions.Dispose();
            ho_SelectedRegions.Dispose();
            hv_Number.Dispose();
        }
    }
}

02 整理输入参数、输出参数、检测方法,继续对此类封装,程序如下:

using HalconDotNet;

namespace HDevelopExport
{
    public  class HDevelopExport
    {
        /// <summary>
        /// 输入源图像
        /// </summary>
        public HObject srcImg = null;

        /// <summary>
        /// 输出个数
        /// </summary>
        public int number = 0;

        /// <summary>
        /// 检测方法
        /// </summary>


#if !NO_EXPORT_MAIN
        // Main procedure 
        public void action()
        {

            //2.彩色图转灰度图
            HOperatorSet.Rgb1ToGray(srcImg, out HObject ho_GrayImage);
            //3.二值化
            HOperatorSet.Threshold(ho_GrayImage, out HObject ho_Regions, 0, 248);
            //4.孔洞填充
            HOperatorSet.FillUp(ho_Regions, out HObject ho_RegionFillUp);
            //5.区域分割
            HOperatorSet.Connection(ho_RegionFillUp, out HObject ho_ConnectedRegions);
            //6.面积筛选
            HOperatorSet.SelectShape(ho_ConnectedRegions, out HObject ho_SelectedRegions, "area",
                "and", 52504.6, 153432);
            //7.统计个数
            HOperatorSet.CountObj(ho_SelectedRegions, out HTuple hv_Number);
            number = hv_Number[0].I;

            ho_GrayImage.Dispose();
            ho_Regions.Dispose();
            ho_RegionFillUp.Dispose();
            ho_ConnectedRegions.Dispose();
            ho_SelectedRegions.Dispose();
            hv_Number.Dispose();
        }
    }
}

#endif

第四步 : 新建winform工程

01 右击解决方案TestValue,“添加”-》“新建项目”,选择“WIndows窗体应用-Value”;

在这里插入图片描述

02 关联算法项目、halcondotnet.dll 以及halconWindow控件

a. 选择项目Value,右键"引用" - 》“添加引用”;

b. 选择"项目" -》"TestValue;

第五步 : 软件界面设计

01.添加如下窗体控件;

在这里插入图片描述

02: 逻辑代码设计

实例化对象计数工具类
 HDevelopExport.HDevelopExport tool = new HDevelopExport.HDevelopExport(); 
双击读图按钮,其事件代码如下;
try
            {
                OpenFileDialog openFileDialog = new OpenFileDialog();
                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    HOperatorSet.ReadImage(out tool.srcImg, openFileDialog.FileName);
                    HOperatorSet.GetImageSize(tool.srcImg, out HTuple hv_Width, out HTuple hv_Height);
                    HOperatorSet.SetPart(this.hWindowControl1.HalconWindow, 0, 0, hv_Height - 1, hv_Width - 1);
                    HOperatorSet.DispObj(tool.srcImg, this.hWindowControl1.HalconWindow);
                }

            }
            catch (Exception)
            {

                MessageBox.Show("图片文件错误!");
            }
双击运行按钮,其事件代码如下;
 try
            {
                tool.action();
                textBox1.Text = tool.number.ToString();

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }

整个程序代码如下:

using HalconDotNet;
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;

namespace Test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        HDevelopExport.HDevelopExport tool = new HDevelopExport.HDevelopExport(); 
       
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                OpenFileDialog openFileDialog = new OpenFileDialog();
                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    HOperatorSet.ReadImage(out tool.srcImg, openFileDialog.FileName);
                    HOperatorSet.GetImageSize(tool.srcImg, out HTuple hv_Width, out HTuple hv_Height);
                    HOperatorSet.SetPart(this.hWindowControl1.HalconWindow, 0, 0, hv_Height - 1, hv_Width - 1);
                    HOperatorSet.DispObj(tool.srcImg, this.hWindowControl1.HalconWindow);
                }

            }
            catch (Exception)
            {

                MessageBox.Show("图片文件错误!");
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                tool.action();
                textBox1.Text = tool.number.ToString();

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }
}

第六步 运行

运行前先进行以下设置,否则可能报”试图加载不正确格式“的错误;

右键项目”Value“,选择“设为启动项目”;

右键项目”Value“,选择”属性“,取消勾选”首选32位“;(64位halcon)
在这里插入图片描述
结果显示
在这里插入图片描述

  • 19
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值