(instancesofclass)来调用halcon算子。在halcondotnet引用里,也就是动态链接库里包许多实例化一个类方法,这些
方法可能是重载的,静态的halcon算子大家可以直接通过类名来调用(这些方法包括halcon里所有的算子),而非静态的方法必须要通过实例化一个类
后才可以使用,通常halcon/.net封装了一个类的实例化方法以及类方法。
例如在c++中,可以使用以下两种方法:
1.c++(算子模式)
通过代码导出,以c++为例,默认导出为算子型的语法结构,而非面向对象的;在此模式下,全部函数声明为全局类型,数据类型只需要用hobject、htuple两类类型进行声明;
2.c++(面向对象)
可以以面向对象的方式重写代码,也即利用类及类的成员函数;在这种模式下,控制变量的类型仍未htuple,而图形数据可以由多种类型,如himage等;
halcon手册建议使用者使用第二种方法。
例如大家使用第二种方法实现抓取图像序列(imagesequence)里第一张图像,并且将他显示在hwindowcontrol窗口中。代码是:
[cpp]viewplaincopy
privatehwindowwindow;
privatehframegrabberframegrabber;
privatehimageimg;
window=windowcontrol.halconwindow;
framegrabber=newhframegrabber(“file”,1,1,0,0,0,0,”default”,
-1,”default”,-1,”default”,
“board/board.seq”,”default”,1,-1);
img=framegrabber.grabimage();
img.dispobj(window);
grabimage算子是通过hframegrabber的实例来调用的。如果你是一个有经验的halcon使用者,也许你已经看出来hframegrabber的构造函数调用了openframegraber算子。
但是对于新手来说,可能刚刚接触halcon,对于halcon算子还处于熟悉阶段,从hdevelop中直接到出来的代码也是直接使用静态类。那么建议先使用第一种方法,你只需要明白通过hoperatorset这个类你可以调用任何一个halcon算子。
下面大家来看一下到底怎么样调用一个算子。以grabimage算子为例:
[cpp]viewplaincopy
staticvoidhoperatorset.grabimage(outhobjectimage,htupleacqhandle)//静态方法直接调用算子,包含的参数和halcon算子参数完全相同
voidhimage.grabimage(hframegrabberacqhandle)//类中封装的类方法,要先实例化类后才可以使用
himagehframegrabber.grabimage()//重载的方法
image(output_object)……………………………………………..image;himage
acqhandle(input_control)……………………..framegrabber;hframegrabber/htuple
[cpp]viewplaincopy
大家可以看出,算子可以通过三个类进行调
用:hoperatorset,himage,和hframegrabber。其中第一种通过hoperatorset调用主要是用在导出的
hdevelop中(如果你导出程序的话就会看到),也是建议新手使用的方法。而熟悉了之后一般大家在写程序时建议使用另外两种方式,就像下面这样进行调
用:
[cpp]viewplaincopy
himageimage1;
himageimage4=newhimage();
hframegrabberframegrabber=
newhframegrabber(“file”,1,1,0,0,0,0,”default”,-1,
“default”,-1,”default”,”board/board.seq”,”default”,-1,-1);
image1=framegrabber.grabimage();
himageimage3=null;
需要注意的是通过
hframegrabber调用返回方法的值,而通过himage调用没有返回值而是调用的类实例被修改,也就是himage对象被修改。通常,调用类实
例不会被一个算子所修改,除了被上面所看到的“类构造器”(constructor-like)算子调用。
一些算子像countseconds可以当做类方法来使用,例如,你可以直接通过类名调用它们而不用生成一个实例:
[cpp]viewplaincopy
doubles1,s2;
s1=hsystem.countseconds();
这是因为这些算子声明前面都有static关键字:
[cpp]viewplaincopy
staticvoidhoperatorset.countseconds(outhtupleseconds)
staticdoublehsystem.countseconds()
下面大家看一下类的生命周期:从声明(declaration)到终结(finalization)
下面的声明仅仅声明了一个类himage的变量,而没有指向任何的对象:
[cpp]viewplaincopy
himageimage1;
在这个语句中,你不能只使用变量直接去调用算子;有些语言里面甚至不能够将它用做一个输出参数(例如vb2005)。只有先给它一个图像对象,例如:
[cpp]viewplaincopy
image1=framegrabber.grabimage();
你也可以在声明的时候初始化一个变量:
[cpp]viewplaincopy
himageimage2=framegrabber.grabimage();
[cpp]viewplaincopy