零基础小白实现C#与Halcon算法的项目梦幻联动

本文是今日在学习了C#课程之后,第一次接触到C#中不同软件算法结合,课后整理了一些思绪如下,如有不当之处,请各位大佬批评指正!

一、环境搭建与整体过程描述

1.找到Halcon软件直接右键打开进入资源文件夹:

 2.找到我们搭建环境所需的Hanlcon软件算法库:

 最重要的就是bin\x64-win64文件夹里面的halcon.dll文件(包含了Halcon软件的算法库函数)与bin/dotnet35里面的halcondotnet.dll文件,建议复制出来在同一文件里面打包方便直接嵌入到C#程序里面。

3、在进行移植之前还需要利用Visual Studio创建一个Windows窗体项目:

 创建之后选择项目鼠标右键打开选择打开资源文件夹

将我们第2步找到的halcon算法库直接复制到项目文件夹里面的bin/debug可执行文件夹里面。

至此,联合项目基础环境已经完成!

二、Halcon算法引用以及创建HWindowControl控件

1.Halcon算法引用

        在项目解决方案资源管理器里面找到“引用”,点击选择复制好的算法目录文件halcondotnet.dll文件:

 添加选择“确定”即可!

在引用路径下面出现说明引用成功!

2.创建一个HWindowControl控件

        引用成功之后,我们需要在窗体工具箱(工具箱找不到的可以在软件菜单栏“视图”里面选择工具箱)里面直接拖拽添加halcondotnet.dll文件,会自动生成项目窗口控件工具:

接下来就可以开始创建项目了 

 三、搭建简单处理回形针项目并测试

1.绘制窗口

        新建HWindowControl窗口1并添加按钮1用于读取图片,

 鼠标右键选择按钮选择属性,可以更改文本显示以及变量名:

              

接下来创建窗口2和按钮2作为阈值处理,文本框用于输入对图片阈值分割处理最大最小值,还可以添加label标签用于说明:

修改文字方法与修改按钮名字方法相同,右击选择属性即可更改。最终效果如下:

2.查看窗口源代码以及相关定义

        在窗口界面点击选择之后按键盘F7或者FN+F7进入源代码查看:

进入以下界面:

要是想查看相关定义变量按住Ctrl单击InitializeComponent();函数即可进入查看:

3.代码编写

        为了方便观看,本文选择直接在项目里面加入注释以供参考:

(1)图片选择并显示在窗体源码块:

        //定义一个HObject类型的变量用于接受图片
        HObject TestImage; 
        //创建单击按钮事件只需在form界面鼠标左键双击即可自动创建并进入
        private void button_read_Click(object sender, EventArgs e)
        {
            //读取文件方法
            HOperatorSet.ReadImage(out TestImage, "D:\\VisionStudio-demo\\0819\\clip.png");
            //获取图片大小--Width与Height变量获取图片宽高
            HTuple Width, Height;
            HOperatorSet.GetImageSize(TestImage,out Width,out Height);
            //设置图片显示范围 hWindowControl1.HalconWindow获得窗体句柄
            HOperatorSet.SetPart(hWindowControl1.HalconWindow,0,0, (Height-1), (Width-1)); //0,0, (Height - 1), (Width - 1)代表从0,0坐标到图片的宽高坐标,达到全屏显示

            //将图片投射到窗体上
            HOperatorSet.DispObj(TestImage, hWindowControl1.HalconWindow);//将TestImage变量投射到句柄窗口上

        }

图片读取运行结果:

        注:如果出现运行System.BadImageFormatException:“试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)”错误,

解决方法:找到项目右击属性,找到“生成”选项将“首选32位”取消勾选即可解决!

 

(2)阈值分割图片处理源码块:

        //声明两个变量用于接受窗体上用户输入的灰度值
        HTuple MinGray, MaxGray;
        private void button_deal_Click(object sender, EventArgs e)
        {
            //在事件触发之后最先清除窗口避免覆盖显示
            hWindowControl2.HalconWindow.ClearWindow();
            //为防止用户直接阈值分割而无图片,下面做一个简单判断
            if (TestImage == null)
            {
                button_read_Click(null,null);//当没有事先进行读取图片操作时触发调用,获取图片
            }
            //设置阈值处理显示颜色
            HOperatorSet.SetColor(hWindowControl2.HalconWindow, "blue");
            //接受窗体上用户输入的灰度值
            MinGray = int.Parse(textBox_Min.Text);//由于textBox_Min.Text是字符串类型利用int.Parse进行强转
            MaxGray = int.Parse(textBox_Max.Text);

            //阈值分割方法--Threshold()
            HObject Region;// 创建HObject类型的变量作为阈值分割的输出
            HOperatorSet.Threshold(TestImage,out Region, MinGray, MaxGray);
            //在第二个窗口上显示处理结果
            HTuple Width, Height;
            HOperatorSet.GetImageSize(TestImage, out Width, out Height);
            HOperatorSet.SetPart(hWindowControl2.HalconWindow, 0, 0, (Height - 1), (Width - 1));

            //将图片投射到窗体上
            HOperatorSet.DispObj(Region, hWindowControl2.HalconWindow);//将Region结果投射到句柄窗口上
        }

运行结果如下 :

        综上所述,一个简单的实现图像基本阈值分割处理的小项目就搭建好了,主要还是练习如何将Halcon算法库移植到C#项目里面并运行,注意命名空间为HalconDotNet中的类HOperatorSet的使用,如果在代码中有需要完善或者更改的,还望各位大佬指正~~~

(3)完整代码

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;
//引用导入的HalconDotNet文件
using HalconDotNet;

namespace 连合项目自测
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //定义一个HObject类型的变量用于接受图片
        HObject TestImage; 
        //创建单击按钮事件只需在form界面鼠标左键双击即可自动创建并进入
        private void button_read_Click(object sender, EventArgs e)
        {
            //读取文件方法
            HOperatorSet.ReadImage(out TestImage, "D:\\VisionStudio-demo\\0819\\clip.png");
            //获取图片大小--Width与Height变量获取图片宽高
            HTuple Width, Height;
            HOperatorSet.GetImageSize(TestImage,out Width,out Height);
            //设置图片显示范围 hWindowControl1.HalconWindow获得窗体句柄
            HOperatorSet.SetPart(hWindowControl1.HalconWindow,0,0, (Height-1), (Width-1)); //0,0, (Height - 1), (Width - 1)代表从0,0坐标到图片的宽高坐标,达到全屏显示

            //将图片投射到窗体上
            HOperatorSet.DispObj(TestImage, hWindowControl1.HalconWindow);//将TestImage变量投射到句柄窗口上
        }

        //声明两个变量用于接受窗体上用户输入的灰度值
        HTuple MinGray, MaxGray;
        private void button_deal_Click(object sender, EventArgs e)
        {
            //在事件触发之后最先清除窗口避免覆盖显示
            hWindowControl2.HalconWindow.ClearWindow();
            //为防止用户直接阈值分割而无图片,下面做一个简单判断
            if (TestImage == null)
            {
                button_read_Click(null,null);//当没有事先进行读取图片操作时触发调用,获取图片
            }
            //设置阈值处理显示颜色
            HOperatorSet.SetColor(hWindowControl2.HalconWindow, "blue");
            //接受窗体上用户输入的灰度值
            MinGray = int.Parse(textBox_Min.Text);//由于textBox_Min.Text是字符串类型利用int.Parse进行强转
            MaxGray = int.Parse(textBox_Max.Text);

            //阈值分割方法--Threshold()
            HObject Region;// 创建HObject类型的变量作为阈值分割的输出
            HOperatorSet.Threshold(TestImage,out Region, MinGray, MaxGray);
            //在第二个窗口上显示处理结果
            HTuple Width, Height;
            HOperatorSet.GetImageSize(TestImage, out Width, out Height);
            HOperatorSet.SetPart(hWindowControl2.HalconWindow, 0, 0, (Height - 1), (Width - 1));

            //将图片投射到窗体上
            HOperatorSet.DispObj(Region, hWindowControl2.HalconWindow);//将Region结果投射到句柄窗口上
        }
    }
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值