描述:因为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])。
结果:
戳戳小手帮忙点个免费的赞和关注吧,嘿嘿。 |