halcon数据类型分析

halcon的数据类型

halcon的两类参数:图形参数Iconic (image, region, XLD)与控制参数Control (string, integer, real, handle)
在Halcon算子的参数中,依次顺序为:输入图形参数、输出图形参数、输入控制参数、输出控制参数;并且其输入参数不会被算子改变。
1、图形参数Hobject:
1)Images
在Halcon中,Image = Channel + Domain , 像素点存放在Channel矩阵中,根据ROI来描述Image。
2)Regions
以行列坐标形式储存,有广泛的应用,特点是高效,可利用同态算子。比如用阈值对图像分割的结果,其他系统中称为BOLB,AREA等。
3)Extended Line Description (XLD)
图像均用像素点保存,而像素点是整型的,不连续的,Halcon做了拓展,定义了亚像素(subpixel)的描述几何轮廓的对象:xld,主要用在亚像素测量的背景下,可用于如提取边缘、构建轮廓等等,xld在模板匹配、图形校准等多方面有重要的用途。

2、控制参数HTuple
halcon中最重要的数据类型HTuple,在C++里面,halcon将HTuple类型封装了类,其始祖类HRootObject,这个类相当于MFC里面的CObject,halcon从HRootObject派生了HBaseArray,当然这两个类是虚基类,有一些方法需要我HTuple自己实现,当然也有一些方法可以直接用的。这两个类在HCPPUtil里,可以看到。
1)HTuple类就是从HBaseArray派生,元组基类,相当于数组,具有如下的构造函数:


HTuple(int l); HTuple(float f); HTuple(double d); HTuple(const char *s); HTuple(const HCtrlVal &c); HTuple(const HTuple &in):HBaseArray() {CopyTuple(in); } HTuple(Hlong length, const HTuple &value); HTuple(const HTuple &length, const HTuple &value); HTuple(SpecialTuple d)


2)HTuple对各种操作符进行了重载

operatorHCtrlVal(void) const; HTupleoperator () (Hlong min, Hlong max) const; HTupleoperator () (const HTuple &min, const HTuple &max) const; HCtrlVal&operator [] (Hlong index); HCtrlValoperator [] (Hlong index) const; HCtrlVal&operator [] (const HTuple &index); HCtrlValoperator [] (const HTuple &index) const; HTuple&operator ++ (void); // nur fuer double und Hlong HBooloperator !(void) const; HTupleoperator ~(void) const; HTupleoperator << (const HTuple &val) const; HTupleoperator << (Hlong val) const; HTupleoperator >> (const HTuple &val) const; HTupleoperator >> (Hlong val) const; HTupleoperator +(const HTuple &val) const; HTupleoperator +(double val) const; HTupleoperator +(int val) const;


3)在讲解halcon是如何维护这样一个HTuple中各种数据之前 ,先来看看这样一个类:

class LIntExport HCtrlVal{ friend class HTuple; public: HCtrlVal(void){val.type= UndefVal; val.par.l = 0; } #if !defined(_TMS320C6X) HCtrlVal(Hlong l){val.type= LongVal; val.par.l = l; } #endif HCtrlVal(int l){val.type= LongVal; val.par.l = l; } HCtrlVal(double d){val.type= DoubleVal; val.par.f = d; } HCtrlVal(const char *s); HCtrlVal(const HCtrlVal &v) {CopyCtrlVal(v); } ~HCtrlVal(void){ClearCtrlVal(); } HCtrlVal& operator = (const HCtrlVal &v); // Type conversion intValType() const{return val.type; } operatorint(void) const{return I(); } #if !defined(_TMS320C6X) operatorHlong(void) const{return L(); } #endif operatordouble(void) const{return D(); } operatorconst char*(void) const{return S(); } operatorconst Hcpar&(void)const{return HCPAR(); } // Access contents doubleD() const; HlongL() const; intI() const; const char *S() const; const Hcpar&HCPAR()const; // Arithmetics HCtrlValoperator + (const HCtrlVal &val) const; HTupleoperator + (const HTuple &val) const; HCtrlValoperator - (const HCtrlVal &val) const; HTupleoperator - (const HTuple &val) const; HCtrlValoperator * (const HCtrlVal &val) const; HTupleoperator * (const HTuple &val) const; HCtrlValoperator / (const HCtrlVal &val) const; HTupleoperator / (const HTuple &val) const; HCtrlValoperator % (const HCtrlVal &val) const; HTupleoperator % (const HTuple &val) const; HBooloperator != (const HCtrlVal &val) const; HBooloperator != (const HTuple &val) const; HBooloperator == (const HCtrlVal &val) const; HBooloperator == (const HTuple &val) const; HBooloperator >= (const HCtrlVal &val) const; HBooloperator >= (const HTuple &val) const; HBooloperator <= (const HCtrlVal &val) const; HBooloperator <= (const HTuple &val) const; HBooloperator > (const HCtrlVal &val) const; HBooloperator > (const HTuple &val) const; HBooloperator < (const HCtrlVal &val) const; HBooloperator < (const HTuple &val) const; const char *ClassName(void) const { return "HCtrlVal"; } int Version(void) const; int Revision(void) const; const char *Creation(void) const; private: // Data Hcparval; // Value: one of the three types and type specifyer // Support operationen void ClearCtrlVal(); void CopyCtrlVal(const HCtrlVal& source); };

halcon数据类型分析
文章图片
typedef struct { Hparpar; /* values*/ INT1type; /* type flag*/ } Hcpar; /* parameter passing for the C interface*/

typedef union { INT4_8l; /* 4/8 byte integer(input)*/ doublef; /* 8 byte real(input)*/ char*s; /* pointer to strings(input)*/ } Hpar; /* parameter passing for the C interface*/

halcon数据类型分析
文章图片
typedef union { INT4_8*l; /* 4/8 byte integer(output) */ double*f; /* 8 byte real(output) */ char*s; /* pointer to strings(output) */ VOIDPp; /* pointer to var. of any type (e.g. tuple)(output)*/ } Hvar; /* parameter passing for the C interface*/



这四段代码可以说是halcon维护HTuple这种数据类型的精髓了。下面我们来分析一下。
4)首先HTuple类中有私有成员变量:

private: HCtrlVal*tuple; // values (array of Hlong/float/string)

halcon给的注释写的很清楚,tuple是一群值,指向一个数组,数组里面有long型,浮点型及字符串型数据。这是一个指针,这个类就是维护这样一个指针,具体此指针的内容,我们往下看HCtrlVal: (这里说一下这几个单词的意义吧:H->HalconCtrl->ControlVal->Values表示Halcon的控制变量,当然还有图形变量Hobject。)

5)往下看HCtrlVal

private: // Data Hcparval; // Value: one of the three types and type specifyer


HCtrlVal类就维护了这样一个成员变量,halcon给的注释是说 val 代表数据的三种类型中的一个,并指向一个值。那么HTuple中的tuple指针就是维护了val组成的链表,这样HTuple就可以维护多种不同类型的数据。
【halcon数据类型分析】HTuple用起来的确很方便,halcon对其进行了大量的运算符重载包括像强制类型转换,都不需要我们手动去做,只需要在前面加个数据类型就行了。

    推荐阅读