【halcon踩坑】halcon合并区域的方法(union1,union2和concat_obj对比)

踩坑点

最近在做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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值