halcon引擎学习笔记(一)执行hdev程序

勇哥这套halcon引擎的学习笔记贴子共七篇,它是在官方指导文档《http://www.skcircle.com/?id=1343》的基础上学习编写而成的笔记。只是有一篇讲解怎么调用向量变量的没有加入,因为勇哥实在不知道这个向量变量有啥子用。以后如果搞明白了再加入吧。


2020/7/3勇哥注:

原来halcon中的向量就是个容器,跟c++标准模板库中的那个向量是一致的。第八篇加上来吧

halcon引擎学习笔记(八)使用向量变量


halcon引擎学习笔记(七)在在HDevEngine/C#中使用实时编译器JIT 

halcon引擎学习笔记(六)多线程并发执行外部函数,多窗口显示  

halcon引擎学习笔记(五)多线程并发执行外部函数  

halcon引擎学习笔记(四)调用时的错误处理   

halcon引擎学习笔记(三)执行本地或者外部程序   

halcon引擎学习笔记(二)执行Procedure程序,扩展名为hdvp的halcon函数   

halcon引擎学习笔记(一)执行hdev程序   

演示程序勇哥用的是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代码那里实时下断点。



image.png


程序

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

版权声明:本文为博主原创文章,转载请附上博文链接!



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:
本帖最后由 勇哥,很想停止 于 2020-06-26 15:10:48 编辑
  • 评论列表:
  •  zr
     发布于 2020-10-29 10:29:00  回复该评论
  • "实现修改halcon程序并保存后,C#这边能实时运行修改后的halcon程序"
    这个应该可以用C#做一个指定监控某个文件/文件夹是否有变动更新,如果发现文件有更新,那么就重新加载它
  •  访客
     发布于 2020-12-14 09:55:13  回复该评论
  • 使用halcon19版本的,halcon引擎 执行时 报错 HalconDotNet.HDevEngineException:“User defined error during execution in procedure: 'main' line: 1, dev_get_window:
    Wrong number of values of object parameter 1”
    hdev代码(在halcon里运行没有错,在VS里面运行就报错,语言C#)
    dev_get_window (WindowHandle)
    px:=280
    py:=300
    r:=200
    xary:=[]
    yary:=[]
    step:=2
    for Index := 0 to 360/step by step
    x:=px+px/2*cos(rad(step*Index+step))
    y:=py+py/2*sin(rad(step*Index+step))
    xary[Index/step]:=x
    yary[Index/step]:=y
    disp_polygon(WindowHandle, xary, yary)
    endfor
    请问是什么问题呢?
    •  勇哥,很想停止
       发布于 2020-12-14 17:24:21  回复该评论
    • 在代码里不要用dev_get_window。应该在C#的winform上面放置halcon窗口,使用这个窗口来显示
  •  访客
     发布于 2020-12-17 09:53:32  回复该评论
  • 使用工业相机SDK的话,如何从buffer里获取一帧直接传给Halcon引擎的procedure呢
  •  a496407151
     发布于 2021-08-21 18:31:27  回复该评论
  • 已经找到了解析hdev文件的方法,并用脚本编辑器的方式把他打开。不过还没找到比较好的保存方式。
  •  ZYX
     发布于 2024-01-02 13:12:51  回复该评论
  • 多个视觉窗体和多个视觉处理流程如34.35行那样做了关联 ,为什么只显示到最后一个窗体

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864