工控编程吧

标题: halcon dist_rectangle2_contour_points_xld函数介绍 [打印本页]

作者: qq263946146    时间: 2019-5-24 14:01
标题: halcon dist_rectangle2_contour_points_xld函数介绍
dist_rectangle2_contour_points_xld(Contour : : ClippingEndPoints, Row, Column, Phi, Length1, Length2 : Distances)
dist_rectangle2_contour_points_xld确定Contour 轮廓点与一个任意方向的矩形之间的欧氏距离。
矩形由中心(Row, Column)、方向Phi,半边长度Length1和Length2指定。
角度单位,表示水平轴与Length1,沿数学上正方向(逆时针方向)的夹角。


根据用于创建轮廓Contour 的处理方法,轮廓的起点和终点可能包含位置错误。
在这种情况下,通常调用操作符fit_rectangle2_contour_xld,
并将参数clippingendpoint设置为大于零的值,以便从计算中排除轮廓开始和结束的点。
为了计算拟合过程中使用的同一组点的距离,
clippingendpoint应该设置为与fit_rectangle2_contour_xld中相同的值。


应用实例
*例程用fit_rectangle2_contour_xld检测小金属部件上冲孔的制造缺陷。
*缺陷呈现为金属孔洞内的微小凸出,可以通过将孔洞拟合成矩形稳定检测(例如使用离群值抑制)。
*再使用dist_rectangle2_contour_points_xld计算轮廓边缘到矩形边的距离。
*孔四个顶角稍微成圆弧,一些额外的处理必须执行,以忽略在检查时,受矩形4个角影响。
dev_update_off ()
read_image (Image, 'punched_holes')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
*由于金属部分是背光的,通过构造一个ROI来实现尽可能小的亚像素精确边缘提取,
*可以显著提高处理速度。这很容易通过阈值和形态学来实现。
fast_threshold (Image, Region, 128, 255, 10)
boundary (Region, Border, 'inner')
dilation_rectangle1 (Border, EdgeROI, 7, 7)
reduce_domain (Image, EdgeROI, ImageReduced)
edges_sub_pix (ImageReduced, Edges, 'canny', 1.7, 40, 120)
select_shape_xld (Edges, RectangleEdges, 'contlength', 'and', 500, 100000)
* 使用Tukey的离群值抑制将矩形匹配到孔的边缘。
fit_rectangle2_contour_xld (RectangleEdges, 'tukey', -1, 0, 0, 3, 2, Row, Column, Phi, Length1, Length2, PointOrder)
gen_rectangle2_contour_xld (Rectangles, Row, Column, Phi, Length1, Length2)
dev_set_line_width (3)
dev_set_color ('red')
dev_display (Image)
dev_display (Rectangles)
* 检测金属孔是否正常
count_obj (RectangleEdges, Number)
for I := 0 to Number - 1 by 1
    select_obj (RectangleEdges, RectangleEdge, I + 1)
    * 获取轮廓点坐标
    get_contour_xld (RectangleEdge, Rows, Cols)
    * 用拟合矩形计算出的参数生成矩形
    gen_rectangle2_contour_xld (Rect, Row[I], Column[I], Phi[I], Length1[I], Length2[I])
    get_contour_xld (Rect, RowC, ColC)
    *计算所有轮廓线点到矩形四角的距离。
    D1 := sqrt((Rows - RowC[0]) * (Rows - RowC[0]) + (Cols - ColC[0]) * (Cols - ColC[0]))
    D2 := sqrt((Rows - RowC[1]) * (Rows - RowC[1]) + (Cols - ColC[1]) * (Cols - ColC[1]))
    D3 := sqrt((Rows - RowC[2]) * (Rows - RowC[2]) + (Cols - ColC[2]) * (Cols - ColC[2]))
    D4 := sqrt((Rows - RowC[3]) * (Rows - RowC[3]) + (Cols - ColC[3]) * (Cols - ColC[3]))
    *轮廓线点到矩形顶点的距离通过四个距离的最小值给出。这个距离用来排除和顶点太近的轮廓点
    DistCorner := min2(min2(D1,D2),min2(D3,D4))
    * 计算矩形轮廓点的距离
    dist_rectangle2_contour_points_xld (RectangleEdge, 0, Row[I], Column[I], Phi[I], Length1[I], Length2[I], Dist)
*通过检查轮廓点到矩形的距离来检查冲孔是否OK
*如果离矩形四个角距离大于7个像素的轮廓点,距拟合矩形的距离小于1个像素侧OK
   * Row[I], Column[I], Phi[I], Length1[I], Length2[I]为调用fit_rectangle2_contour_xld 生成的矩形参数
  *所以可以执行下面代码进行判断
*     RectangleOK := true
*     for J := 0 to |Dist| - 1 by 1
*         if (DistCorner[J] > 7.0 and Dist[J] > 1.0)
*             RectangleOK := false
*             break
*         endif
*     endfor

   *一种计算更快的方法是使用掩码来处理,1表示参与计算,0相反。
   *最小距离减去7,结果与0对比选大值,用sgn函数处理结果,生成掩码
    Mask := sgn(max2(DistCorner - 7.0,0.0))
    *用掩码乘以距离来查检是否在允许范围内
    RectangleOK := max(Dist * Mask) <= 1.0
    * Display whether the hole is OK.
    if (RectangleOK)
        dev_set_color ('green')
        get_string_extents (WindowHandle, 'OK', Ascent, Descent, Width, Height)
        set_tposition (WindowHandle, Row[I] - Height / 2, Column[I] - Width / 2)
        write_string (WindowHandle, 'OK')
    else
        dev_set_color ('red')
        get_string_extents (WindowHandle, 'Not OK', Ascent, Descent, Width, Height)
        set_tposition (WindowHandle, Row[I] - Height / 2, Column[I] - Width / 2)
        write_string (WindowHandle, 'Not OK')
    endif
endfor
[halcon]1[/halcon]







欢迎光临 工控编程吧 (https://www.gkbc8.com/) Powered by Discuz! X3.4