Halcon C#.net 编程指导(3): 元组(Tuples)的使用

1. 使用单个值或元组调用函数

你可以从参考手册(refrencemanual)里查看算子是否可以处理元组(tuples)。例如下面列出了AreaCenter和GenRectangle1算子的说明。

static void HOperatorSet.AreaCenter (HObject regions, out HTuple area, out HTuple row,out HTuple column) //方法的声明HTuple HRegion.AreaCenter (out HTuple row, out HTuple column)int HRegion.AreaCenter (out double row, out double column)regions (input_object) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . region(-array) ; HRegionarea (output_control) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .integer(-array) ; HTuple (int)row (output_control) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . point.y(-array) ; HTuple (double)column (output_control) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . point.x(-array) ; HTuple (double)static void HOperatorSet.GenRectangle1 (out HObject rectangle, HTuple row1, HTuple column1,HTuple row2, HTuple column2)public HRegion (HTuple row1, HTuple column1, HTuple row2, HTuple column2)public HRegion (double row1, double column1, double row2, double column2)void HRegion.GenRectangle1 (HTuple row1, HTuple column1, HTuple row2, HTuple column2)void HRegion.GenRectangle1 (double row1, double column1, double row2, double column2)rectangle (output_object) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . region(-array) ; HRegionrow1 (input_control) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . rectangle.origin.y(-array) ; HTuple (double)column1 (input_control) . . . . . . . . . . . . . . . . . . . . . . . . . . . rectangle.origin.x(-array) ; HTuple (double)row2 (input_control) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . rectangle.corner.y(-array) ; HTuple (double)column2 (input_control) . . . . . . . . . . . . . . . . . . . . . . . . . . . rectangle.corner.x(-array) ; HTuple (doubl)

我们可以看到像HRegion这样的图形类(iconicclasses)自动处理多个值;这个参数是否可以接受或者返回多个值?我们不可以直接在函数体(signature)里看到,但是我们可以从参数部分看到:我们可以从第一个例子看出一个附加的appended(-array)标志着参数可以包含一个或者多个值。

我们还可以看出,控制参数(control)通过他们的数据类型直接显示了他们是否可以包含一个活或者多个值(HTuple类型),在第一个GenRectangle1例子中,参数使用基础的double数据类型,在第二个GenRectangle1例子中使用HALCON/.NET的HTuple类。因此,你可以使用两种方法通过HRegion调用GenRectangle1,通过传doules和HTuples值(这里使用构造函数的形式):

HRegion SingleRegion = new HRegion(10.0, 10.0, 50.0, 50.0);HRegion MultipleRegions = new HRegion(new HTuple(20.0, 30.0), new HTuple(20.0, 30.0),new HTuple(60.0, 70.0), new HTuple(60.0, 70.0));

同样,AreaCenter也可以通过两种方法调用:

double Area, Row, Column;HTuple Areas, Rows, Columns;Area = SingleRegion.AreaCenter(out Row, out Column);Areas = MultipleRegions.AreaCenter(out Rows, out Columns);

2. 图形元组(IconicTuples)

图形类HImage,HRegion和HXLD可以包含一个或者多个类(objects)。为了处理所有的元组的元素,首先我们就要使用CountOBj算子查询元素的个数

int NumRegions = MultipleRegions.CountObj();

然后访问这些元素,在HALCON里使用SelectOBj,在C#中使用[]:

for (int i=1; i<=NumRegions; i++){HRegion Region = MultipleRegions[i];…}

值得我们注意的是图形元组元素下标从1开始!

如果你想创建或者增加图形元组中的元素的话可以使用ConcatOBj算子(HALCON中):

HRegion ThreeRegions = SingleRegion.ConcatObj(MultipleRegions);

3. 控制元组与HTuple类(ControlTuplesandtheClassHTuple)

3.1 访问元组元素

为了控制元组,HALCON/.NET提供了HTuple类。HTuple的实例既可以只包含double,int,string类型的元素。也可以包含它们的混合元素。那么怎样访问元组元素呢?

为了访问其中所有的元组,第一步就是通过Length属性获得它的长度,和图形元组获得的方式基本相同

intTupleLength=Areas.Length;

访问方式:

for(inti=0;i<TupleLength;i++)

{

doubleElement=Areas[i];

}

如果你视图读取一个不存在的元组元素或者如果你不转换(cast)类型直接赋值给其他类型的元素或出现异常(exception)。

3.2 创建Tuples

类HTuple提供许多不同的构造器(见VS的对象浏览器列表)。下面的语句是创建一个只有单元素的int型的元组。

HtupleTuple1=newHTuple(1);

下面的语句创建一个double型的元组(tuple):

HTupleTuple2=newHTuple(1.0);

也可以对构造器传送多个值。但是注意如果传送的值里有int类型的值,也有double类型的值,默认创建的是double类型的元组。

HTupleTuple3=newHtuple(1.0,2);

当创建的元组中包含字符创string类型时,就创建了一个混合类型的tuple,下面的语句中第二个值是int类型的:

HTupleTuple4=newHTuple(1.0,2,“s”);

一个元组或者一个元组元素的类型可以通过它的属性类型获得:

HTupleTypleTupleType=Tuple4.Type;

HTupleTypeTupleElementType=Tuple4[1].Type;

你可以通过一个构造器简单的进行元组的连接:

HTupleTuple5=newHTuple(Tuple2,Tuple3);

还可以往元组里没有值的元素中通过追加一个值:

Tuple3[2]=3;

3.3 类型转换中模棱两可,意想不到的结果

类HTuplet提供许多隐式的转换方法,你可以在大部分的地方直接使用在基础的数据类型上。例如:

double Element=Areas[i];

累死累活不说,走马观花反而少了真实体验,

Halcon C#.net 编程指导(3): 元组(Tuples)的使用

相关文章:

你感兴趣的文章:

标签云: