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 这个人的博客,写的非常详细。
最后让我吐槽一下这个代码编辑器。。。真是太难用了
|