Halcon角度测量

本文最后更新于:2022年5月29日 上午

angle_ll()求解线与线之间的角度;angle_lx()求解线与水平轴(x轴)之间的角度。

原文链接:https://www.cnblogs.com/Nq1996/p/14257992.html
侵删

在Halcon的使用过程中经常要使用到angle_llangle_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. 顺时针旋转角度为负值

    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
    28
    dev_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')

  2. 逆时针旋转角度为正值

    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
    28
    dev_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示范如下:

  1. 直线方向与x轴方向构成的夹角位于一二象限

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    dev_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')

  2. 直线方向与x轴方向构成的夹角位于三四象限

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    dev_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')