勇哥这套halcon引擎的学习笔记贴子共七篇,它是在官方指导文档《http://www.skcircle.com/?id=1343》的基础上学习编写而成的笔记。只是有一篇讲解怎么调用向量变量的没有加入,因为勇哥实在不知道这个向量变量有啥子用。以后如果搞明白了再加入吧。
2020/7/3勇哥注:
原来halcon中的向量就是个容器,跟c++标准模板库中的那个向量是一致的。第八篇加上来吧
halcon引擎学习笔记(七)在在HDevEngine/C#中使用实时编译器JIT
halcon引擎学习笔记(六)多线程并发执行外部函数,多窗口显示
halcon引擎学习笔记(二)执行Procedure程序,扩展名为hdvp的halcon函数
演示程序勇哥用的是halcon19.11,C#使用的是vs2013版本。
全部测试代码勇哥已经打包,请点击《下载》
如果你要调用的程序是一个hdev主程序,且当中没有外部函数或者自定义函数,则可以看(一)
如果你要调用的程序是一个hdev主程序,且当中有若干的外部函数或者自定义函数,则可以看(三)
如果你要调用的程序只是一个hdvp的外部函数,则可以看(二)
如果你需要多线程调用外部函数,则可以看(六)(七)
如果你的程序中用到向量变量,则可以看(八)
2020/10/15勇哥注:
勇哥最近寻遍halcon引擎类的功能,发现无法实现修改halcon程序并保存后,C#这边能实时运行修改后的halcon程序。
必须要退出C#程序后,再次执行才是跑的修改后的代码。
这真是个遗憾,因为机器正在做货时,重启C#程序是相当不方便的一件事。
如果有人知道怎么实现,麻烦告诉勇哥,非常感谢!
2020/12/18勇哥注:
由网友“小黄鱼”指出,HDevEngine 类有个UnloadProcedure方法调用后,可以实现不需要重启C#程序即可执行更新后的外部函数。
经我测试后,发现是有效的!
在这里非常感谢他的指点!!!
正文部分
========================
halcon引擎可以直接执行halcon代码,把halcon程序当做C#的一个方法来调用,这样可以减轻C#这边的程序负担,而且可以避免内在泄露等bug的出现。还有一种好处是方便调试视觉代码,你只需要启动halcon,直接用修改调试视觉代码即可,C#那边不需要做改变。
这种方式的缺点是定位halcon代码的错误比较麻烦,你不可能在halcon代码那里实时下断点。

程序
using HalconDotNet;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
//演示程序by勇哥 www.skcircle.com
public partial class Form1 : Form
{
private HDevOpMultiWindowImpl MyHDevOperatorImpl;
private HWindow Window;
string ProgramPathString;
private HDevEngine MyEngine = new HDevEngine();
private HDevProgramCall ProgramCall;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//Load Program
//设置程序运行结果的显示窗口
//如果没有这两句,屏幕上除了运行结果文字,其它图形都没有显示。
MyHDevOperatorImpl = new HDevOpMultiWindowImpl(hSmartWindowControl1.HalconWindow);
MyEngine.SetHDevOperators(MyHDevOperatorImpl);
try
{
var Program = new HDevProgram(ProgramPathString);
ProgramCall = new HDevProgramCall(Program);
MessageBox.Show("ok");
}
catch (HDevEngineException Ex)
{
MessageBox.Show(Ex.Message, "HDevEngine Exception");
return;
}
catch
{
return;
}
}
private void button2_Click(object sender, EventArgs e)
{
//Execute Program
try
{
ProgramCall.Execute();
double FinArea;
FinArea = ProgramCall.GetCtrlVarTuple("FinArea");
Window.SetTposition(150, 20);
Window.WriteString("Fin Area: " + FinArea);
}
catch (HDevEngineException Ex)
{
MessageBox.Show(Ex.Message, "HDevEngine Exception");
}
}
private void Form1_Load(object sender, EventArgs e)
{
var halconExamples = HSystem.GetSystem("example_dir");
var ProcedurePath = halconExamples + @"\hdevengine\procedures";
ProgramPathString = halconExamples + @"\hdevengine\hdevelop\fin_detection.hdev";
MyEngine.SetProcedurePath(ProcedurePath);
Window = hSmartWindowControl1.HalconWindow;
Window.SetDraw("margin");
Window.SetLineWidth(4);
}
}
}fin_detection.hdev源码如下:
* Detects fins using a procedure.
init_acquisition (AcqHandle, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width / 2, Height / 2, 'black', WinID)
dev_set_part (0, 0, Height - 1, Width - 1)
dev_set_draw ('margin')
dev_set_line_width (4)
grab_image (Image, AcqHandle)
dev_display (Image)
detect_fin (Image, FinRegion, FinArea)
dev_display (Image)
dev_set_color ('red')
dev_display (FinRegion)
dev_set_color ('white')
* set_tposition (WinID, 150, 20)
* write_string (WinID, 'Fin Area: ' + FinArea)
display_zoomed_region (Image, FinRegion, 2, 5)
close_framegrabber (AcqHandle)
dev_close_window ()---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!


少有人走的路



















