17.3 向量

HALCON/C 为使用 HDevelop 语言的向量功能提供了数据结构 Hvector。HALCON 向量是一个容器,可以容纳任意数量的相同数据类型(即元组、图标对象或向量)和维度的元素。向量的类型,即维度和元素的类型,是在初始化向量实例时定义的,在其生命周期内不能更改。一维向量可以是元组向量,也可以是图标对象向量。二维向量可以是元组向量的向量,也可以是图标对象向量的向量,以此类推。

构建向量

在 HALCON/C 中创建此类向量时,必须区分图标对象向量和元组向量。

   Hvector   vectorObj, vectorTup;

   // Create a one-dimensional vector of iconic objects
   V_create_object_vector(1,&vectorObj);

   // Create a one-dimensional vector of tuples
   V_create_tuple_vector(1,&vectorTup);

这些调用会创建一维的空向量,例如一个元组向量。通过在调用中指定维数,还可以创建多维向量,即由元组向量组成的向量或由图标对象向量组成的向量等。

   V_create_object_vector(2,&vectorObjMulti);

请注意,创建向量后不能更改向量类型及其维数。

访问和设置向量元素

要访问元组向量中的元素,可以使用 V_get_vector_tuple。以下代码行在 index 位置查询 vectorTup 中包含的元组,并将结果作为 HTuple 中的 tuple 副本返回。

   V_get_vector_tuple(vectorTup,index,tuple);

要访问图标对象向量中的元素,可以使用 V_get_vector_obj 代替。

   V_get_vector_obj(image,vectorTup,index);

要访问的元素由其 index 以元组形式指定。它既可以包含一维向量中元素的单个索引,也可以包含多维向量中相应子向量及其子元素的多个索引。

您还可以使用 V_get_vector_elem 查询多维向量的整个子向量。

在访问向量内容之前,可以先设置一些向量元素。同样,我们也要区分元组向量、图标对象向量和多维向量。下面几行展示了如何设置一维向量的向量元素。

   // Set an element of a vector of iconic objects
   V_set_vector_obj(image,vectorObj,index);

   // Set an element of a vector of tuples
   V_set_vector_tuple(vectorTup,index,tuple);

要设置的元素再次通过指定的 index 进行寻址,该索引表示为一个 Htuple。除了索引外,调用时还必须添加向量本身和要设置的 HobjectHtuple(例如 图像元组 )。

对于多维向量,指定的索引元组必须包含子向量及其子元素的索引。以下代码行显示了从创建二维向量、要设置的图像、索引元组到指定索引并最终设置向量元素的整个过程。

   // Initialize and set the image and indices
   Hobject img;
   Htuple  indices;
   Hvector vectorObjMulti;

   V_create_object_vector(2,&vectorObjMulti);
   read_image(&img,"Image");
   set_i(indices,0,0);
   set_i(indices,1,1);

   // Set a subvector of a multi-dimensional vector
   V_set_vector_obj(img,vectorObjMulti,indices);

还可以使用 V_set_vector_elem 设置多维向量的子向量。

请注意,也可以设置不存在的向量元素。如有必要,向量会自动放大并以空元素初始化。

销毁向量

如果不需要进一步处理 Hvector,则必须使用 V_destroy_vector 释放其内容和分配的内存。

   V_destroy_vector(vectorTup);

其他信息

除了前面提到的基本信息外,Hvector 的数据结构还提供了更多的功能,例如插入或删除向量元素,或连接向量。更多信息请参考 %HALCONROOT%\include\halconc 中的相应头文件 Hvector.h