专栏首页机器视觉那些事儿【基础篇】一步一步实现c#与halcon联合编程

【基础篇】一步一步实现c#与halcon联合编程

联合编程实践分俩部分

-》算法开发;

-》软件开发;

第一部分 算法开发

Step 1 :环境准备

  1. 软件准备 --vs2017 halcon2019

注:其他版本亦可,步骤一样

b. 原图准备--任意一张图片

Step 2:打开halcon软件,输入以下程序

  1. 实现功能:图像分割 ->>统计个数
  2. 输入以下程序
*1.读图
read_image (Test, 'C:/Users/Administrator/Desktop/test.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', 52504.6, 153432)
*7.统计个数
count_obj (SelectedRegions, Number)

c. 运行效果如下

Step3:导出c#程序

a. 点击“文件” -》“导出”;

b.弹出如下窗口

c. 点击右侧文件夹图标,配置导出文件路径和格式,此Demo配置如下;

d. 其他选项一般默认即可,点击“导出”,会在配置路径下出现对应.cs文件;

Step 4 : 二次封装

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

b. 右键解决方案的依赖项,选择“添加引用”;

c. 点击浏览,找到halcon安装目录下的halcondonet.dll, 添加-》确定;

d. 右键项目“CountObjTool”,点击“添加” -》“现有项”,选择刚才导出的程序文件;

f. 将默认的Class1删除,并打开刚导入的类文件,找到方法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();

        }


    }

}

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

using HalconDotNet;

namespace CountObjTool
{
    public class CountObjTool
    {

        /// <summary>
        /// 输入源图像
        /// </summary>
        public HObject srcImg = null;

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

        /// <summary>
        /// 检测方法
        /// </summary>
        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();

        }


    }

}

第二部分 软件开发

Step 5 : 新建winform工程

a. 邮件解决方案CountObjTool,“添加”-》“新建项目”,选择“WIndows窗体应用”;

Step 6 : 关联算法项目、halcondotnet.dll 以及halconWindow控件

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

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

c.选择"浏览" -》"halcondotnet.dll";

d.打开工具箱,在空白处右键-选择项-

e. 点击”浏览“,选择下边文件”halcolcondotnet.dll“,在工具箱中添加halconWindow控件;

e. 勾选中下图加深的两个halcon组件,并点击确定;

f.工具会更新如下halcon显示控件;

Step 7 : 软件界面设计

a.添加如下窗体控件;

Step 8 : 逻辑代码设计

a.实例化对象计数工具类

CountObjTool.CountObjTool tool = new CountObjTool.CountObjTool();

b.双击读图按钮,其事件代码如下;

  private void btnReadImg_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("图片文件错误!");
            }
        }

b.双击运行按钮,其事件代码如下;

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

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

c.软件界面所有代码如下:

using HalconDotNet;
using System;
using System.Windows.Forms;

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

        CountObjTool.CountObjTool tool = new CountObjTool.CountObjTool();

        private void btnReadImg_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 btnRun_Click(object sender, EventArgs e)
        {
            try
            {
                tool.action();
                txtCount.Text = tool.number.ToString();

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



    }
}

Step 9 运行

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

  • 右键项目”CountObj“,选择“设为启动项目”;
  • 右键项目”CountObj“,选择”属性“,取消勾选”首选32位“;(64位halcon)

b.运行结果如下图所示;

本文分享自微信公众号 - 机器视觉那些事儿(jiqishijue),作者:threeQing

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【测量篇】(3)标定+定位+1D测量综合实例

    在后台收到信息,莫名其妙被人投诉了,不知触犯了哪些人的利益,本人依然会本着分享交流的精神,共促行业的繁荣。如果您能一路跟过来,halcon视觉入门到提高,完全没...

    threeQing
  • 【相机标定篇】halcon自标定(3)

    在项目中,偶尔会遇到由于产品形状、拍摄位置等原因导致标定板很难放置的情况,此时可以考虑使用halcon自标定算法来标定相机。由于自标定可以在不使用用标定板情况下...

    threeQing
  • 基于二次曲面拟合的脏污检测

    原图来自于Ihalcon论坛,条条大路通罗马,目前有动态阈值、频域分析等算法思路,都可以尝试,在此提出另一种思路--人为构造光滑的二次区域与原图对比,进...

    threeQing
  • 美军网络空间安全(Cybersecurity)政策法规体系

    2008年,美国第54号总统令对Cyberspace进行了定义:Cyberspace是信息环境中的一个整体域,它由独立且互相依存的信息基础设施和网络组成:包括互...

    网络安全观
  • 从明显的差异中学习可区分的感知音频度量(Sound)

    许多音频处理任务的评估依赖于次客观评估,既耗时又费钱。人们已经努力创建客观的度量标准,但现有的度量标准与人类的判断关系不大。在这项工作中,我们通过将深度神经网络...

    用户6869393
  • 从明显的差异中学习可区分的感知音频度量(CS SD)

    许多音频处理任务的评估依赖于耗时且昂贵的主观评估。人们努力创建客观的度量标准,但是现有的度量标准与人类的判断关系不大。在这项工作中,我们通过在一个新收集的数据集...

    用户6853689
  • 跟我学姿势:极客教你如何科学的看电影

    俗话说自己动手丰衣足食,小米盒子之类的弱爆了,极客看片自然有极客的做法!相信看完本篇狠涨姿势的文章,你就可以像我一样吃着火锅唱着歌,喝着饮料吃着爆米花,用树莓派...

    FB客服
  • 推荐 :如何正确选择聚类算法?

    数据聚类是搭建一个正确数据模型的重要步骤。数据分析应当根据数据的共同点整理信息。然而主要问题是,什么通用性参数可以给出最佳结果,以及什么才能称为“最佳”。

    week
  • 实习生的监控算法: 利用机器学习方法进行曲线分类

    本篇文章主要采用机器学习的方法来实现曲线分类,基本思路是对训练集先用聚类方法(如Kmeans和Birch等进行聚类,对数据打上标签),然后在对测试集采用分类方法...

    解飞
  • [Python数据可视化]通过分析胸罩销售记录 发现了惊人的秘密

    首先我们需要在搜索页面获取商品的id,为下面爬取用户评价提供productId。key_word为搜索的关键字,这里就是【胸罩】

    龙哥

扫码关注云+社区

领取腾讯云代金券