勇哥这套halcon引擎的学习笔记贴子共七篇,它是在官方指导文档《http://47.98.154.65/?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里,函数有两种形式,一种包含在你的hdev程序中的自定义函数,它随着你的主程序保存,并没有生成额外的的代码文件。
另一种就是hdvp形式的函数,它是外部函数,以文件方式保存在你的磁盘上。
下面的例子就是演示怎么样调用内部函数与外部函数。
本地和外部函数的创建和执行方式完全相同。唯一的区别是,为了使用本地函数,必须加载包含它的程序,而要加载外部函数,则必须设置函数路径。
演示程序的效果:

调用外部函数 init_acquisition.hdvp

调用外部函数detect_fin.hdvp

调用外部函数display_zoomed_region.hdvp
这个函数弹出一个窗口按放大倍率显示region区域。3秒钟后关闭。

演示程序代码:
注意:下面的演示程序的源码需要扫码支付才可以看到。
如果你觉得不想支付,那么可以在CSDN下载中去下载,(https://download.csdn.net/download/suneggs/12556535)
或者通过看后面的代码分析,其实也可以自己完成测试代码。
本例调用的几个外部函数
了解一下其输入输出参数,可以对本例更容易理解一些。
init_acquisition.hdvp参数如下:

代码如下:
open_framegrabber ('File', 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, \
'default', 'fin.seq', 'default', -1, -1, AcqHandle)
grab_image (Image, AcqHandle)
get_image_pointer1 (Image, Pointer, Type, Width, Height)
return ()detect_fin.hdvp参数如下:

源码如下:
binary_threshold (Image, Dark, 'max_separability', 'dark', UsedThreshold)
difference (Image, Dark, Background)
dev_set_color ('blue')
dev_display (Background)
closing_circle (Background, ClosedBackground, 250)
dev_set_color ('green')
dev_display (ClosedBackground)
difference (ClosedBackground, Background, RegionDifference)
opening_rectangle1 (RegionDifference, FinRegion, 5, 5)
area_center (FinRegion, FinArea, Row, Column)
return ()display_zoomed_region.hdvp参数如下:

源代码如下:
area_center (Region, Area, CenterRow, CenterCol)
smallest_rectangle1 (Region, Row1, Col1, Row2, Col2)
RegionHeight := Row2 - Row1
RegionWidth := Col2 - Col1
Width := (RegionWidth + 2 * Margin) * ZoomScale
Height := (RegionHeight + 2 * Margin) * ZoomScale
dev_open_window (CenterRow / 2, CenterCol / 2 + 30, Width, Height, 'black', ZoomWinID)
dev_set_part (Row1 - Margin, Col1 - Margin, Row2 + Margin, Col2 + Margin)
dev_display (Image)
dev_set_color ('red')
dev_display (Region)
wait_seconds (3)
dev_close_window ()
return ()本例子跟第二篇所讲的调用hdvp函数的方法的区别只是,本例中运行外部函数时指定了包含它们的主程序。
请看看主程序的源码:
* 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 ()其中包含了三个我们要调用的函数:
init_acquisition
detect_fin
display_zoomed_region
因此在申明HDevProcedure时加入了参数Program,即主程序对象。
var Program = new HDevProgram(ProgramPathString); var InitAcqProc = new HDevProcedure(Program, "init_acquisition"); var ProcessImageProc = new HDevProcedure(Program, "detect_fin"); var VisualizeDetailsProc = new HDevProcedure(Program, "display_zoomed_region"); InitAcqProcCall = new HDevProcedureCall(InitAcqProc); ProcessImageProcCall = new HDevProcedureCall(ProcessImageProc); VisualizeDetailsProcCall = new HDevProcedureCall(VisualizeDetailsProc);
而在第二篇中所讲的调用函数的方法是下面这样的:
var pro = new HDevProcedureCall(new HDevProcedure( "detect_fin_with_error_inpnotinit"));
HObject img=new HObject();
HOperatorSet.ReadImage(out img, "e:\\timg.jpg");
pro.SetInputIconicParamObject("Image", img);
pro.Execute();它并没有包含主程序。
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!


少有人走的路



















