【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
学习过halcon的同学都知道,它不仅有很多的图像算子可以使用,而且调试很方便。每一步骤的调试结果,都可以看到对应的显示效果。这中间,开发者可以自己调参数、写脚本,十分方便。在所有的配置都ok之后,直接导出为c、c# code,变成最终的软件输出,部署到客户的电脑上面。
其实要做到这一点,也不是很复杂。一种比较简单的办法,就是内嵌一个lua虚拟机,把对应的函数转成lua版本。等到配置结束后,把lua解释器和对应的算法dll直接打包出去就可以了。
1、安装Lua的开发包
目前可以通过NuGet直接下载到对应的lua包,当前的软件叫NLua。在NuGet上面输入NLua直接查找,第一个显示结果就是我们需要下载的对象。直接下载就可以了。
2、设计界面
界面部分的设计比较简单,主要有两个部分,一个是按钮,一个是标签。标签的目的主要就是显示lua操作后的结果。这里又有两点,一个是c#调用lua程序,另外一个是lua调用c#程序,这两部分都是后期经常出现的场景。
<Window x:Class="WpfApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Button Content="Button" HorizontalAlignment="Left" Margin="235,178,0,0" VerticalAlignment="Top" Width="124" Click="Button_Click" Height="57"/>
<Label x:Name="demoLabel" FontSize="20" Content="Test" HorizontalAlignment="Left" VerticalContentAlignment="Center" Margin="430,178,0,0" VerticalAlignment="Top" Height="57" Width="220"/>
</Grid>
</Window>
3、头文件引用NLua
头文件应用,这是基本操作。内容比较简单,直接using添加就好了。
using NLua;
4、c#调用ua
c#调用lua的话,一般是先创建一个lua虚拟机,然后通过这个虚拟机来执行lua脚本,或者是是lua字符串。执行完毕之后,执行的结果再次返回给c#。
// init variable here
private Lua lua;
public MainWindow()
{
InitializeComponent();
// initialize a lua translator
lua = new Lua();
//execute lua code
lua.DoString("output = math.max(2,1)");
int result = Convert.ToInt32(lua["output"]);
demoLabel.Content = "Result from C#: " + result;
}
5、lua调用c#
lua调用c#的话,也不算复杂。首席我们准备一个class,以及与之匹配的函数,
// third part class
public class MyCSharpClass
{
public int Add(int a, int b)
{
return a + b;
}
}
接下来如果需要执行这个函数的话,第一步先要register一下对应的类。注册完了,第二步就可以在lua脚本中调用对应的函数了。
private void Button_Click(object sender, RoutedEventArgs e)
{
// add class to lua
lua["myCSharpObject"] = new MyCSharpClass();
// execute lua code
lua.DoString("result = myCSharpObject:Add(10, 5)");
int result = Convert.ToInt32(lua["result"]);
demoLabel.Content= "Result from C#: " + result;
}
为了检验Add函数是不是真的是lua.DoString调用的,可以在Add函数的位置设一个断点,这样就可以double check一下。