aardio调用halcon的HDevEngine来进行视觉处理
以前发过帖子介绍的方法是调用halcon的com组件, 这里再介绍一种更简单的办法, 得益于aardio对dotnet库的升级, 现在我们可以直接使用HDevEngine来嵌入界面里.
好处: 可以直接使用 halcon 里面的代码文件, 不需要进行任何转换 , 也不会有tuple数据格式问题 .
这也就意味着你只需要再halcon里调试好代码,然后保存为halcon文件,然后在aardio里直接引用这个文件执行即可.
import win.ui; /*DSG{{*/ mainForm = win.form(text="aardio工程";right=959;bottom=591) mainForm.add( button={cls="button";text="加载";left=13;top=526;right=180;bottom=586;db=1;dl=1;z=2}; button2={cls="button";text="执行";left=203;top=526;right=370;bottom=586;db=1;dl=1;z=3}; custom={cls="custom";text="自定义控件";left=0;top=0;right=960;bottom=518;bgcolor=12639424;db=1;dl=1;dr=1;dt=1;z=1} ) /*}}*/ import console console.open() import dotNet; import System.Drawing; var halcondll = dotNet.load("\res\halcondotnet.dll"); var hdevenginedll = dotNet.load("\res\hdevenginedotnet.dll"); var HalconDotNet = halcondll.import("HalconDotNet"); var HalconDevEngine = hdevenginedll.import("HalconDotNet"); //创建窗口,并绑定 var hSmartWindowControl1 = HalconDotNet.HSmartWindowControl(); dotNet.setParent(hSmartWindowControl1,mainForm.custom); //开启双击自适应 hSmartWindowControl1.HDoubleClickToFitContent = true; //开启拖动 hSmartWindowControl1.HMoveContent = true; //获取halcon系统目录(这里演示的示例目录) var halconExamples = HalconDotNet.HSystem.GetSystem("example_dir"); //指定外部函数路径,S的意思是转换example路径为string字符串 ProcedurePathStr = halconExamples.S + "\hdevengine\procedures"; //指定要执行的主程序文件路径 ProgramPathString = halconExamples.S + "\hdevengine\hdevelop\fin_detection.hdev"; //创建halcon引擎 var MyEngine = HalconDevEngine.HDevEngine(); //设置外部函数路径 MyEngine.SetProcedurePath(ProcedurePathStr); //窗口属性 Window = hSmartWindowControl1.HalconWindow; Window.SetDraw("margin"); Window.SetLineWidth(4); //鼠标按下事件 hSmartWindowControl1.HMouseDown = function(){ console.log("HMouseDown") } //加载 mainForm.button.oncommand = function(id,event){ //绑定所有显示窗口到主窗口 MyHDevOperatorImpl = HalconDevEngine.HDevOpFixedWindowImpl(Window); MyEngine.SetHDevOperators(MyHDevOperatorImpl); //加载程序 var Program = HalconDevEngine.HDevProgram(ProgramPathString); ProgramCall = HalconDevEngine.HDevProgramCall(Program); mainForm.msgbox("ok") } //执行 mainForm.button2.oncommand = function(id,event){ //执行程序 ProgramCall.Execute(); //获取指定属性值,D的意思是转换为double类型 var FinArea = ProgramCall.GetCtrlVarTuple("FinArea").D; console.log(FinArea) //移动文字光标到位置 Window.SetTposition(150, 20); //输出文字 Window.WriteString("Fin Area: " ++ FinArea); } mainForm.show(); return win.loopMessage();
上面只是简单的测试, 运行程序会发现图片特别大, 只显示了一部分, 没关系, 双击图片就会缩放到合适大小了.
当然, 也是有代码可以直接设置的, 这里只是简单的测试, 并没有深入研究.
上面基于halcon13.0 的32位版本, 当然其他的版本的32位版本应该也可以 , 因为这个只是调用dll而已.
请注意必须是32位版本, 其他问题自行研究.
完整测试工程介绍: (本贴 3 楼)
https://www.chengxu.xyz/t/21315#Post22740
经过多次测试总结如下:
利用hdevengine来执行hdev文件的话, 需要下面这些dll
下面详细介绍下, 这些文件都在哪里找到的:
有人如果有halcon其他版本的可以测试下,
我这台电脑安装的就是halcon13.0 64位版本的, 按照上面调用没问题.
至于怎么修改调用示例的话, 将下面代码里的执行示例修改路径即可.
1. 找到examples路径
2. 例如 我直接修改为
//指定要执行的主程序文件路径 ProgramPathString = halconExamples.S + "\hdevelop\Filters\Arithmetic\abs_image.hdev";
完整示例如下:
import win.ui; /*DSG{{*/ mainForm = win.form(text="aardio工程";right=959;bottom=591) mainForm.add( button={cls="button";text="加载";left=13;top=526;right=180;bottom=586;db=1;dl=1;z=2}; custom={cls="custom";text="自定义控件";left=0;top=0;right=960;bottom=518;bgcolor=12639424;db=1;dl=1;dr=1;dt=1;z=1} ) /*}}*/ import console console.open() import dotNet; import System.Drawing; var halcondll = dotNet.load("\halcondotnet.dll"); var hdevenginedll = dotNet.load("\hdevenginedotnet.dll"); var HalconDotNet = halcondll.import("HalconDotNet"); var HalconDevEngine = hdevenginedll.import("HalconDotNet"); //创建窗口,并绑定 var hSmartWindowControl1 = HalconDotNet.HSmartWindowControl(); dotNet.setParent(hSmartWindowControl1,mainForm.custom); //开启双击自适应 hSmartWindowControl1.HDoubleClickToFitContent = true; //开启拖动 hSmartWindowControl1.HMoveContent = true; //获取halcon系统目录(这里演示的示例目录) var halconExamples = HalconDotNet.HSystem.GetSystem("example_dir"); //指定外部函数路径,S的意思是转换example路径为string字符串 ProcedurePathStr = halconExamples.S + "\hdevengine\procedures"; //指定要执行的主程序文件路径 ProgramPathString = halconExamples.S + "\hdevelop\Filters\Arithmetic\abs_image.hdev"; //创建halcon引擎 var MyEngine = HalconDevEngine.HDevEngine(); //设置外部函数路径 MyEngine.SetProcedurePath(ProcedurePathStr); //窗口属性 Window = hSmartWindowControl1.HalconWindow; Window.SetDraw("margin"); Window.SetLineWidth(4); //鼠标按下事件 hSmartWindowControl1.HMouseDown = function(){ console.log("HMouseDown") } //加载 mainForm.button.oncommand = function(id,event){ //绑定所有显示窗口到主窗口 MyHDevOperatorImpl = HalconDevEngine.HDevOpFixedWindowImpl(Window); MyEngine.SetHDevOperators(MyHDevOperatorImpl); //加载程序 var Program = HalconDevEngine.HDevProgram(ProgramPathString); ProgramCall = HalconDevEngine.HDevProgramCall(Program); ProgramCall.Execute(); mainForm.msgbox("ok") } mainForm.show(); return win.loopMessage();
工程下载:
链接:https://pan.baidu.com/s/1a95uPk_ONi1ghyQ3djOXDQ
提取码:ttmn
登录后方可回帖
虽然看不懂,但是确实太神奇了这个