前言
上次在文章《halcon 函数文件 以及 脚本引擎如何调用外部函数文件 上篇》 中讲到如何halcon去封装一个算子。 这篇下篇,承接上篇讲述C#如何使用halcon引擎调用自己封装好算子。
这样的好处很明显:
1 不用修改C#代码,更新脚本就能改变算法。免去了一个翻译过程,代码也容易维护。
2 可以利用halcon对脚本进行加密。
目前发现的一个坏处:无法主动释放内存,当调用计算量很大算子,或者图片很大时,内存会飙升很快。
具体使用
1 引用dll
首先需要引用dll: hdevenginedotnet.dll
2 指定halcon脚本路径
我们需要把我们封装好的算子们,放在一个路径下面,然后告诉halcon脚本引擎,这个目录:
//实例化一个halcon脚本引擎
public HDevEngine hDevEngine = new HDevEngine();
//指定脚本(外部算子)路径
hDevEngine.SetProcedurePath(HalconScriptDir);
3 加载脚本
HDevProcedure procedure = new HDevProcedure("mytest");
mytest,这个是算子的名称,这里不用加后缀,由于第二步中指定了路径,那么此时HDevProcedure类会在指定路径下寻找这个算子。具体如何封装这个算子请参考《上篇》
算子的调用
加载完算子之后,就可以调用算子了。一个算子最多会有四种类型参数。
1 输入图片类型
2 输入控制类型
3 输出图片类型
4 输出控制类型
所以,我们也要四种函数,去 设置/获取 这四种类型的参数。
procedureCall = new HDevProcedureCall(procedure);
//设置输入图片类型
procedureCall.SetInputIconicParamObject("Image", img);//输入图像
procedureCall.SetInputIconicParamObject("RegionPT", RegionPT);//输入平台区域
//设置输入控制参数
procedureCall.SetInputCtrlParamTuple("posType", posType);
procedureCall.SetInputCtrlParamTuple("minLen",5);
procedureCall.SetInputCtrlParamTuple("maxLineWidth",6);
procedureCall.SetInputCtrlParamTuple("contrast",7);//运行函数
procedureCall.Execute();//获取输出图片类型
MarkRegion = procedureCall.GetOutputIconicParamObject("MarkRegion");
len = procedureCall.GetOutputCtrlParamTuple("len");
不过对于获取输出halcon引擎还提供了两个函数封装
procedureCall.GetOutputIconicParamVector
procedureCall.GetOutputIconicParamImage
procedureCall.GetOutputCtrlParamVector
貌似是可以从一个数组里获取一个对象,参数既可以传int类型,也可以是string 类型。(有空再研究吧)
小结
调用halcon引擎还是相当简单的,后续有新的内容或者体会,再丰富进来!