编程环境: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引擎同时调用时,报错的问题。
示例下载连接
如有不足,欢迎大家留言讨论~~~
发表评论