天天看点

Halcon HSmartWindowControl之显示图像

概述:使用Halcon在VS中的控件显示一张图片。

要点:使用了图像缩放和图像显示函数,以及鼠标滚轮响应函数。

1、创建WinForm项目

首先在VS中添加Halcon所需的控件HSmartWindowControl

然后创建新的winForm工程,并向窗体中拖入一个HSmartWindowControl控件和两个按钮控件。

Halcon HSmartWindowControl之显示图像

拖入后不添加代码,直接运行,可能会出现如下错误:

HalconDotNet.HHandleBase 的类型初始化值设定项引发异常

Halcon HSmartWindowControl之显示图像

Halcon error #2381:License is for wrong edition of Halcon in Operator set_system

Halcon HSmartWindowControl之显示图像

原因是halcon运行库是64位的,vs的运行模式也需要设置为64位,默认的debug模式可能是any CPU,需要把这里修改成x64。

Halcon HSmartWindowControl之显示图像

或者从解决方案资源管理器(solution Explorer)中双击打开属性(Property)页面,把Build栏的Platform target 改为x64即可。

Halcon HSmartWindowControl之显示图像

2、创建Halcon实时显示代码并导出

打开halcon,写一句简单的代码

Halcon HSmartWindowControl之显示图像

接着,选择文件->导出,将HDevelop语言导出为C#语言。

Halcon HSmartWindowControl之显示图像

3、halcon 导出的C#代码分析

实际有用的代码就是action()内的代码,首先声明了图像变量:HObject ho_Image;

需要注意的是,图像类型需要先初始化再使用:HOperatorSet.GenEmptyObj(out ho_Image);

然后调用ReadImage函数读入图像文件,最后调用Dispose函数清空对象。但是没有显示图像的代码,需要自己添加。

4、向VS中插入代码

打开Winform工程窗体关联的cs文件Form1.cs,首先需要在文件头部添加命名空间引用:

需要在类中定义全局的窗口变量,便于操作窗体:

窗口的初始化函数中添加全局变量的初始化函数:

然后在按钮的响应函数中添加载入图像的及显示的代码:

5、图像缩放和显示

这里我对导出的代码做了修改,主要是增加了图像缩放和显示功能。

图像缩放使用了ZoomImageSize函数,在帮助文档中,这个函数有两种用法:

上面的代码中使用了第一种用法,所有的参数必须是Halcon的类型,但是实际使用时width 和height 可以用int类型,interpolation即差值算法参数也可以直接传入string类型,如“constant”。

第二种方法需要将使用HImage类型的变量来操作,所以需要将 HObject 类型定义的图像变量转换一下:

图像显示功能:先调用SetPart函数确定要显示图像的区域,然后调用DispObj函数显示图像,DispObj也有三种用法:

此处我用的第三种:通过Hwindow调用,参数为要显示的图像变量。

6、SmartWindowControl窗口交互

前面实现了图像显示,SmartWindowControl最大的亮点其实是方便的交互功能。

可以用鼠标拖动图像水平移动,利用鼠标滚轮实现图像放大缩小。

另外,在winForm项目中,为了使用SmartWindowControl控件中图像的缩放,还需要添加鼠标滚轮响应的回调函数。

详见:C:/Program Files/MVTec/HALCON-18.05-Progress/doc/html/manuals/programmers_guide/programmers_guide_0051.html

Halcon HSmartWindowControl之显示图像

实际测试发现帮助文档中的用法有一些问题,消息相应函数的注册应该在整个窗体的初始化函数中,而不是SmartWindowControl的初始化函数中。

这样修改后,直接使用帮助文档中提供的my_MouseWheel也有一个小bug,就是无论在窗体的任何位置滑动滚轮,图片都会缩放,所以需要对鼠标的位置做一下限制: