计算矩形四顶点和两点之间固定角度

描述:因为halcon中算子求的矩形角度有时候不是我所需要的角度,以算子smallest_rectangle2为例:

1)其获取的矩形角度范围- 90< angle <= 90,即无论通过算子gen_rectangle2生成的Region角度多大,smallest_rectangle2获取的角度都不会超出这个范围。
2)算子smallest_rectangle2输出的角度是通过计算Region长轴与X轴正方向夹角获取,且角度不能超出限定范围。

这就会导致一个问题,由于我的得到的矩形长轴方向不是固定的,如果长轴是水平方向的,得到的矩形角度就在0°上下波动,如图红色区域部分:

如果长轴是竖直方向的,得到的矩形角度就在90°下或-90°上波动(因为- 90< angle <= 90,矩形垂直是90°。矩形区域逆时针旋转1°,并不是91°,而是-89°),如图红色区域部分:

所以,我通过计算矩形四个顶点,然后利用左上顶点与右下顶点的连线与X轴正方向的夹角来作为矩形的角度。具体算法如下:


一、求矩形四个顶点

gen_empty_obj (EmptyCross)
smallest_rectangle2_xld (outContour, Row1, Column1, Phi3, Length1, Length2)
gen_rectangle2_contour_xld (Rectangle, Row1, Column1, Phi3, Length1, Length2)
tuple_cos (Phi3, Cos)
tuple_sin (Phi3, Sin)
dev_set_color('green')
a:= -Length1*Cos - Length2*Sin
b := -Length1*Sin + Length2*Cos
gen_cross_contour_xld(Cross, Row1-b,  Column1+a, 10, Phi3)
concat_obj (EmptyCross, Cross, EmptyCross)
c := Length1*Cos - Length2*Sin
d := Length1*Sin + Length2*Cos
gen_cross_contour_xld(Cross, Row1-d, Column1+c, 10, Phi3)
concat_obj (EmptyCross, Cross, EmptyCross)
e:= Length1*Cos + Length2*Sin
f := Length1*Sin - Length2*Cos
gen_cross_contour_xld(Cross, Row1-f, Column1+e, 10, Phi3)
concat_obj (EmptyCross, Cross, EmptyCross)
g := -Length1*Cos + Length2*Sin
h := -Length1*Sin - Length2*Cos
gen_cross_contour_xld(Cross, Row1-h, Column1+g, 10, Phi3) 
concat_obj (EmptyCross, Cross, EmptyCross)
 


tips:这里将四个顶点以十字轮廓的形式保存在空对象EmptyCross内。


二、对矩形四个顶点进行排序并找到左上顶点和右下顶点

area_center_points_xld (EmptyCross, Area3, Row2, Column2)
tuple_length (Column2, Length)
for Index1 := 0 to Length-1 by 1
for Index := 0 to Length-1 by 1
    if(Index<Length-1)
    if(Row2[Index]+Column2[Index]>Row2[Index+1]+Column2[Index+1])      
        RowTemp := Row2[Index]
        ColumnTemp := Column2[Index]
        
        Row2[Index] := Row2[Index+1]
        Column2[Index] := Column2[Index+1]
        
        Row2[Index+1] := RowTemp
        Column2[Index+1] := ColumnTemp
    endif 
    endif      
endfor
endfor

tips:因为左上顶点的行、列坐标之和一定是最小的,右下顶点的行、列坐标之和一定是最大的,通过冒泡排序完成矩形四个顶点数组的排序。


三、计算矩形左上顶点和右下顶点连线与X轴正方向的夹角

offsetX := Column2[3] - Column2[0]
offsetY := Row2[3] - Row2[0]
tuple_atan2 (offsetY, offsetX, angel)
tuple_deg (angel, angelDeg)
RectAngel := 180 - angelDeg

tips:矩形左上顶点坐标(Row2[0],Column2[0]),右下顶点坐标(Row2[3],Column2[3])。

结果:

————————————————
版权声明:本文为CSDN博主「丶布布」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43197380/article/details/115250920

关注公众号,更多知识内容

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值