C#与Halcon联合编程

来源:互联网 发布:it行业发展前景分析 编辑:程序博客网 时间:2024/06/08 03:12
C#与Halcon联合编程
  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上,作为显示窗口,调
用的接口是
hWindowControl.HalconWindow
下面是我的一个例程,可供参考。(在halcon中变量有两种类型,一种是各种常量,类型是HTuple,一种是图形/ROI变量,类型是
Hobject)
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using MySql.Data.MySqlClient;  // halcon命名空间using HalconDotNet;using namespace example{    public partial class test Form    {       HDevelopExportModel HD = new HDevelopExportModel();   public Htuple hv_ExpDefaultWinHandleModel;   private void CreatModel(object sender, EventArgs e)        {        //这个是我在窗口上创建的一个button,点击该button后,打开文件选择一张图片,并将图片进行显示。            // 建立模板按钮            string ImagePath;           // 定义模板图片的路径            HObject readImage = null;// 定义一个图像常量            OpenFileDialog openFileDialog1 = new OpenFileDialog(); //打开文件进行选择            openFileDialog1.Filter = "BMP文件|*.bmp*|PNG文件|*.png*|JPEG文件|*.jpg*";     //图片的文件格式            openFileDialog1.RestoreDirectory = true;            openFileDialog1.FilterIndex = 1;            if (openFileDialog1.ShowDialog() == DialogResult.OK)            {                // 如果可以打开该文件路径,将该文件路径的图片显示在hWindowControl2窗口,并将图片变量赋值给readImage                ImagePath = openFileDialog1.FileName;                readImage = HD.ReadPicture(hWindowControl2.HalconWindow, ImagePath);                 // 读取这张图片并将图片赋值给readImage,这句就是直接调的halcon类了,下边public定义的的是他的类            }        }    }    public partial class HDevelopExportModel    {        public HObject ReadPicture(HTuple window, string ImagePath)        {            // 得到图片显示的窗口句柄            hv_ExpDefaultWinHandleModel = window; //从上个函数传进来的窗口句柄            HOperatorSet.GenEmptyObj(out ho_Image);            ho_Image.Dispose();            HOperatorSet.ReadImage(out ho_Image, ImagePath); //从这个路径读取图片            HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height); //得到他的大小            HOperatorSet.SetWindowAttr("background_color", "black");            //调整窗口显示大小以适应图片,这句一定要加上,不然图片显示的不全            HOperatorSet.SetPart(hv_ExpDefaultWinHandleModel, 0, 0, hv_Height - 1, hv_Width - 1);            HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandleModel); //将图像在该窗口进行显示            return ho_Image; //返回这个图像        }    } //end HDevelopExportModel}// end example

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

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

1 0