分享

C#与Halcon联合编程

 leicun 2018-05-19
  Halcon作为一款强大的图形图像处理软件,可对工作中遇到的各种图像进行处理,同时还有功能强大的算子以及很全面的例程,作为进行处理的主程序是非常不错的。但是,halcon依旧有缺陷,就是无法做到图形化界面的建立,故需要和其他软件联合编程才行。还好,halcon可以导出成各个语言进行二次开发。本文即介绍如何用halcon和C#进行联合开发。
首先,即先将代码导出,导出为C#格式。
选择C#-HALCON/.NET,窗口导出时选择使用halcon窗口,找到导出的文件用VS打开。
对于导出后的代码,halcon原有的程序放在action中,需要自己对action中的文件进行分类归纳,同样也可在halcon中直接进行函数封装后再导出。
对于导出的程序,是无法直接运行的,编译器会首先在这一句报错:
using HalconDotNet;
这是由于还未将halcondotnet.dll文件添加进入你的工程中,首先右键资源管理器,然后添加->引用->浏览,找到你的这个文件,这个
库文件是放在你的安装程序文件夹下C:\Program Files\MVTec\HALCON-10.0\bin\dotnet35(这个是我的安装位置),然后添加进入。现在
程序中的报错已经没有了,可以正确运行了。
你可以在一个Form窗口上创建一个button,然后在设计窗口双击该button,进行button编辑。然后一点点的将action中的东西拿来用
做成一个界面图像处理的小软件。同时,halcon中提供的画面显示窗口并不好用,如果想在界面上直接显示图像的话,最好在界面上
添加一个halcon封好的固定窗口。方式,点击工具箱,拉到最下,有个halcon的小图标,那个就是窗口,拖到Form上,作为显示窗口,调
用的接口是
  1. hWindowControl.HalconWindow  
下面是我的一个例程,可供参考。(在halcon中变量有两种类型,一种是各种常量,类型是HTuple,一种是图形/ROI变量,类型是
Hobject)
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Linq;  
  7. using System.Text;  
  8. using System.Windows.Forms;  
  9. using MySql.Data.MySqlClient;    
  10. // halcon命名空间  
  11. using HalconDotNet;  
  12. using namespace example  
  13. {  
  14.     public partial class test Form  
  15.     {  
  16.        HDevelopExportModel HD = new HDevelopExportModel();  
  17.        public Htuple hv_ExpDefaultWinHandleModel;  
  18.        private void CreatModel(object sender, EventArgs e)  
  19.         {  
  20.             //这个是我在窗口上创建的一个button,点击该button后,打开文件选择一张图片,并将图片进行显示。  
  21.             // 建立模板按钮  
  22.             string ImagePath;           // 定义模板图片的路径  
  23.             HObject readImage = null;   // 定义一个图像常量  
  24.             OpenFileDialog openFileDialog1 = new OpenFileDialog(); //打开文件进行选择  
  25.             openFileDialog1.Filter = "BMP文件|*.bmp*|PNG文件|*.png*|JPEG文件|*.jpg*";     //图片的文件格式  
  26.             openFileDialog1.RestoreDirectory = true;  
  27.             openFileDialog1.FilterIndex = 1;  
  28.             if (openFileDialog1.ShowDialog() == DialogResult.OK)  
  29.             {  
  30.                 // 如果可以打开该文件路径,将该文件路径的图片显示在hWindowControl2窗口,并将图片变量赋值给readImage  
  31.                 ImagePath = openFileDialog1.FileName;  
  32.                 readImage = HD.ReadPicture(hWindowControl2.HalconWindow, ImagePath);   
  33.                 // 读取这张图片并将图片赋值给readImage,这句就是直接调的halcon类了,下边public定义的的是他的类  
  34.             }  
  35.   
  36.         }  
  37.     }  
  38.     public partial class HDevelopExportModel  
  39.     {  
  40.         public HObject ReadPicture(HTuple window, string ImagePath)  
  41.         {  
  42.             // 得到图片显示的窗口句柄  
  43.             hv_ExpDefaultWinHandleModel = window; //从上个函数传进来的窗口句柄  
  44.             HOperatorSet.GenEmptyObj(out ho_Image);  
  45.             ho_Image.Dispose();  
  46.             HOperatorSet.ReadImage(out ho_Image, ImagePath); //从这个路径读取图片  
  47.             HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height); //得到他的大小  
  48.             HOperatorSet.SetWindowAttr("background_color", "black");  
  49.             //调整窗口显示大小以适应图片,这句一定要加上,不然图片显示的不全  
  50.             HOperatorSet.SetPart(hv_ExpDefaultWinHandleModel, 0, 0, hv_Height - 1, hv_Width - 1);  
  51.             HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandleModel); //将图像在该窗口进行显示  
  52.             return ho_Image; //返回这个图像  
  53.         }  
  54.     } //end HDevelopExportModel  
  55. }// end example  


你可以在HDevelopExportModel类中添加各种函数以便在窗体上操作时进行调用,这个就靠自己开发了。
在调用时,一定要将action中的程序封装成多个子函数进行调用,不然到时候程序越写越大就不可控了,不要问我怎么知道的,
都是泪!
目前我也正在学习两者联合开发,磨合中。。。我的讲解只是一个大概,如果想看更详细的讲解请转到
http://www.cnblogs.com/hanzhaoxin/archive/2013/02/03/2890871.html 这个人的博客,写的非常详细。

最后让我吐槽一下这个代码编辑器。。。真是太难用了

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多