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对各种操作符进行了重载
  operator     HCtrlVal(void) const;
  HTuple       operator () (Hlong min, Hlong max) const;
  HTuple       operator () (const HTuple &min, const HTuple &max) const;
  HCtrlVal    &operator [] (Hlong index);
  HCtrlVal     operator [] (Hlong index) const;
  HCtrlVal    &operator [] (const HTuple &index);
  HCtrlVal     operator [] (const HTuple &index) const;
  HTuple      &operator ++ (void); // nur fuer double und Hlong
  HBool        operator !  (void) const;
  HTuple       operator ~  (void) const;
  HTuple       operator << (const HTuple &val) const;
  HTuple       operator << (Hlong val) const;
  HTuple       operator >> (const HTuple &val) const;
  HTuple       operator >> (Hlong val) const;
  HTuple       operator +  (const HTuple &val) const;
  HTuple       operator +  (double val) const;
  HTuple       operator +  (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
int ValType() const { return val.type;}
operator int(void) const { return I();}
#if !defined(_TMS320C6X)
operator Hlong(void) const { return L();}
#endif
operator double(void) const { return D();}
operator const char*(void) const { return S();}
operator const Hcpar&(void)const { return HCPAR();}
// Access contents
double D() const;
Hlong L() const;
int I() const;
const char * S() const;
const Hcpar& HCPAR()const;
// Arithmetics
HCtrlVal operator + (const HCtrlVal &val) const;
HTuple operator + (const HTuple &val) const;
HCtrlVal operator - (const HCtrlVal &val) const;
HTuple operator - (const HTuple &val) const;
HCtrlVal operator * (const HCtrlVal &val) const;
HTuple operator * (const HTuple &val) const;
HCtrlVal operator / (const HCtrlVal &val) const;
HTuple operator / (const HTuple &val) const;
HCtrlVal operator % (const HCtrlVal &val) const;
HTuple operator % (const HTuple &val) const;
HBool operator != (const HCtrlVal &val) const;
HBool operator != (const HTuple &val) const;
HBool operator == (const HCtrlVal &val) const;
HBool operator == (const HTuple &val) const;
HBool operator >= (const HCtrlVal &val) const;
HBool operator >= (const HTuple &val) const;
HBool operator <= (const HCtrlVal &val) const;
HBool operator <= (const HTuple &val) const;
HBool operator > (const HCtrlVal &val) const;
HBool operator > (const HTuple &val) const;
HBool operator < (const HCtrlVal &val) const;
HBool operator < (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
Hcpar val; // Value: one of the three types and type specifyer
// Support operationen
void ClearCtrlVal();
void CopyCtrlVal(const HCtrlVal& source);
};

复制代码
typedef struct
{
  Hpar   par;             /* values                                          */
  INT1   type;            /* type flag                                       */
} Hcpar;                  /* parameter passing for the C interface           */
typedef union 
{
  INT4_8  l;              /* 4/8 byte integer                       (input)  */
  double  f;              /* 8 byte real                            (input)  */
  char    *s;             /* pointer to strings                     (input)  */
} Hpar;                   /* parameter passing for the C interface           */
复制代码
typedef union 
{
  INT4_8  *l;             /* 4/8 byte integer                       (output) */
  double  *f;             /* 8 byte real                            (output) */
  char    *s;             /* pointer to strings                     (output) */
  VOIDP   p;              /* 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->Halcon   Ctrl->Control   Val->Values  表示Halcon的控制变量,当然还有图形变量Hobject。)

5)往下看HCtrlVal

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

HCtrlVal类就维护了这样一个成员变量,halcon给的注释是说 val 代表数据的三种类型中的一个,并指向一个值。那么HTuple中的tuple指针就是维护了val组成的链表,这样HTuple就可以维护多种不同类型的数据。

  HTuple用起来的确很方便,halcon对其进行了大量的运算符重载包括像强制类型转换,都不需要我们手动去做,只需要在前面加个数据类型就行了。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值