halcon 与 C# 混合编程之 Halcon 代码调用 写在前面 完成 halcon 与 C# 混合编程的环境配置后, 进行界面布局设计构思每一个按钮所需要实现 的功能, 将 Halcon 导出的代码复制至相应的 C# 模块下即可 halcon 源程序 : dev_open_window(0, 0, 512, 512, 'black', WindowHandle) read_image (Image, 'C:/Users/Administrator/Desktop/ 猫.jpg') dev_display(image) get_image_size(image, Width, Height) rgb3_to_gray(image, Image, Image, ImageGray) dev_display(imagegray) 注意 : 写 halcon 程序时, 如果过程中的图片需要显示出来, 则需要在每个过程中都添加 dev_display(**) 第一步 : 导出 C# 程序, 建立项目, 并添加此类 // // File generated by HDevelop for HALCON/DOTNET (C#) Version 10.0 // // This file is intended to be used with the HDevelopTemplate or
// HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c# using System; using HalconDotNet; public partial class HDevelopExport public HTuple hv_expdefaultwinhandle; // Main procedure private void action() // Local iconic variables HObject ho_image, ho_imagegray; // Local control variables HTuple hv_width, hv_height; // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_image); HOperatorSet.GenEmptyObj(out ho_imagegray); //dev_open_window(...); ho_image.dispose(); HOperatorSet.ReadImage(out ho_image, "C:/Users/Administrator/Desktop/ 猫.jpg"); HOperatorSet.DispObj(ho_Image, hv_expdefaultwinhandle);
HOperatorSet.GetImageSize(ho_Image, out hv_width, out hv_height); ho_imagegray.dispose(); HOperatorSet.Rgb3ToGray(ho_Image, ho_image, ho_image, out ho_imagegray); HOperatorSet.DispObj(ho_ImageGray, hv_expdefaultwinhandle); ho_image.dispose(); ho_imagegray.dispose(); public void InitHalcon() // Default settings used in HDevelop HOperatorSet.SetSystem("do_low_error", "false"); public void RunHalcon(HTuple Window) hv_expdefaultwinhandle = Window; action(); 第二步 : 布局设计
本程序需要显示图片的 halconwindow 控件和读图以及处理图片的两个 button 控件 ; 如下图 : 第三步 : 将导出的类进行框架分解 如果想在程序中添加不同的按键, 比如一个用来打开图片, 一个用来处理图片, 则就需要将 halcon 导出的类进行分解 ; 框架如下 : // 定义变量 // 初始化 halcon public void InitHalcon() // 初始化 halcon 程序
// 读取图片 public void ReadPicture(HTuple Window) // 读图程序 // 处理图片 public void Process() // 处理程序 第四步 : 填补框架 将对应框架下得程序进行填补操作 ( 下边程序可以代替 public partial class HDevelopExport 下的所有程序 ): // 定义变量 public HTuple hv_expdefaultwinhandle; HObject ho_image, ho_imagegray; HTuple hv_width, hv_height; // 初始化 halcon
public void InitHalcon() // Default settings used in HDevelop HOperatorSet.SetSystem("do_low_error", "false"); public void ReadPicture(HTuple Window) // 读图并显示 hv_expdefaultwinhandle = Window; HOperatorSet.GenEmptyObj(out ho_image); ho_image.dispose(); HOperatorSet.ReadImage(out ho_image, "C:/Users/Administrator/Desktop/ 猫.jpg"); HOperatorSet.DispObj(ho_Image, hv_expdefaultwinhandle); HOperatorSet.GetImageSize(ho_Image, out hv_width, out hv_height); public void Process() // 处理程序 HOperatorSet.GenEmptyObj(out ho_imagegray);
ho_imagegray.dispose(); HOperatorSet.Rgb3ToGray(ho_Image, ho_image, ho_image, out ho_imagegray); HOperatorSet.DispObj(ho_ImageGray, hv_expdefaultwinhandle); ho_image.dispose(); ho_imagegray.dispose(); 第五步 : 在主程序 Form1.cs 中添加程序 : 1 在主程序 Form1 的类下对刚才添加的类进行实例化 : HDevelopExport hd = new HDevelopExport(); 2 在按键下添加相应程序 private void button1_click(object sender, EventArgs e) hd.readpicture(hwindowcontrol1.halconwindow); private void button2_click(object sender, EventArgs e) hd.process(); 此步骤完成之后, 程序可以运行 附加步骤 1:
在以上程序中, 已经可以将图片显示出来, 并进行处理, 但由于窗口与图片的大小不一致, 导致在显示窗口中不能适应程序窗口的大小, 下面是解决此类问题的方法 : 在读图程序中, 将获取图片的大小的程序 HOperatorSet.GetImageSize(ho_Image, out hv_width, out hv_height); 放在显示图片之前, 并在显示图片程序之前加入下面程序 : HOperatorSet.SetPart(hv_ExpDefaultWinHandle, 0, 0, hv_height - 1, hv_width - 1); 然后图片就可以适应窗口大小 此步骤也可以在 halcon 中更改 附加步骤 2: 如果想在程序中能够打开本地文件夹的图片进行处理, 则需要改以下程序 : 注意 :12 是添加的类中 34 是主程序中 1 将 public void ReadPicture(HTuple Window) 的括号中加入参数, 改为 public void ReadPicture(HTuple Window, string ImagePath) 2 将 ReadPicture 下的程序 HOperatorSet.ReadImage(out ho_image, "C:/Users/Administrator/Desktop/ 猫.jpg"); 改为 HOperatorSet.ReadImage(out ho_image, ImagePath); 3 主程序中定义变量 string ImagePath 4 将 button1 的程序改成如下 : private void button1_click(object sender, EventArgs e)
OpenFileDialog openfiledialog1 = new OpenFileDialog(); openfiledialog1.filter ="JPEG 文件 *.jpg* BMP 文件 *.bmp*"; openfiledialog1.restoredirectory = true; openfiledialog1.filterindex = 1; if (openfiledialog1.showdialog() == DialogResult.OK) ImagePath = openfiledialog1.filename; hd.readpicture(hwindowcontrol1.halconwindow, ImagePath); 接下来可以试试运行程序