#if defined(__CHAR_UNSIGNED__) || defined(__sgi)
#define INT1 signed char /* integer, signed 1 Byte */
#define INT1_MIN SCHAR_MIN
#define INT1_MAX SCHAR_MAX
#else
#define INT1 char /* integer, signed 1 Byte */
#define INT1_MIN CHAR_MIN
#define INT1_MAX CHAR_MAX
#endif
#define UINT1 unsigned char /* integer, unsigned 1 Byte */
#define UINT1_MIN 0
#define UINT1_MAX UCHAR_MAX #define LONG_FORMAT _INT64_FORMAT
typedef INT4_8 Hlong;
typedef UINT4_8 Hulong;

  看粗体部分,可以看到 Hlong型在32位的机器上其实就是long型 代表4个字节 32位,在64位机器上有另一种定义

  再来看看halcon中最重要的数据类型HTuple,在C++里面,halcon将HTuple类型封装了类,其始祖类HRootObject,这个类相当于MFC里面的CObject,halcon从HRootObject派生了HBaseArray,当然这两个类是虚基类,有一些方法需要我HTuple自己实现,当然也有一些方法可以直接用的。这两个类在HCPPUtil里,可以看看。

  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);

  

  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;

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

  

class LIntExport HCtrlVal  {
friend class HTuple;
public:
HCtrlVal(void) {val.type = UndefVal; val.par.l = ;}
#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这种数据类型的精髓了。下面我们来讲解一下:

  首先HTuple类中有私有成员变量:

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

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

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

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

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

  好了,由于本人水平有限,文中可能会有纰漏,敬请指出!

  added by xiejl

halcon基础数据类型详解的更多相关文章

  1. Java基础数据类型详解

    在Java中的数据类型一共有8种,大致分为整型(4个)浮点型(2个)布尔(1)字符(1个) 分类 类型 默认值 占用字节 范围 整型 byte 0 1 = 8 bit -2^7 - 2^7 short ...

  2. Python基础之数据类型详解(2)

    今天继续昨天的python基本数据类型详解,按照上一篇博文的格式,接下来讲解列表.元组.字典以及集合. 列表 1.用途按位置存放多个值2.定义在[]内用逗号分割开多个任意类型的元素 # 定义列表 # ...

  3. ClickHouse(05)ClickHouse数据类型详解

    ClickHouse属于分析型数据库,ClickHouse提供了许多数据类型,它们可以划分为基础类型.复合类型和特殊类型.其中基础类型使ClickHouse具备了描述数据的基本能力,而另外两种类型则使 ...

  4. MySQL 数据类型 详解

    MySQL 数据类型 详解 MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数.许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 My ...

  5. I2C 基础原理详解

    今天来学习下I2C通信~ I2C(Inter-Intergrated Circuit)指的是 IC(Intergrated Circuit)之间的(Inter) 通信方式.如上图所以有很多的周边设备都 ...

  6. oracle 数据类型详解---日期型(转载)

    oracle 数据类型详解---日期型 oracle数据类型看起来非常简单,但用起来会发现有许多知识点,本文是我对ORACLE日期数据类型的一些整理,都是开发入门资料,与大家分享: 注:由于INTER ...

  7. python 3.x 爬虫基础---Urllib详解

    python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 前言 爬虫也了解了一段时间了希望在半个月的时间内 ...

  8. python之数据类型详解

    python之数据类型详解 二.列表list  (可以存储多个值)(列表内数字不需要加引号) sort s1=[','!'] # s1.sort() # print(s1) -->['!', ' ...

  9. RabbitMQ基础知识详解

    什么是MQ? MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中 ...

随机推荐

  1. 创建SSH密钥

    Step1: 检查SSH密钥 首先,打开终端,输入以下指令,查看是否已经生成SSH密钥. cd ~/.ssh ls # Lists the files in your .ssh directory 在 ...

  2. 20175316 盛茂淞 2018-2019-2 《Java程序设计》实验三《敏捷开发与XP实践》 实验报告

    实验内容与要求 1.XP基础 极限编程(Extreme Programming,XP)是一种全新而快捷的软件开发方法.XP团队使用现场客户.特殊计划方法和持续测试来提供快速的反馈和全面的交流: XP是 ...

  3. javascript策略模式的应用!

    最近在看<JavaScript设计模式与开发实践>这本书,受益匪浅,小记录一下书中的各个demo,加深理解: 策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替 ...

  4. TypeScript 枚举

    我们常常会有这样的场景,比如与后端开发约定订单的状态开始是0,未结账是1,运输中是2,运输完成是3,已收货是4.这样的纯数字会使得代码缺乏可读性.枚举就用于这样的场景.枚举可以让我们定义一些名字有意义 ...

  5. laravel6.0路由

    1.基本路由路由定义在routes目录下,路由执行是在控制器之前,路由路径 routes目录下api.php 关于接口路由定义文件包含的路由位于 api 中间件组约束之内,支持频率限制功能,这些路由是 ...

  6. Django 1.8.2 admin 数据库操作按下保存按钮出错

    Django报错:Runtimeerror: generator raised StopIteration python版本太新不兼容照成,下载python3.6就行了

  7. 【数据结构 Python & C++】顺序表

    用C++ 和 Python实现顺序表的简单操作 C++代码 // Date:2019.7.31 // Author:Yushow Jue #include<iostream> using ...

  8. 【C#】课堂知识点#2

    课堂上老师讲了几点,自己觉得挺重要的,记录下来 1.代码字体调大,方便调试 2.虚心请教,没有谁比谁厉害,不会就虚心多请教,baidu并不能解决所有问题.沟通交流也是一种能力 3.只有每行写对了,才继 ...

  9. 浅谈人脸识别中的loss 损失函数

    浅谈人脸识别中的loss 损失函数 2019-04-17 17:57:33 liguiyuan112 阅读数 641更多 分类专栏: AI 人脸识别   版权声明:本文为博主原创文章,遵循CC 4.0 ...

  10. 简单二次封装的Golang图像处理库:图片裁剪

    简单二次封装的Golang图像处理库:图片裁剪 一.功能 Go语言下的官方图像处理库 简单封装后对jpg和png图像进行缩放/裁剪的库 二.使用说明 1.首先下载 go get -v -u githu ...