前言:
HALCON 为一款比较流行的商业视觉处理软件,他提供了多种开发的模式,可以在HALCON中开发,也可以将HALCON的设计通过导出库的形式集成到其他开发环境里面,以方便系统集成。本文为笔者自己的一个3D 视觉检测项目,利用HALCON的3D 库开发算法,然后,将算法集成到 MS-VS-C#的环境中:
集成环境:
Windows10,64位系统:
Microsoft Visual Studio Community 2019 版本 16.11.22
HALCON 18.1 Progress (x64-win64 avx2)
步骤1: 在HALCON中构建你的3D的应用:
【案,也就是你在HALCON中的算法,
笔者在HALCON中构建了一个机器人的3D抓取项目,anyway,大致的算法在HALCON中已经基本完成了,下面的图例,显示了从扫描的点云中通过分割算法等拿到了一个球体】
步骤2 : 将HALCON的设计导出到C#的格式
2.1 HALCON算法的导出:
在HALCON中,选择导出:
然后,我们导出到一个cs(C sharp)文件备用:
2.2 HALCON输出文件预览和解读:
【Franklin案,这里是比较重要的介绍】
在HALCON依据C#输出的文件里面,有一些标准的文件格式,这些未来是我们移植要用到的,这里逐一说明:
2.2.1 命名空间的申明
这个肯定是需要的:
//
// File generated by HDevelop for HALCON/.NET (C#) Version 18.11.0.1
// Non-ASCII strings in this file are encoded in local-8-bit encoding (cp936).
//
// Please note that non-ASCII characters in string constants are exported
// as octal codes in order to guarantee that the strings are correctly
// created on all systems, independent on any compiler settings.
//
// Source files with different encoding should not be mixed in one project.
//
using HalconDotNet;
2.2.2 Public 类申明:
首先是整个HALCON的输出类(根类),后面各种调用都要用到这个输出大类:
public partial class HDevelopExport
然后,在输出根类下,有一组我的算法调用的公共类【这个依据你算法的设计不同而不同】
我的算法里面,包括3D处理的接口函数,这里,被HALCON的移植程序转为输出根类的一个方法:
2.2.3 算法过程的封装私类action:
【案】算法的过程和设计都被封装在action里面了,然后,其中核心的算法处理,被放到了 action的try的结构里面。这部分,我们要依据我们在现在新系统的功能去重新组织一下,因为,现在移植到C#里面是,面向对象【控件】的处理,所以,之前在 HALCON里面的处理过程,尤其是过程处理的逻辑需要重新进行设计。
try的部分,笔者的算法核心部分:
步骤3 ,在VS-C#中,引入HALCON的支持动态库:【VS C#是通过工具箱的形式】
先通过菜单选取工具箱:
然后,我们在工具箱里面构建HALCON工具: 在工具箱的空白地方,右键选择,新建选项卡:
然后添加如下,HALCON工具,
然后,右键【选择项】添加动态库:
右边浏览,选择HALCON的动态库地址:
【案,注意动态库,在你的HALCON的安装目录下】
笔者的安装地址如下,你需要检查一下你的地址:
D:\Program Files\MVTec\HALCON-18.11-Progress\bin\dotnet35
然后,安装dll如下:
“”
这时候,HALCON的工具箱应该有如下的动态库:
步骤4,在VS中构建一个展示HALCON的窗体:
4.1 构建一个新的HALCON的窗体:
这个具体的创建步骤,可以参考我的上一个博客:
在VS菜单中,选择:
新建一个窗体:
4.2 在原有项目的菜单上,连接到这个窗体
我们在原有的项目的主菜单上,设计一个点击连接打开这个窗体:
双击,在click动作里面输入以下代码,打开新的窗口:
private void 打开检测窗口ToolStripMenuItem_Click(object sender, EventArgs e)
{
// Create a new form
frm3Ddetect frm_3Ddetect = new frm3Ddetect();
// Show the new form
frm_3Ddetect.Show();
}
4.3 把HALCON的窗口控制拖动到刚才建立的C#窗口:
4.4 设计一个按钮执行HALCON的算法:
4.5 把2.2.3介绍的ACTION添加到:
步骤5 算法移植:
5.1 添加一下新的C#源文件放置公共类:
添加一下C#的文件:
5.2 把HALCON生成的文件内容COPY到这个文件里面:
然后,我们可以看到清晰的类的组织【笔者用到的一些接口函数都在里面】:
注意,下面这些设计给MAIN函数的代码,由于我们是植入现有的工程,是不需要的,注释掉:
5.3 给click里面的action的类补上命名控件的定义:
5.4 在click动作里面构建一个类的实例
【案】现在我们要用到HALCON改成Public里面申明的公共类的方法,所以,先要在点击鼠标后,立刻构建一个类的实例:
private void button1_Click(object sender, EventArgs e)
{
HDevelopExport HDevelopObj = new HDevelopExport();
然后,把之前无法识别的方法都加上类的引用:如果,不加类的引用,一些HALCON的接口函数调用会报错如下:
如果,用了类的应用,就可以解决这个问题了: