首页 > 编程知识 正文

compare函数用法,halcon安装教程

时间:2023-05-04 08:23:35 阅读:144914 作者:2051

几种边缘连接函数的中文解释:

union _ co tangential _ contours _ xld根据输入的轮廓端点的局部曲率连接曲率满足一定条件的轮廓

输入:

是contours (xld对象)

如果FitClippingLengt轮廓的某些长度小于此值,则跳过切线计算

默认值: 0.0

一般设定范围: 0以上

一些FitLength轮廓大于此值将参与切线的计算

默认值: 30

推荐值: 10.0、20.0、30.0、“自动”

范围: 0以上

两个MaxTangAngle弧度轮廓切线的最大角度。 大于此值的非合并

默认值: 0.78539816

范围: 0.0 MaxTangAngle3.1415926

MaxDist两个轮廓端点之间的最大距离

默认值: 25.0

推荐值: 5.0、10.0、25.0、50.0

范围: 0以上

MaxDistPerp :从轮廓端点到其他轮廓切线的垂直距离的最大值。 大于此值的非合并

默认值: 10.0

推荐值: 2.0、5.0、10.0、20.0

范围: 0以上

MaxOverlap两个配置文件的最大重叠值。 大于此值的不参与合并

默认值: 2.0

推荐值: 2.0、5.0、10.0、20.0

Mode :如何处理配置文件属性值

默认值:“‘attr_forget”

可选值列表:‘attr _ keep’、

输出:

union contours (xld对象) ) )。

函数的工作原理:首先确定输入的contours中每个轮廓的末端。 参数FitClippingLength表示轮廓两端的疏忽子件长度。 有了这个参数,输入配置文件末端的artifacts (算什么意思? 请参阅。 FitLength表示轮廓端点参与曲率计算的欧式长度的一小部分。 在一个轮廓的边缘,至少在Fitlength长度轮廓的边缘,参与计算。 您可以在此使用“自动”设置。 然后,操作员将轮廓分割为许多直线和圆弧段,以分割第一段和最后一段的结果为结束点。 因为计算非常费时间,所以建议尽量给出具体长度的数值。

操作员尝试将各末端对准圆。 然后确定输入轮廓的端点,最接近这些圆的端点。 使用拟合圆的rms距离。 这些点的切线相当于这些输入轮廓端点处的局部曲率。 (我不太清楚。 )

如果圆拟合失败,运算符将尝试拟合回归直线。 轮廓末端的局部曲率将替换为端点回归线的方向。

的输入轮廓根据端点处的局部曲率确定是否连接。 如果两个配置文件满足某些阈值要求,它们将合并为一个配置文件。 MaxTangAngle表示两个轮廓切线的最大角度。 MaxDist表示从两个轮廓的端点到对方的最大距离。 MaxDistPerp表示从端点到切线的垂直距离的最大值。 该距离是从一个端点到另一个轮廓切线的垂直距离的最大值,反之亦然。 最后的阈值考虑相互重叠的轮廓、MaxOverlap。 重叠的程度由从一个端点到另一个轮廓的切线投影决定,反之亦然。 只有端点之间的距离、端点投影的距离小于MaxOverlap值时,才应参与运算符的计算。 与其他阈值不同,MaxOverlap可以为负。 负值表示从切线方向的端点到轮廓的距离的最小值。 (我不太清楚,正值不是沿着切线投影方向吗? 负值是如何沿着切线方向的呢? )

只要满足以上条件,就可以用此运算符计算一个轮廓或多个轮廓,使其成为闭合轮廓。 但是,请注意,对于闭合轮廓,不参与运算符的计算。

当满足所有阈值时,将计算分数值。 根据这些角度和距离计算的值越接近0,分数的值越高。 然后,根据这些得分值执行合并操作。 因此,如果有多个候选合并轮廓,则最好的轮廓将优先合并。

Mode是标签设置,用于确定是否将输入配置文件的属性复制到输出配置文件。 “‘attr_keep”是复制属性,可能会对操作员的性能产生负面影响(请参阅)。 “attr_forget”指示操作员忽略现有属性。 有关的属性设置的详细信息,请参阅运算符union_adjacent_contours_xld的说明。

我的评论:曲率是一种很好的方法,对于一个物体的边缘提取,如果没有大的曲线,也就是说在提取物体比较光滑的边缘后,如果边缘断开,也就是不连续,可以用这个运算符连接它们。 但是,对于切角的边缘或不太光滑(即弯曲的切边),效果可能不那么好。

union_collinear_contours_xld连接共线的轮廓

输入:

Contours XLD

MaxDistAbs:在基准回归直线方向上轮廓末端的最大距离。 如果大于此值,则不参与计算

默认值: 10.0

范围: 0以上

MaxDistRel :沿基准回归线方向的轮廓端点距离相对于延长轮廓长度的值(比的含义? )

默认值: 1.0

范围: 0以上

MaxShift (轮廓到基准回归直线的最大距离(垂直距离) ) ) ) ) ) ) ) ) )。

默认值: 2.0

范围:大于等

于0
MaxAngle: 两个轮廓的最大角度差,弧度制
默认:0.1
范围:0.0< MaxAngle<=0.78539816339
Mode: :对待轮廓属性处理的标签设置,字符
默认:'attr_keep'
可选list:'attr_keep', 'attr_forget'


输出:
UnionContours


算子对所有输入轮廓进行计算然后合并共线的轮廓,就是说大概位于同一线的轮廓会被合并。合并的轮廓由输入轮廓的点串联而成。如果必要的话,这些输入轮廓点的顺序会被翻转,因此可见待连接轮廓的端点应和最终结果的点直接相邻(也就是说必须是邻近的轮廓吧)。算子一直重复,直到没有可以连接的轮廓为止。最终,连接的轮廓,以及未满足条件没有被连接的输入轮廓,一并作为输出,返回至UnionContours.
两条线共线的意思是,其中一条线如果以直线方式延长,将和另一条线重合。值得注意的是,一条线可以由另一条线延续,也就是说,并不是两条线都能被对方互相延续(有何区别:就是有方向性的)。然而,如果一条线比另一条线长得多(两倍长以上),长的线将延续至短的线,反之不行。
如果两个轮廓的回归线基本共线-由轮廓端点的投影限定,则认为是共线的。在使用这个算子之前,确定输入的轮廓为直线。注意闭合的轮廓就不参与计算了。
MaxDistAbs,MaxDisRel,MaxShift和MaxAngle用来定义两个轮廓的共线条件。前三个参数被认为和当前要处理延长到另一轮廓的被检测轮廓有关(也就是和长的轮廓有关)。MaxDistAbs描述了对于被检测的轮廓,在回归线方向到另一个轮廓回归线的最文艺的萝莉接受距离(大于的就不合并)。这等同于临近的端点在第一条回归线上的投影距离。MaxDistRel表示一样的距离,然后和被检测轮廓的长度是有关的。这个阈值实际上表示被检测轮廓的由这两个参数决定的最小距离(哪两个参数决定的什么距离?)。
MaxShift定义了第二轮廓相对于被检测轮廓回归线的大距离,也就是说,这个距离是从回归线垂直测量的。这里标准是第二轮廓在其自己回归线的距离,还有到被检测轮廓回归线的距离,也就更大些的那个值(嘛意思?)。最后,MaxAngle阈值规定了两个备选轮廓的回归线之间的最大角度。
两个轮廓不会被合并,除非满足所有条件(与其中一个轮廓定为被检测轮廓有关),也就是说,所有值必须小于等于所给的阈值。另一个先决条件是,轮廓不能和其它轮廓有较大重叠度。最大重叠度为0.5像素。如果想容忍更大的重叠度,并设置精确的值,就用Unoin_collinear_contours_ext_xld。这是本算子的一个扩展算子,给出了另外几个参数,可以设置重叠度。
除了找到最合适的备选轮廓进行合并,对于这个算子重要的是决定用来连接轮廓的顺序。考虑这个的原因是因为,一般将两个轮廓合并后,评价结果轮廓和评价之前的轮廓就不同了。因此,一个轮廓可能会和其周围的某一个轮廓连接,但是不会和两个同时连接。因此,所有可能被连接轮廓对,算子都会对其进行评分,计算出合并的总距离的损失值。损失值最小的一对轮廓优先合并。在连接后的结果中,轮廓列表将会被再次搜索来获得潜在的备选连接。如果存在新的可以连接轮廓对,就加入备选清单。如果最好的评价值就是这两个备选轮廓,连接的顺序取决于轮廓在XLD存储的顺序。注意如果一个轮廓为几个轮廓中的一部分,第二个轮廓的连接可能被第一个轮廓废弃(啥意思?)。
连接的损失值(或者称总距离)由上面定义的距离计算出来。两个轮廓之间的距离越小,损失值越小。如果距离和阈值相近,则损失值很大。另一个机制是损失值取决于连接两个轮廓的分割线。这部分取决于回归线分割线和其长度的夹角(the angle of the line segment against the regression line as well as of its length,看不懂….).
总而言之,不同的参数由阈值和权值归一化。相反的,Unoin_collinear_contours_ext_xld给了控制每个参数单独作用的机会。还有,这个算子允许设置损失值的限制,从而避免轮廓连接相近于所有标准的值。
最后,Mode参数可以控制随着输入轮廓的属性。比如,edges_sub_pix附着于每个轮廓点一些属性:局部方向、边缘反映、边缘方向等。选择默认值'attr_keep',所有的属性都会拷贝到输出值,如果一个轮廓在连接的时候被翻转,则适应新的方向。如果输入轮廓过多,可能就会影响性能,尤其是接下来用不到这些属性。这时,使用'attr_forget'比较好。


我的评论:算子说明里说,要确保是对直线进行处理,因此可能只对一些弧度弯曲很小的边缘进行连接,或者说是对直线边缘提取断裂的情况进行连接,如方块、直线边等。

union_adjacent_contours_xld 连接端点相近的轮廓


输入:
Contours
MaxDistAbs:轮廓之间端点的最大距离
默认:10.0
范围:大于等于0
MaxDistRel:端点之间距离相对于长的轮廓(到底是不是指距离与长轮廓长度之比?)
默认:1.0
范围:大于等于0
Mode: :对待轮廓属性处理的标签设置,字符
默认:'attr_keep'
可选list:'attr_keep', 'attr_forget'


输出:
UnionContours


这个算子连接所有端点相近的输入轮廓,是一个串联结果。如果必要的话,这些输入轮廓上的点的顺序会发生翻转,所以这些轮廓的要被连接的端点位于直接邻域中(大致意思就是轮廓本来是从左到右的顺序存的点,因为连接需要,变成了从右到左的存储顺序。因为跟这个轮廓连接的另一个轮廓更长,所以以人家的方向为准)。这个算子一直重复直到没有更多的邻域轮廓。结果就是所有新连接的轮廓,以及输入轮廓中不满足连接条件而未发生变化的轮廓,都返回到输出UnionContours中。
如果两个轮廓的端点之间的距离不超过阈值MaxDistAbs,或者由长一些的轮廓的长度乘以相对阈值MaxDistRel,则连接。(也就是说maxDistRel是个比例值,长一些的轮廓的长度乘以这个值得到的值,去与两轮廓端点距离相比)。
连接临近轮廓的顺序主要取决于临近的端点的距离,有最小距离的轮廓最先连接。如果有两对轮廓有一样的距离,则第一对不含最短轮廓的将被连接。
参数Mode的意义和用法参见 union_collinear_contours_xld 中的相关说明。


我的评论:对连接临近的轮廓具有较好适应性,但是未考虑一些相似性,仅根据离的远近来决定是否连接,可能会产生错误连接,比如会不会产生一个轮廓在同一端连接多个?在去除了很多杂轮廓的前提下,这个方法还是非常值得一试的。


union_cocircular_contours_xld 连接位于同一圆上的轮廓片段。


我的评论:这个适用性对圆形物体的提取比较有用,连接的差不多了,就可以进行下一步拟合。


union_straight_contours_xld
将临近的具有同方向的直线轮廓连接。


输入:
Contours
MaxDist:端点之间的最大距离
默认:5.0
MaxDiff:方向差别的最大值
默认0.5
Percent:上面两个参数之间的权值
默认:50%
Mode:平行的轮廓是否考虑
默认:‘noparallel’
可选值:'noparallel', 'paralleltoo', 'every'
Iterations:迭代的次数
默认:‘maximum‘
建议值:1,2,3,4,5,6,7,8,9,10,‘maximum’
范围1<= Iterations<= 500
最小步进:1


MaxDist两个轮廓的端点之间的距离。注意端点是轮廓第一个点和最后一个点在其回归线上的投影。回归线的方向要小于MaxDiff。
如果上述两个阈值只有一个满足的话,考虑权重参数Percent,可以决定一个满足要求,但另一个比阈值高。
例如,如果两个轮廓的端点距离是5.0,方向差是0.5,阈值设置的是MaxDist = 4.0,MaxDiff = 0.625,每个值都和阈值有25%的差距。如果Percent = 60%,则大的端点距离的权值比小的方向差值的权值高,因此这两个轮廓不被连接。相反,如果Percent = 40%,则两个轮廓就被连接。
如果设置Percent = 100%,则只有端点距离被考虑。当Percent = 0%,则只有方向差被考虑。如果Percent = 50%,则两个阈值的权重一样。
万一存在平行轮廓的情况,合并相邻的轮廓则具有风险。如果需要避免这种情况,则在Mode里设置‘noparallel’,否则使用Mode = ‘paralleltoo’就可以了。Mode = ‘every’则表示,每个轮廓都无条件连接,其他参数都无影响。
合并是只对两个轮廓,采用递归的方式。


我的评论:和collinear的区别在于,可以对非直线进行连接。可以在距离和方向中找到比较合适的平衡权重。但是不明白递归是有什么作用。
一点不明白的是方向差别,如果方向相反,即使夹角很小,但是显示的可能是钝角,会不会被滤除了呢?

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。