[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])。

结果:

 


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


目录
相关文章
|
3月前
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
238 0
|
3月前
|
C++
C++代码来计算一个点围绕另一个点旋转45度后的坐标
C++代码来计算一个点围绕另一个点旋转45度后的坐标
80 0
|
6月前
|
算法 图形学
【计算机图形学】实验四 二维图形的缩放、旋转,平移,组合变换
【计算机图形学】实验四 二维图形的缩放、旋转,平移,组合变换
188 2
|
5月前
|
计算机视觉
图像特效之三角几何应用
图像特效之三角几何应用
23 0
|
6月前
|
计算机视觉
OpenCV(三十四):轮廓外接最大、最小矩形和多边形拟合
OpenCV(三十四):轮廓外接最大、最小矩形和多边形拟合
472 0
|
6月前
[Halcon&几何] 直线的垂线与延长线的计算
[Halcon&几何] 直线的垂线与延长线的计算
348 1
|
6月前
[Halcon&几何] 线段中点、端点和角度的计算
[Halcon&几何] 线段中点、端点和角度的计算
265 0
二维平面的欧几里得距离
二维平面的欧几里得距离
关于已知线段,如何求封闭图形轮廓的一些猜想
关于已知线段,如何求封闭图形轮廓的一些猜想
|
数据可视化 C++
高斯正反算—投影坐标转大地坐标、大地坐标转投影坐标(附有完整代码及测试结果)
高斯正反算—投影坐标转大地坐标、大地坐标转投影坐标(附有完整代码及测试结果)