aardio调用halcon的HDevEngine来进行视觉处理

By admin at 2022-04-02 • 0人收藏 • 579人看过

以前发过帖子介绍的方法是调用halcon的com组件, 这里再介绍一种更简单的办法, 得益于aardio对dotnet库的升级, 现在我们可以直接使用HDevEngine来嵌入界面里.

好处: 可以直接使用 halcon 里面的代码文件, 不需要进行任何转换 , 也不会有tuple数据格式问题 . 

这也就意味着你只需要再halcon里调试好代码,然后保存为halcon文件,然后在aardio里直接引用这个文件执行即可.

image.png

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.htmlayout.cn/t/21315#Post22740


3 个回复 | 最后更新于 2022-04-25
2022-04-02   #1

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

2022-04-12   #2

PCB缺陷检测?

2022-04-25   #3

经过多次测试总结如下:

利用hdevengine来执行hdev文件的话, 需要下面这些dll

image.png



下面详细介绍下, 这些文件都在哪里找到的:

image.png


有人如果有halcon其他版本的可以测试下, 

我这台电脑安装的就是halcon13.0 64位版本的, 按照上面调用没问题.


至于怎么修改调用示例的话, 将下面代码里的执行示例修改路径即可.

1. 找到examples路径

image.png

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();

image.png


工程下载:

链接:https://pan.baidu.com/s/1a95uPk_ONi1ghyQ3djOXDQ 

提取码:ttmn


image.png

image.png



登录后方可回帖

登 录
信息栏
公告:
个人博客
专注分享
谢谢合作!

本站域名:HtmLayout.Cn
aardio可以快速开发上位机,本站主要记录了学习过程中遇到的问题和解决办法及aardio代码分享

这里主要专注于aardio学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.

Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
本 站 主 站:Stm32cube中文网
Sciter中文在线文档Sciter在线学习文档
空间赞助:才仁机械
打赏本站
Loading...