QQ登录

只需一步,快速开始

1.9 halcon 测量圆形金属弧长

[ 复制链接 ]
前面帖子介绍的为矩形范围内测量边缘对的距离。
其实很多情况会有测量弧长的需要。
当前这个帖子通过 使用函数gen_measure_arc来计算弧长。

1.9 halcon 测量圆形金属弧长

1.9 halcon 测量圆形金属弧长


实现代码与注释如下:

  1. *从磁盘读取图片保存到变量Zeiss1
  2. read_image (Zeiss1, 'zeiss1')
  3. *获取图片长宽
  4. get_image_size (Zeiss1, Width, Height)
  5. dev_close_window ()
  6. dev_open_window (0, 0, Width / 2, Height / 2, 'black', WindowHandle)
  7. set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
  8. dev_display (Zeiss1)
  9. disp_continue_message (WindowHandle, 'black', 'true')
  10. stop ()
  11. * draw_circle (WindowHandle, Row, Column, Radius)
  12. Row := 275
  13. Column := 335
  14. Radius := 107
  15. AngleStart := -rad(55)
  16. AngleExtent := rad(170)
  17. dev_set_draw ('fill')
  18. dev_set_color ('green')
  19. dev_set_line_width (1)
  20. *函数用于计算椭圆上特定角度 上的一个点,为实现绘制出测量区域,与绘制矩形区域 类似 。
  21. *AngleStart + AngleExtent,为圆弧起始角度与拓展角度之和,
  22. *Row, Column, 为椭圆中心行列坐标
  23. *0为椭圆主轴旋转角度, Radius, Radius,为椭圆长短半轴长度,
  24. *RowPoint, ColPoint为椭圆上点的行列坐标,为数组形式,由AngleStart + AngleExtent范围决定
  25. get_points_ellipse (AngleStart + AngleExtent, Row, Column, 0, Radius, Radius, RowPoint, ColPoint)
  26. *显示弧度,Row, Column为椭圆中心行列坐标,AngleExtent为起点终点的的角度范围
  27. *RowPoint, ColPoint为圆弧起点。
  28. disp_arc (WindowHandle, Row, Column, AngleExtent, RowPoint, ColPoint)
  29. dev_set_line_width (3)
  30. *生成测量圆弧,和前面帖子生成的测量矩形类似。用于非直线他的同学的边缘距离 提取。
  31. *Row, Column, 为圆弧中心行列坐标,Radius, AngleStart, AngleExtent,为圆弧半径,起始角度,
  32. *10, Width, Height, 为圆弧宽度一半,图像宽,度。
  33. *'nearest_neighbor',在投影时采用近邻插值方法, MeasureHandle为前面 生成的测量圆弧句柄。
  34. gen_measure_arc (Row, Column, Radius, AngleStart, AngleExtent, 10, Width, Height, 'nearest_neighbor', MeasureHandle)
  35. disp_continue_message (WindowHandle, 'black', 'true')
  36. stop ()
  37. count_seconds (Seconds1)
  38. n := 10
  39. for i := 1 to n by 1
  40.    *measure_pos前面帖子已介绍过,为一测量函数,用于测量边缘音距离 ,Image为输入图像, MeasureHandle为输入窗口句柄 ,
  41. *1.5为高斯平滑系数, 30为最小边缘幅度值, 'all'检测所有正负边缘, 'all'表示选中所有边缘,
  42. *RowEdge, ColumnEdge边缘中心行列坐标, Amplitude边缘幅度大小, Distance边缘间距
  43.     measure_pos (Zeiss1, MeasureHandle, 1, 10, 'all', 'all', RowEdge, ColumnEdge, Amplitude, Distance)
  44. endfor
  45. count_seconds (Seconds2)
  46. Time := (Seconds2 - Seconds1) / n
  47. disp_continue_message (WindowHandle, 'black', 'true')
  48. * stop ()
  49. distance_pp (RowEdge[1], ColumnEdge[1], RowEdge[2], ColumnEdge[2], IntermedDist)
  50. * dev_display (Zeiss1)
  51. dev_set_color ('red')
  52. * disp_circle (WindowHandle, RowEdge, ColumnEdge, RowEdge - RowEdge + 1)
  53. disp_line (WindowHandle, RowEdge[1], ColumnEdge[1], RowEdge[2], ColumnEdge[2])
  54. dev_set_color ('yellow')
  55. disp_message (WindowHandle, 'Distance: ' + IntermedDist, 'image', 250, 80, 'yellow', 'false')
  56. * dump_window (WindowHandle, 'tiff_rgb', 'C:\\Temp\\zeiss_result')
  57. close_measure (MeasureHandle)
  58. dev_set_line_width (1)
  59. * disp_continue_message (WindowHandle, 'black', 'true')
  60. stop ()
  61. dev_clear_window ()
复制代码


回复

使用道具 举报

快速回复 返回列表 客服中心 搜索