Halcon角度测量
本文最后更新于:2022年5月29日 上午
angle_ll()求解线与线之间的角度;angle_lx()求解线与水平轴(x轴)之间的角度。
在Halcon的使用过程中经常要使用到angle_ll和angle_lx两个算子来求解线与线之间的角度以及线与水平轴(x轴)之间的角度,而线线之间和线轴之间的角度正负往往是困扰我们的问题,下面对这两种情况进行解释说明。
线与线之间的角度
angle_ll( : : RowA1, ColumnA1, RowA2, ColumnA2, RowB1, ColumnB1, RowB2, ColumnB2 : Angle)
功能:计算两条线之间的角度。
参数:
RowA1, ColumnA1, RowA2, ColumnA2:第一条线的起点坐标和终点坐标;
RowB1, ColumnB1, RowB2, ColumnB2:第二条线的起点坐标和终点坐标;
Angle:两条直线之间的夹角,
-pi <= Angle <= pi
这里需要注意的是这些参数的输入顺序会影响到直线的方向,直线的方向是由起点指向终点,如下图所示:
旋转的方向
angle_ll
算子在计算两条直线之间的夹角的方式,可以理解为第一条直线绕着其起点进行旋转,直至第一条直线的方向和第二条直线的方向相同时,第一条直线所旋转的角度即为两条直线的角度。
但是第一条直线顺时针和逆时针方向都可以转至和第二条直线相同的方向,应该朝哪个方向转动来计算角度呢?
查看答案
`angle_ll`算子的角度范围为**-Pi~Pi**,也就是说第一条直线的转动方向选择的是两条直线的夹角比较小的方向。查看示例
如下图所示:
如果使用angle_ll
算子计算图中红色直线与绿色直线的夹角,是应该将红色直线沿着蓝色箭头方向旋转还是黄色箭头方向进行旋转呢?答案是黄色箭头方向,因为黄色的夹角小于蓝色的夹角,蓝色夹角的角度超过了angle_ll
算子的取值范围。
角度的正负
如果第一条直线旋转至第二条直线的方向为顺时针,那么角度为负值,逆时针则为正值,下面通过两个Halcon的程序来演示。
顺时针旋转角度为负值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28dev_close_window()
dev_open_window (0, 0, 900, 600, 'black', WindowHandle)
set_display_font (WindowHandle, 26, 'mono', 'true', 'false')
Row1 := 100
Col1 := 100
Row2 := 500
Col2 := 600
Row1Half := (Row1 + Row2)/2
Col1Half := (Col1 + Col2)/2
Row3 := 400
Col3 := 100
Row4 := 100
Col4 := 500
Row2Half := (Row3 + Row4)/2
Col2Half := (Col3 + Col4)/2
dev_set_color ('red')
gen_region_line (RegionLines, Row1, Col1, Row2, Col2)
gen_arrow_contour_xld (Arrow1, Row1Half, Col1Half, Row1, Col1, 25, 15)
dev_set_color ('blue')
gen_region_line (RegionLines, Row3, Col3, Row4, Col4)
gen_arrow_contour_xld (Arrow1, Row2Half, Col2Half, Row3, Col3, 25, 15)
angle_ll (Row4, Col4,Row3, Col3, Row2, Col2,Row1, Col1, Angle)
disp_message (WindowHandle, '蓝色线转向红色线角度为:' + deg(Angle), 'window', 12, 12, 'black', 'true')逆时针旋转角度为正值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28dev_close_window()
dev_open_window (0, 0, 900, 600, 'black', WindowHandle)
set_display_font (WindowHandle, 26, 'mono', 'true', 'false')
Row1 := 100
Col1 := 100
Row2 := 500
Col2 := 600
Row1Half := (Row1 + Row2)/2
Col1Half := (Col1 + Col2)/2
Row3 := 400
Col3 := 100
Row4 := 100
Col4 := 500
Row2Half := (Row3 + Row4)/2
Col2Half := (Col3 + Col4)/2
dev_set_color ('red')
gen_region_line (RegionLines, Row1, Col1, Row2, Col2)
gen_arrow_contour_xld (Arrow1, Row1Half, Col1Half, Row1, Col1, 25, 15)
dev_set_color ('blue')
gen_region_line (RegionLines, Row3, Col3, Row4, Col4)
gen_arrow_contour_xld (Arrow1, Row2Half, Col2Half, Row4, Col4, 25, 15)
angle_ll (Row3, Col3, Row4, Col4, Row2, Col2,Row1, Col1, Angle)
disp_message (WindowHandle, '蓝色线转向红色线角度为:' + deg(Angle), 'window', 12, 12, 'black', 'true')
线与水平轴(x轴)之间的角度
angle_lx( : : Row1, Column1, Row2, Column2 : Angle)
功能:计算直线与水平坐标轴之间的夹角。
参数:
Row1, Column1: 直线的起点坐标;
Row2, Column2: 直线的终点坐标;
Angle: 两条直线之间的夹角,
-pi <= Angle <= pi
。
其中,当直线方向与x轴方向构成的夹角位于一二象限时,该直线与x轴的夹角角度范围在0~Pi,当直线方向与x轴方向构成的夹角位于三四象限时,该直线与x轴的夹角范围在**-Pi~0**,具体可结合下图理解。
结合Halcon示范如下:
直线方向与x轴方向构成的夹角位于一二象限
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23dev_close_window()
dev_open_window (0, 0, 900, 600, 'black', WindowHandle)
set_display_font (WindowHandle, 26, 'mono', 'true', 'false')
Row1 := 100
Col1 := 100
Row2 := 500
Col2 := 600
Row1Half := (Row1 + Row2)/2
Col1Half := (Col1 + Col2)/2
dev_set_color ('red')
gen_region_line (RegionLines, Row1, Col1, Row2, Col2)
gen_arrow_contour_xld (Arrow1, Row1Half, Col1Half, Row1, Col1, 25, 15)
dev_set_color ('yellow')
gen_region_line (ROI_0, 350, 100, 350, 750)
XRowHalf := 350
XColHalf := (100 + 700)/2
gen_arrow_contour_xld (Arrow, XRowHalf, XColHalf,350, 750, 25, 15)
angle_lx (Row2, Col2, Row1, Col1, Angle)
disp_message (WindowHandle, '红色线角度为:' + deg(Angle), 'window', 12, 12, 'black', 'true')
disp_message (WindowHandle, 'X', 'Image', 345, 765, 'yellow', 'false')直线方向与x轴方向构成的夹角位于三四象限
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23dev_close_window()
dev_open_window (0, 0, 900, 600, 'black', WindowHandle)
set_display_font (WindowHandle, 26, 'mono', 'true', 'false')
Row1 := 100
Col1 := 100
Row2 := 500
Col2 := 600
Row1Half := (Row1 + Row2)/2
Col1Half := (Col1 + Col2)/2
dev_set_color ('red')
gen_region_line (RegionLines, Row1, Col1, Row2, Col2)
gen_arrow_contour_xld (Arrow1, Row1Half, Col1Half, Row2, Col2, 25, 15)
dev_set_color ('yellow')
gen_region_line (ROI_0, 350, 100, 350, 750)
XRowHalf := 350
XColHalf := (100 + 700)/2
gen_arrow_contour_xld (Arrow, XRowHalf, XColHalf,350, 750, 25, 15)
angle_lx (Row1, Col1,Row2, Col2, Angle)
disp_message (WindowHandle, '红色线角度为:' + deg(Angle), 'window', 12, 12, 'black', 'true')
disp_message (WindowHandle, 'X', 'Image', 345, 765, 'yellow', 'false')