[Halcon&几何] 矩形顶点和对角连线角度计算

简介: [Halcon&几何] 矩形顶点和对角连线角度计算

描述:因为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])。

结果:

 


戳戳小手帮忙点个免费的赞和关注吧,嘿嘿。


目录
相关文章
|
5月前
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
384 0
|
5月前
|
C++
C++代码来计算一个点围绕另一个点旋转45度后的坐标
C++代码来计算一个点围绕另一个点旋转45度后的坐标
107 0
|
5月前
|
算法 C++ Windows
空间射线与三角形相交算法的两种实现
空间射线与三角形相交算法的两种实现
51 0
|
5月前
|
算法 C++
空间直线与球面相交算法
空间直线与球面相交算法
48 0
|
7月前
|
算法 Python
二维矩形件排样算法之最低水平线搜索算法实现
二维矩形件排样算法之最低水平线搜索算法实现
208 0
|
8月前
|
算法 图形学
【计算机图形学】实验四 二维图形的缩放、旋转,平移,组合变换
【计算机图形学】实验四 二维图形的缩放、旋转,平移,组合变换
360 2
|
8月前
|
计算机视觉
OpenCV(三十四):轮廓外接最大、最小矩形和多边形拟合
OpenCV(三十四):轮廓外接最大、最小矩形和多边形拟合
557 0
|
8月前
[Halcon&几何] 直线的垂线与延长线的计算
[Halcon&几何] 直线的垂线与延长线的计算
401 1
|
8月前
[Halcon&几何] 线段中点、端点和角度的计算
[Halcon&几何] 线段中点、端点和角度的计算
303 0
|
8月前
|
算法
[Halcon&拟合] 直线、矩形和圆的边缘提取
[Halcon&拟合] 直线、矩形和圆的边缘提取
475 0