前面虽然学习了halcon的使用,并做了一些小例子,但那并不是完整的程序,你不可能教客户如何使用halcon,所以我们需要将halcon程序转换成自定义的PC程序。halcon给我们提供了C、C++、VB.NET、C#四种编程语言,任意选择一种你熟悉的语言即可,我这里仍然使用C#。
实现步骤
编写halcon代码
首先使用halcon编写代码,我们这里只是加载图像,所以只需要一句。
read_image (Image, 'C:/Users/Administrator/Desktop/44.bmp')
导出C#代码
选择halcon菜单中的文件下的导出功能,选择导出的语言,如下:
新建C#工程
使用visual studio创建一个C#窗体程序,然后在该解决方案中添加引用。
注意:这里的halcondonet.dll
引用文件在你的halcon安装目录/bin/dotnetXX目录下,XX代表了所支持的.net框架版本,需要与VS所构建的窗口项目保持一致,不一致的在vs中右键解决方案,选择属性中修改编译框架版本!
手动添加halcon显示控件
右键工具箱,选择选择项。在弹出的窗口中选择浏览,再次找到halcondonet.dll
文件,确定后该文件会被添加到列表中,勾选后点击确定按钮,完成控件的添加。
编写C#程序
添加引用文件后,还需使用using HalconDotNet;
指令,在C#窗体中拖入刚刚添加的hWindowControl控件(完成上一步,就可以在工具箱中看到添加的控件)。
打开刚刚导出的C#程序代码,可以看到很多代码,我们只需要关心private void action()
方法下的代码即可,我们可以看到如下代码:
private void action() { // Local iconic variables HObject ho_Image; // Local control variables HTuple hv_Width = new HTuple(), hv_Height = new HTuple(); // Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_Image); ho_Image.Dispose(); HOperatorSet.ReadImage(out ho_Image, "C:/Users/Administrator/Desktop/44.bmp"); hv_Width.Dispose();hv_Height.Dispose(); HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height); ho_Image.Dispose(); hv_Width.Dispose(); hv_Height.Dispose(); }
由于我们没有写显示图像的代码,所以上面的代码只是读入图像,并取得图像的长宽数据。为了让图像显示在我们添加的hWindowControl控件上,我们可以修改上面的代码,在按钮点击事件下写入如下代码:
private void button1_Click(object sender, EventArgs e) { HObject ho_Image; //halcon对象变量,这里指图像 HTuple hv_Width = new HTuple(), hv_Height = new HTuple(); //halcon数据变量,这里指长宽 //读入图像 HOperatorSet.ReadImage(out ho_Image, "C:/Users/Administrator/Desktop/44.bmp"); //获取长宽 HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height); //设置图像大小自适应控件长宽 HOperatorSet.SetPart(hWindowControl1.HalconWindow,0,0,hv_Height+1,hv_Width+1); //设置图像显示在hWindowControl控件上 HOperatorSet.DispObj(ho_Image,hWindowControl1.HalconWindow); //显示图像 ho_Image.Dispose(); }
代码非常简单,个人觉得halcon导出的程序可读性不够强,有很多不必要的代码,这可能与我写的halcon程序不规范有关。halcon要与C#配合,使用者需要有教高的编程语言功底,否则你看不懂导出的程序代码什么意思,那就没得玩儿了。
相信大家也看出来了,其实halcon不需要使用它导出代码的那一步,你可以直接使用HalconDotNet
动态链接库中的方法编写程序,只是里面的方法名称与halcon使用的算子名称有点区别,不熟悉还是不建议这样使用。
比如我再添加一个按钮,使用打开文件对话框拿到图像地址,根据用户选择的图像加载并显示出来,代码如下:
private void button2_Click(object sender, EventArgs e) { OpenFileDialog opf = new OpenFileDialog(); if (opf.ShowDialog() == DialogResult.OK) { String fileName = opf.FileName; HObject ho_Image; HTuple hv_Width = new HTuple(), hv_Height = new HTuple(); HOperatorSet.ReadImage(out ho_Image, fileName); HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height); HOperatorSet.SetPart(hWindowControl1.HalconWindow,0,0,hv_Height+1,hv_Width+1); HOperatorSet.DispObj(ho_Image, hWindowControl1.HalconWindow); ho_Image.Dispose(); } }
这段代码就不是halcon生成的,一样正常运行,没有任何问题!
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/241848.html