踩坑点
最近在做halcon联合项目,遇到写好的算法CT耗时很长的问题,逐步排查发现耗时长的罪魁祸首是union2()算子。
查找资料找出三者的细微区别后,果断改用concat_obj()算子,解决了这个问题。
union1()
话不多说,先贴定义:
作用是将多个区域求并集,结果就是多个区域会变成一个区域。
union2()
Hdevelop里面的定义是这样的:
union2算子,一开始我以为是将两个区域集合合并为一个区域,实际上并不是。
union2(Region1, Region2 : RegionUnion : : )的官方解释是:
union2 计算 Region1 中的区域与 Region2 中所有区域的并集。
在内部,Region2 的所有区域在将 Region1 的各个区域与已合并的区域合并之前,先合并到一个区域。这意味着 union2 不是交换的!
所以如果你将Region1 和Region2交换位置,得到的结果是不一样的!
如果你需要得到一个区域,就需要再一次用到union1(RegionUnion)。
或者在调用union2()时,先确保Region1是一个区域,再次调用union1(Region1)。
concat_obj()
concat_obj的定义如下:
它的作用是添加对象到一个集合。如果添加的对象是Region,也就仅仅是添加不会进行合并,Region可以被重复添加,集合的个数也会随之增加。
综上来看,这种方法相对来说是最快的。
如何合并区域最佳
通过concat_obj把所有的区域添加到一个集合内部。
如下:
// C# code block
if (cornerDefect > param.ImageLevelParam[ImageLevel].MinCornerDefect)
{
//添加缺陷区域
chipRegion = chipRegion.ConcatObj(blobAnalysisRegion[i + 1]);
//添加参数信息
AddResultInfo(area, depth, length, cornerDefect);
}
如果有需求,也可以先用concat_obj()把所有的区域添加到一个集合内部。
再调用union1。