Halcon中关于角度计算和测量拟合的算子详解

角度计算算子简介


1、计算直线与水平轴之间的夹角

angle_lx( : : Row1, Column1, Row2, Column2 : Angle)


角度计算方式:将直线看作向量(有方向性),以直线与水平轴的交点为起点(旋转中心)。如果终点在水平轴上方,则夹角为逆时针旋转水平轴到向量的角度(带正号)。如果终点在水平轴下方,则夹角为顺时针旋转水平轴到向量的角度(带负号)。结果取决于定义线条的两点的顺序。


角度表示方式:弧度,-π<=Angle<π


2、计算两条直线之间的夹角

angle_ll( : : RowA1, ColumnA1, RowA2, ColumnA2, RowB1, ColumnB1, RowB2, ColumnB2 : Angle)


角度计算方式:该算子计算原理与angle_lx类似,只不过把水平轴替换为任意直线B


角度表示方式:弧度,-π<=Angle<=π


3、计算一条直线的方向

line_orientation( : : RowBegin, ColBegin, RowEnd, ColEnd : Phi)


角度计算方式:当直线(无方向性)大致位于1、3象限的方向,角度为正。当直线大致位于2、4象限的方向,角度为负。


角度表示方式:弧度,-π/2<Phi<=π/2


4、计算一条直线的参数

line_position( : : RowBegin, ColBegin, RowEnd, ColEnd : RowCenter, ColCenter, Length, Phi)


角度计算方式:同算子 line_orientation。


角度表示方式:弧度,-π/2<Phi<=π/2


5、计算区域等效椭圆的参数

elliptic_axis(Regions : : : Ra, Rb, Phi)


角度计算方式:该区域等效椭圆的主轴(无方向性)相对于水平轴(有方向性)的角度。


角度表示方式:弧度,-π/2<Phi<=π/2


6、计算区域的最小仿射外接矩形的参数

smallest_rectangle2(Regions : : : Row, Column, Phi, Length1, Length2)


角度计算方式:同算子elliptic_axis


角度表示方式:弧度,-π/2<Phi<=π/2


7、计算区域的方向

orientation_region(Regions : : : Phi)


角度计算方式:计算原理基于算子elliptic_axis。此外,还计算了轮廓上离重心最大距离的点。如果此点的列坐标小于重心的列坐标,则elliptic_axis计算得到的角度值需要加上π。


角度表示方式:弧度,-π<=Phi<π


8、计算contours 或 polygons的等效椭圆的参数

elliptic_axis_xld(XLD : : : Ra, Rb, Phi)


角度计算方式:计算原理同算子elliptic_axis。需要注意的是输入的contours 或 polygons不能自相交,如果他们不是闭合轮廓,那么在计算过程中会自动闭合,由此可能会产生自相交,从而导致最终的计算结果不准确。如果输入的轮廓存在自相交,可用elliptic_axis_points_xld算子代替。


角度表示方式:弧度,-π/2<Phi<=π/2


9、计算contours 或 polygons的方向

orientation_xld(XLD : : : Phi)


角度计算方式:计算原理同算子orientation_region。需要注意的是输入的contours 或 polygons不能自相交,如果他们不是闭合轮廓,那么在计算过程中会自动闭合,由此可能会产生自相交,从而导致最终的计算结果不准确。如果输入的轮廓存在自相交,可用orientation_points_xld算子代替。


角度表示方式:弧度,-π<Phi<=π


总结

计算角度时,如果有方向性,角度范围一般是(-π,π)。如果没有方向性,角度范围一般是(-π/2,π/2)



拟合/测量


*************************测量算子*******************************


*画仿射矩形


draw_rectangle2 (3600, Row5, Column4, Phi1, Length1, Length2)


gen_rectangle2 (Rectangle1, Row5, Column4, Phi1, Length1, Length2)


*获取测量句柄


gen_measure_rectangle2 (Row5, Column4, Phi1, Length1, Length2, 512, 512, 'nearest_neighbor', MeasureHandle)


*句柄,平滑参数,灰度差,极性,选择边缘点,边缘中心y,x坐标,幅度,距离


measure_pos (Image, MeasureHandle, 6.1, 65, 'all', 'all', RowEdge, ColumnEdge, Amplitude, Distance)


gen_cross_contour_xld (Cross, RowEdge, ColumnEdge, 6, Phi1)


close_measure (MeasureHandle)



*************************图像--区域--轮廓************************


*区域转轮廓


gen_contour_region_xld (SelectedRegions, Contours, 'border')


*轮廓点坐标


get_contour_xld (Contours, Row, Col)


gen_cross_contour_xld (Cross1, Row, Col, 6, Phi1)


*轮廓拟合圆


fit_circle_contour_xld (Contours, 'algebraic', -1, 0, 0, 3, 2, Row3, Column, Radius, StartPhi, EndPhi, PointOrder)


gen_circle_contour_xld (ContCircle, Row3, Column, Radius, 0, 6.28318, 'positive', 1)


*轮廓拟合椭圆或椭圆弧


fit_ellipse_contour_xld (Contours, 'fitzgibbon', -1, 0, 0, 200, 3, 2, Row4, Column3, Phi, Radius1, Radius2, StartPhi1, EndPhi1, PointOrder1)


gen_ellipse_contour_xld (ContEllipse, Row4, Column3, Phi, Radius1, Radius2, 0, 6.28318, 'positive', 1.5)



**************************图像--轮廓**************************


*提取亚像素精度边缘轮廓


edges_sub_pix (ImageReduced, Edges, 'canny', 1, 20, 40)


*筛选出指定轮廓


select_contours_xld (Edges, SelectedContours, 'contour_length', 0, 50, -0.5, 0.5)


dev_set_color ('green')


*拟合直线


fit_line_contour_xld (SelectedContours, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)


disp_line (3600, RowBegin, ColBegin, RowEnd, ColEnd)



****************************拟合矩形****************************


*生成感兴趣的区域


read_image (Image, 'fabrik')


draw_rectangle1 (3600, Row11, Column11, Row2, Column2)


gen_rectangle1 (Rectangle, Row11, Column11, Row2, Column2)


reduce_domain (Image, Rectangle, ImageReduced)


*提取轮廓,拟合矩形


edges_sub_pix (ImageReduced, Edges, 'canny', 1, 20, 40)


select_contours_xld (Edges, SelectedContours, 'contour_length', 80, 800, -0.5, 0.5)


fit_rectangle2_contour_xld (SelectedContours, 'regression', -1, 0, 0, 3, 2, Row1, Column1, Phi1, Length11, Length21, PointOrder)


gen_rectangle2 (Rectangle1, Row1, Column1, Phi1, Length11, Length21)



***********************************计算垂足、夹角***************************************


read_image (Image, 'fabrik')


draw_rectangle1 (3600, Row1, Column1, Row2, Column2)


gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)


reduce_domain (Image, Rectangle, ImageReduced)


edges_sub_pix (ImageReduced, Edges, 'canny', 1, 20, 40)


sort_contours_xld (Edges, SortedContours, 'upper_left', 'true', 'row')


*取轮廓上的点


select_obj (SortedContours, ObjectSelected, 2)


get_contour_xld (ObjectSelected, Row, Col)


*取轮廓上的线


select_obj (SortedContours, ObjectSelected1, 10)


fit_line_contour_xld (ObjectSelected1, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)


*计算点到线的垂足


projection_pl (Row[0],Col[0],RowBegin, ColBegin, RowEnd, ColEnd ,RowProj, ColProj)


*显示点、直线、垂足、垂线


gen_cross_contour_xld (Cross,Row[0],Col[0], 6, 0.785398)


disp_line (3600, RowBegin, ColBegin, RowEnd, ColEnd)


gen_cross_contour_xld (Cross1,RowProj, ColProj, 6, 0.785398)


disp_line (3600, Row[0],Col[0],RowProj, ColProj)


*计算两条直线的夹角


angle_ll ( RowBegin, ColBegin, RowEnd, ColEnd, Row[0],Col[0],RowProj, ColProj, Angle)


*弧度转角度deg,角度转弧度rad


Ang:=deg(Angle)


*计算直线和水平轴x的夹角


angle_lx (RowBegin, ColBegin, RowEnd, ColEnd, Angle1)


Ang1:=deg(Angle1)


angle_lx (Row[0],Col[0],RowProj, ColProj, Angle2)


Ang2:=deg(Angle2)



项目案例


https://www.cnblogs.com/hanzhaoxin/archive/2013/02/12/2910338.html


halcon学习笔记——实例篇(2)长度和角度测量


上一篇:发布自己写的Pop3协议组件


下一篇:队列的C++数组实现方法(队列--数据结构)