Halcon+C#教程加载并显示图像

前面虽然学习了halcon的使用,并做了一些小例子,但那并不是完整的程序,你不可能教客户如何使用halcon,所以我们需要将halcon程序转换成自定义的PC程序。halcon给我们提供了C、C++、VB.NET、C#四种编程语言,任意选择一种你熟悉的语言即可,我这里仍然使用C#。

Halcon+C#教程加载并显示图像

Halcon+C#教程加载并显示图像

实现步骤

编写halcon代码

首先使用halcon编写代码,我们这里只是加载图像,所以只需要一句。

read_image (Image, 'C:/Users/Administrator/Desktop/44.bmp')

导出C#代码

选择halcon菜单中的文件下的导出功能,选择导出的语言,如下:

Halcon+C#教程加载并显示图像

Halcon+C#教程加载并显示图像

新建C#工程

使用visual studio创建一个C#窗体程序,然后在该解决方案中添加引用。

Halcon+C#教程加载并显示图像

Halcon+C#教程加载并显示图像

注意:这里的halcondonet.dll引用文件在你的halcon安装目录/bin/dotnetXX目录下,XX代表了所支持的.net框架版本,需要与VS所构建的窗口项目保持一致,不一致的在vs中右键解决方案,选择属性中修改编译框架版本!

手动添加halcon显示控件

右键工具箱,选择选择项。在弹出的窗口中选择浏览,再次找到halcondonet.dll文件,确定后该文件会被添加到列表中,勾选后点击确定按钮,完成控件的添加。

Halcon+C#教程加载并显示图像

Halcon+C#教程加载并显示图像

编写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

(0)
上一篇 2022年4月7日 01:42
下一篇 2022年4月7日 01:42

相关推荐

发表回复

登录后才能评论