Halcon有两类基本数据:图形变量Iconic(image、region、XLD)与控制变量Control(string、integer、real、Handle)。所有算子的参数都是以相同的方式排列:输入图像,输出图像,输入控制变量,输出控制变量。当然并非所有的算子都有四类参数,不过参数排列的顺序都是相同的。
HALCON算子参数排列顺序
输入图像:输出图像:输入控制:输出控制
并非所有的算子都有四类参数,不过参数排列的顺序依次相同
图形变量参数:image
根据每个像素信息不同,通常将图形分为:二值图像、灰度图像、rgb图像
image 是由一个或多个通道组成,灰度图是一个通道像素点存放在一个矩阵;
彩色图是三通道像素点存放在通道矩阵中。
Image Type:
Byte complex cyclic direction int1 int2 int4 int8 uint2 real等
常用的有:
Byte 2的8次方 最大时255
Real 2的32或64次方 3D中常用
图形变量参数:region
一堆像素的集合,但他们的范围不受图像(image)大小的限制,可以大于图形尺寸的范围。且region中的像素不一定要相连,也就是说任意形状的像元集合都可以成为一个region。
图形变量参数:XLD
图形变量Image和区域region这些数据结构是像素精度,在实际工业应用中需要比图像像素分辨率更高的精度这时就需要提取亚像素精度数据。
XLD可以理解为一连串的坐标串列,相邻的两个点之间以直线连接。由于图形均使用像素点存,而像素点是整型数据。HALCON做了拓展,定义了亚像素(subPixel)描述几何轮廓的对象:XLD,主要用于亚像素测量的背景下,可用于提取边缘,构建轮廓等等,XLD在模板匹配、图形校准等多方面又重要的用途。
XLD有两种
Contours轮廓是一系列的点连接,点之间的距离大约是一个像素
Polygons多边形,点之间的距离较大,是用最少的线来描述这个轮廓
下图来直观的看一下region和xld,在图像上表现的不同:
这个是region,它是用每个小方块(像素)组成的:
这个是xld,可以看到线和每个像素(小方块)会有不同的交点,这是haolcon自己计算的:
XLD代表亚像素级别的轮廓或者多边形。
XDL就是一个轮廓函数,它不是基于像素,人们通常称他为亚像素,只不过它比像素更精确,可以精确到像素内部的一种描述。
在Halcon中,使用XLD表示亚像素的轮廓和多边形。常用edges_sub_pix算子来提取亚像素轮廓。
我们都知道图片是由像素组成,当我们用halcon读取图像Image或者region的时候,获得的数据就是像素。这些数据结构都是像素级别的。
获得图像后,我们可以通过亚像素阈值分割或者亚像素边缘提取,这样这些处理得到的结果其实就是用亚像素轮廓来表示。。
上述所述亚像素轮廓其实在halcon中指的就是xld,它可以表示直线或多边形,是一组有序的控制点集合,控制点顺序用来说明彼此相连的关系。
控制参数变量:string、integer、real
HALCON赋值是:= 其它计算机语言是=
Integer型
HALCON 中number型数据类型是计算机语言double型
字符串,注意在HALCON中是使用 ' ' 单引号
控制参数变量:Tuple
Tuple(数组)其中的数据类型可以是Control参数类型的整形、实数型、字符串型三种变量之一;甚至是三种类型的混合。Tuple的数据不仅可以为Control类型数据,也可以是图形(Iconic)参数类型数据。
针对刚学习的做个数组的补充,数组相当于把很多数据打包起来,方便我们使用。如图可以理解为把很多节电池进行封装,方便取放。
当tuple中的数据为iconic参数类型时,最小索引是1,当为Control参数类型时,最小索引是0。
图形参数:Handle
Handle(句柄)是用于管理一组复合数据的变量
为了程序设计的方便性,该变量只通过唯一的值来标识;例如:窗口、保存创建的模板、采集相机等均以handle来标识要操作的对象
窗口ID
模板匹配ID
2、VC++下数据类型
2.1 图形数据
Hobject:把图像数据封装成类的一种形式,包含hdevelep下的image、region、Xld。
// 判断数据是否为空和清空数据
HObject image;
image.Clear(); //清空数据
if (image.Key()==UNDEF_KEY) //判断图形数据是否为空
{
//如果为空执行这语句
}
2.2 控制数据
HTuple,Hlong(整型数据的另一种形式),包含hdevelep下的所有控制数据。
//数组赋值
HTuple array;
array.Clear();//清空元组数据
array[0]=0;
array[1]=1;
array[2]=2;
array[3]=3;
array[4]=4;
array[5]=5;
HTuple array1;
array1[0]=10;
array1[1]=11;
array1[2]=12;
array1[3]=13;
// 数组基本操作算子
//数组基本操作算子
TupleConcat(array,array1,&array); //将两个数组连接
HTuple length;
TupleLength(array,&length); //得到数组长度
HTuple selected,i=6;
TupleSelect(array,i,&selected); //选取数组中第i个元素
TupleRemove(array,i,&array); //移除数组中第i个元素
// VC++数据类型与Halcon数据类型转换
halconInt=20;
halconDouble=13.14;
halconString="liu zhi";
//halcon类型转换为vc++类型
vcInt=halconInt[0].I();
vcDouble=halconDouble[0].D();
vcString=halconString[0].S();
//vc++转换为halcon类型
halconInt.Clear();
halconDouble.Clear();
halconString.Clear();
halconInt=(HTuple)vcInt;
halconDouble=(HTuple)vcDouble;
//halconString=(HTuple)vcString;
// 判断数据是否为空和清空数据
//判断数组是否为空,清空数组
array.TupleLength(); //为0数组为空,大于0不为空
array.Clear(); //清空数组元素
2.3. 易错难点
halcon数据类型在hdevelop与vc++中变量定义区别:在hedevdlop中一般不需要定义变量,会根据算子自动转换成相应的数据类型;VC++定义变量有两种类型,图形数据Hobject,控制数据HTuple。