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


登录后方可回帖

虽然看不懂,但是确实太神奇了这个