编程环境:VS2019 +HALCON 20.11
C#联合HALCON的编程方式大致分为三种,个人经验,如有其他方法,欢迎留言讨论哦~
①:HALCON导出语言方式
HDevelop内导出类文件后,C#执行所导出的类文件(个人觉得比较难用,维护调整极为不便)。
②采用高级语言式编程
对于编程能力要求较高,且对于运行流程无可视化,前期调试比较复杂。适合实现代码量较少的功能。
例如:
HOperatorSet.ReadImage(out HObject Image_Read, "D:\\SaveImages\\TEST.JPEG"); HOperatorSet.Threshold(Image_Read, out HObject Thres_Region, 100, 255); HOperatorSet.AreaCenter(Thres_Region, out HTuple AREA, out HTuple row, out HTuple col);
③采用调用HALCON引擎功能,本次说明方法!
个人觉得这是最方便的联合编程方式,可全程在HDevelop内部进行halcon程序编写,之后导出为库工程,C#内进行调用即可
C#内调用HALCON引擎流程
HDevelop内:
1、确认输入输出变量并编写HALCON程序
*输入 read_image(Image, 'printer_chip/printer_chip_01') Threshold_Min :=120 Threshold_Max :=255 *输出 OBJ_Area :=0 OBJ_Row :=0 OBJ_Col :=0 rgb1_to_gray(Image, GrayImage) threshold(GrayImage, OBJ_Region, Threshold_Min, Threshold_Max) area_center(OBJ_Region, OBJ_Area, OBJ_Row, OBJ_Col)
2、对HALCON程序进行封装成本地新函数
2.1、选中需要封装函数的代码,右键进入函数创建界面
2.2设置封装函数的参数
一般设置:对封装函数进行命名,可以选择是否需要对函数设置密码:设置密码后,HDevelop内查看该函数需要输入密码,导出后,该函数为加密状态,其他软件打开导出文件为乱码(不会影响到C#内部的解析执行)
参数: 选择输入输出。
例如我们这里的输入:输入图标参数是“Image”,输出是“GrayImage”和“OBJ_Region”。其中输出“GrayImage”是没有作用的,或许说对于后面的是不需要的,选择该变量,右侧移除
输入控制参数是“Threshold_Min”“Threshold_Max”,输出为是“OBJ_Area”“OBJ_Row”“OBJ_Col”
2.3通常,后面的“一般文档”和“文档参数”无需设置,特殊情况再做说明。
完成后点击确定,前面替代选中的程序行打勾
确定后,HDevelop文件也有了相应的变化
3、导出到外部库工程
3.1导出库工程
3.2出库工程设置,如下设置(C#为默认设置)。注意命名空间,不要和C#内的命名空间冲突了。
3.3导出库工程文件到工程位置文件夹,导出结果如下:
在工程文件夹下级目录得到两个文件夹(有用)+一个TXT文档(没用)。
至此,HDevelop内部所有工作已经结束,接下来是C#内部如何调用的问题。
C#内
1、导入HDevelop生成的库文件
C#工程内配置好HALCOON环境,其实就添加halcondonet.dll、hdevenginedotnet.dll进来就可以了。
(1)把这个文件导入到C#工程内。
(2)将HALCON文件放置到C#生成文件根目录下,默认是需要和执行文件同目录的,不然会报错。
2、定义输入输出
格式整体和HDevelop内部是一样的
private void btn_Execute_Click(object sender, EventArgs e) { HOperatorSet.ReadImage(out ImageRead, "D:/TESE_1.bmp"); hSmartWindowControl1.HalconWindow.DispObj(ImageRead); HTuple Threshold_Min = 120; HTuple Threshold_Max = 255; HalconEngine_Namespeace.HalconEngine_Test.Threshold_20240206(ImageRead, out HObject OBJ_Region, Threshold_Min, Threshold_Max, out HTuple OBJ_Area, out HTuple OBJ_Row, out HTuple OBJ_Col); textBox_Result.Text = OBJ_Area + "\r\n" + OBJ_Row + "\r\n" + OBJ_Col + "\r\n"; }
3、执行HALCON引擎,获得执行结果
结果和HDevelop内计算的结果一样
如果要在窗口内显示二值化后的区域,只需添加相应的代码即可!
private void btn_Execute_Click(object sender, EventArgs e) { HOperatorSet.ReadImage(out ImageRead, "D:/TESE_1.bmp"); hSmartWindowControl1.HalconWindow.DispObj(ImageRead); HTuple Threshold_Min = 120; HTuple Threshold_Max = 255; HalconEngine_Namespeace.HalconEngine_Test.Threshold_20240206(ImageRead, out HObject OBJ_Region, Threshold_Min, Threshold_Max, out HTuple OBJ_Area, out HTuple OBJ_Row, out HTuple OBJ_Col); textBox_Result.Text = OBJ_Area + "\r\n" + OBJ_Row + "\r\n" + OBJ_Col + "\r\n"; hSmartWindowControl1.HalconWindow.SetColor("red"); //设置显示颜色 hSmartWindowControl1.HalconWindow.SetDraw("fill"); //设置显示方式 hSmartWindowControl1.HalconWindow.DispObj(OBJ_Region); }
注意事项,重要!!
如果一个C#工程里面需要调用两个及以上的HALCON引擎,需要对引擎文件的路径指定,不然多个引擎同时调用是,引擎路径会继承最近一次调用的引擎路径。导致程序报错:找不到相应的引擎文件。
解决办法:HALCON引擎内修改路径至指定路径!
将文件路径指定
我是指定到和执行文件同目录,这样就解决了多个HALCON引擎同时调用时,报错的问题。
示例下载连接
https://download.csdn.net/download/mooney1997/88816863?spm=1001.2014.3001.5503
如有不足,欢迎大家留言讨论~~~