勇哥注:
halcon是不支持远程算子访问的。更别提分布式访问。
它只能弄个监听tcp的死循环,然后跟据送进来的字符串进行case。
所以这里说的分布式halcon服务,指的是勇哥正在开发的一套开源软件:SkHalconService。
系列文章:
分布式halcon服务:SkHalconService(一)项目介绍
分布式halcon服务:SkHalconService(二)两种服务调用的方式:RPC和BAT模式
调用SkHalconService服务有两种方式:
(1)RPC模式
这一种是标准的请求响应模式,这类似于远程过程调用--调过程并且等待返回的结果,因此我称它为RPC方式。
当你使用C#的服务引用的时候,代理方法还可以自动生成异步方式,这样你调用服务的时候就可以异步等待,而默认是同步方式。
此方式调用效率最低,因为图标变量和region会转为byte数组在通信通道中传输。
(2)BAT模式
这一种方式是使用Lua脚本的方式,把脚本传给服务器后,所有的计算都放在的服务器端,最后你可以根据需要返回自己想要的图标变量、region、字符串信息。
BAT方式是速度最快的,也是推荐使用的方式。
Lua脚本的定义都在HalconOperator类的RunLuaScript方法里。
通过把C#定义的方法注册到Lua的方式,就可以得到你自己想要的”指令“。
下图是演示程序使用的Lua脚本:
因为Lua是完整的脚本语言,你可以使用选择、循环、变量。。。运用你的自定义”指令“来构建灵活的脚本程序。
如果你对Lua语法不熟悉,看勇哥下面的贴子:
Lua语法的代码演示
下面是RPC模式的调用示例:
HImageObj img = halcon.Readimage("d:\\printer_chip_01.png"); HRegionObj region= halcon.threshold(img, 128, 255); HRegionObj connectRegion= halcon.Connect(region); HRegionObj selectRegion=halcon.SelectShape(connectRegion, "area", "and", 19000, 40000);
在上面代码中,服务定义了HImageObj,它表示图标变量; HRegionObj,它表示region变量。
这两种数据类型实际上是对hlacon中的HObject类型的转换包装。
服务定义了这两种类型是为了能在网络中序列化为byte数组来传输,而直接使用halcon的HObject是无法序列化的。
RPC模式效率最低,就是因为每条指令,都有HImageObj和HRegionObj这些巨大的对象在网络中传输,极大占用了带宽,也因此限制了并发的数量。
而BAT模式就没有这种问题,它仅在批处理完成后,返回一次图标变量或者region变量,这是调用者想知道的结果信息。
项目地址:
https://gitee.com/netMarketing/skhalconservice
本文对应的历史版本:4b40763e550524ae8733d49f6cfdd4195b3cd02f

