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

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


你可以从参考手册(refrence manual)里查看算子是否可以处理元组(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) ; HRegion
area (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) ; HRegion
row1 (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这样的图形类(iconic classes)自动处理多个值;这个参数是否可以接受或者返回多个值?我们不可以直接在函数体(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. 图形元组(Iconic Tuples)


图形类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类(Control Tuples and the Class HTuple)


3.1 访问元组元素

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

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


int TupleLength = Areas.Length;


访问方式:


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

{

double Element = Areas[i];

...

}


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


3.2 创建Tuples 

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


Htuple Tuple1 = new HTuple(1);


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


 HTuple Tuple2 = new HTuple(1.0);


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


HTuple Tuple3 = new Htuple(1.0,2);


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


HTuple Tuple4 = new HTuple(1.0, 2, “s”);


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


HTupleTypleTupleType = Tuple4.Type;

HTupleTypeTupleElementType = Tuple4[1].Type;


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


HTupleTuple5 = new HTuple(Tuple2, Tuple3);


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


Tuple3[2]= 3;


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


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


double Element = Areas[i];


自动转换元素类型,实际上是把一个HTuple Element类转换成了double类型。相似的,基础类型可以自动转换成HTuple实例。类型转换的缺点是编译器往往不能确定你想用基础的数据类型还是算子的元组版本,结果就会报错。例如,你使用下面的语句,其中的数值既可以理解为从int转换成double,也可以理 解为从int转换成HTuple:


HRegion SingleRegion = new HRegion(10,10,50,50);


你可以通过在数据后面添加.0来解决这个争议。


HRegion SingleRegion = new HRegion(10.0,10.0,50.0,50.0);


例子Matching包含其它两种情况的歧义,都是由于基础数据类型和HTuple类型参数在同一个函数中调用。第一种情况是通过明确地把double类型参数转换(casting)成HTuple实例:


              private double Row, Column;

       HTuple RowCheck, ColumnCheck, AngleCheck, Score;

       HHomMat2D Matrix = new HHomMat2D();

Matrix.VectorAngleToRigid(new HTuple(Row), new HTuple(Column), new HTuple(0.0),RowCheck,ColumnCheck, AngleCheck);


第二种情况,HTuple实例(只包含一个数值)通过HTuple的D属性明确地转换成double类型,这个方法返回HTuple中第一个元素值为double类型(事实上,这是tuple[0].D的简写):


       private double RectPhi, RectLength1, RectLength2;

       HTuple Rect1RowCheck, Rect1ColCheck;

       Rectangle1.GenRectangle2(Rect1RowCheck.D,Rect1ColCheck.D, RectPhi+ AngleCheck.D,RectLength1, RectLength2);


通过相似的属性转换,你可以把tuple类型转换成其他的基础类型。如果你试图转换成一个“错误”的类型,将会出现exception。


输入参数相比,输出参数不可以自动转换类型。有时,这会导致意想不到的结果。在下面的代码中,doubles被用来作为输出参数类型,但是返回值是区域元组类型。


  HRegion MultipleRegions = new HRegion(new HTuple(20.0, 30.0), new HTuple(20.0, 30.0),newHTuple(60.0, 70.0), new HTuple(60.0, 70.0));

 double Area, Row, Column;

 HTuple Areas, Rows, Columns;

Area =MultipleRegions.AreaCenter(out Row, out Column);


因此,只有第一个区域的面积和中心被返回。如果这输出参数仍然是doubles类型,你把返回值赋给HTuple类型得到的结果一样。


              Areas =MultipleRegions.AreaCenter(out Row, out Column);


       相比之下,如果输出参数是HTuple类型,并且返回值赋值给一个double类型,算子会返回所有区域的中心,但是只有第一个区域的面积。


              Area =MultipleRegions.AreaCenter(out Rows, out Columns);


3.4  处理元组的HALCON算子


       HALCON提供了许多处理元组的算子,可以在算子参考手册(reference_hdevelop)中Tuple章节中找到。在HDevelopUser’s Guide中第七张256页有这些算子的简介。HDevelop中相应的函数名字代替了算子的名字,它省略了Tuple并且使用小写字母,例如rad代替了TupleRad。


3.5  操作符重载


       对于基础的算术算子,HAlCON/.NET提供算子重载。例如,算子+自动调用HALCON算子TupleAdd.

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: ++语言实现,它是什么?它适合什么场景? Halcon是一款高级机器视觉库,使用C++语言实现。它被广泛应用于自动化生产线、彩色图像处理、医疗检测、安全监控等领域,作为一种可靠、高效的图像处理工具。其强大的图像处理能力和灵活性,使其成为许多企业和科研机构用来解决各种视觉问题的首选工具。 Halcon与其他机器视觉库相比最大的优势在于它使用的是C++语言。这可以极大地提高程序的效率和可控性,并使其更容易调试和维护。Halcon提供了许多常用的视觉算法和模块,用于处理和分析数字图像,比如匹配模板、测量距离和角度、分割图像、检测边缘等。此外,Halcon还支持高级的机器学习算法,例如深度学习和卷积神经网络。这些算法和模块使得Halcon成为一种非常强大的视觉处理工具,可以解决各种图像处理和分析问题。 因此,Halcon适合需要进行图像处理和分析的任何任务。它可以用于工业自动化流水线,例如检测生产线上的零件的质量和准确性,也可以用于医疗成像,例如CT和MRI扫描,或者用于安全监控,例如智能门禁系统。总之,如果您需要一种强大而可靠的机器视觉工具,Halcon是值得关注的。 ### 回答2: Halcon是基于C语言编写的机器视觉软件平台,其开发的目的是为了提供一个高性能、高稳定性的机器视觉解决方案。 Halcon的核心模块是基于C语言编写的,这使得它在处理大量数据和处理速度方面具有明显的优势。C语言是一种快速、可靠和高效的编程语言,因此它是开发高性能机器视觉应用所必需的理想语言。 通过使用C语言开发Halcon,开发者可以利用现代的硬件和软件技术,实现高性能、高精度的图像分析和处理。同时,C语言也具有很好的可移植性和兼容性,这也使得Halcon在不同平台上的应用和开发变得更加便捷。 总的来说,Halcon基于C语言的优势在于其能够利用C语言的高性能、高稳定性和可移植性,使得它成为了一个强大的机器视觉软件平台。无论是在工业自动化、医学诊断还是智能交通等领域,Halcon都能够帮助用户实现高效、准确的图像分析和处理任务。 ### 回答3: Halcon是一种基于C语言开发的高性能机器视觉软件。C语言在开发中广泛被用来编写高效、稳定的系统程序,而且C语言编写的程序可以跨平台运行,具有很强的可移植性。因此,Halcon基于C语言有很多优势。 首先,由于Halcon基于C语言编写,因此它可以很好地利用C语言的一些优秀特性,如指针、位运算等。这些特性可以提高Halcon在图像处理和计算机视觉领域的性能。 其次,Halcon的C语言实现具有高度的可扩展性和灵活性。对于大型的计算机视觉应用程序,Halcon可以通过动态链接库的方式进行扩展,可以轻松地添加新的功能和特性,从而满足不同用户的需求。 另外,Halcon基于C语言还具有很好的跨平台兼容性,可以在不同操作系统和硬件平台上运行,可以与其他软件和硬件设备很好地进行集成,从而方便用户在不同环境下使用Halcon。 总之,Halcon基于C语言的开发它有着很多优点,其中包括高性能、可扩展性、灵活性和兼容性。这些优势使得Halcon成为了一款广受欢迎和使用的机器视觉软件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值