QQ登录

只需一步,快速开始

3.2 halcon上位机实现两电路板金手指偏移测量

[ 复制链接 ]
2019-03-21_202850.jpg
当前这个项目主要实现上下两电路板间,对应两金手指相对左右偏移量计算。
计算出偏移量后通过执行机构,使上下板金手指一一对齐。
2019-03-21_202539.jpg
实现结果如图,主要思路是
1.先提取上板白色区域最右侧金手指中心线。
2.再提取下板白色区域最右侧金手指中心线。计算其中心线上端点与上侧中心线投影点坐标。
3.最终计算投影坐标点到下板最右侧金手指中心线的距离,就为要计算的结果。

至于上板,下板最右侧金手指的提取,中间过程进行了一系列的blob分析与处理。此处理方法也是blob分析中最简单,最常用的。具体可以参阅代码
  1. dev_close_window ()
  2. read_image (Image, '1.bmp')
  3. dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
  4. dev_display (Image)
  5. rgb1_to_gray (Image, Image)
  6. get_image_size (Image, ImageWidth, ImageHeight)
  7. threshold (Image, IconTemp, 120, 255)
  8. connection (IconTemp, Icon)
  9. *筛选全部白色区域
  10. select_shape (Icon, IconTemp, ['area','rectangularity'], 'and', [2000,0.9], [10000,1])
  11. *筛选上,下白色区
  12. select_shape(IconTemp, Icon, 'row1', 'and', 0, 100)
  13. difference (IconTemp, Icon, IconTemp2)

  14. *处理上白色
  15. union1 (Icon, IconTemp)
  16. smallest_rectangle1 (IconTemp, Row, Column, Row1, Column1)
  17. gen_rectangle1 (Rectangle, Row, Column, Row1/2, ImageWidth)
  18. reduce_domain(Image, Rectangle, IconTemp)
  19. threshold (IconTemp, Icon, 0, 120)
  20. connection (Icon, IconTemp)
  21. select_shape (IconTemp, Icon, ['area','rectangularity'], 'and', [500,0.9], [999999,1])
  22. sort_region (Icon, IconTemp, 'upper_right', 'false', 'column')
  23. select_obj(IconTemp, Icon, 1)
  24. gen_contour_region_xld (Icon, IconTemp, 'border')
  25. fit_rectangle2_contour_xld (IconTemp, 'regression', -1, 0, 0, 3, 2, Row, Column, Phi, Length1, Length2, PointOrder)
  26. *提取矩形中心线为上参考线
  27. get_rectangle2_points (Row, Column, Phi, Length1, Length2, CornerY, CornerX, LineCenterY, LineCenterX)
  28. if( Phi<=0)
  29.     XValue := LineCenterX[3]
  30.     YValue := LineCenterY[3]
  31.     XValue1:= LineCenterX[1]
  32.     YValue1:= LineCenterY[1]
  33. else
  34.     XValue := LineCenterX[1]
  35.     YValue := LineCenterY[1]  
  36.     XValue1:= LineCenterX[3]
  37.     YValue1:= LineCenterY[3]
  38. endif

  39. *处理下白色区
  40. union1 (IconTemp2, IconTemp)
  41. dilation_rectangle1 (IconTemp, IconTemp2, 50, 50)
  42. smallest_rectangle1 (IconTemp2, Row, Column, Row1, Column1)
  43. gen_rectangle1 (Rectangle, Row, Column, Row1, ImageWidth)
  44. reduce_domain(Image, Rectangle, IconTemp)
  45. threshold (IconTemp, Icon, 100, 255)
  46. connection (Icon, IconTemp)
  47. select_shape (IconTemp, Icon, ['area','rectangularity','ratio'], 'and', [500,0.8,2], [999999,1,20])
  48. sort_region (Icon, IconTemp, 'upper_right', 'false', 'column')
  49. select_obj(IconTemp, Icon, 1)
  50. gen_contour_region_xld (Icon, IconTemp, 'border')
  51. fit_rectangle2_contour_xld (IconTemp, 'regression', -1, 0, 0, 3, 2, Row, Column, Phi, Length1, Length2, PointOrder)
  52. get_rectangle2_points (Row, Column, Phi, Length1, Length2, CornerY, CornerX, LineCenterY, LineCenterX)
  53. if( Phi<=0)
  54.     XValue2 := LineCenterX[3]
  55.     YValue2 := LineCenterY[3]
  56.     XValue3 := LineCenterX[1]
  57.     YValue3 := LineCenterY[1]  
  58. else
  59.     XValue2 := LineCenterX[1]
  60.     YValue2 := LineCenterY[1]  
  61.     XValue3 := LineCenterX[3]
  62.     YValue3 := LineCenterY[3]   
  63. endif
  64. *下金手指中心线顶点到上金手指中心线的投影。
  65. projection_pl(YValue2,XValue2,YValue,XValue,YValue1,XValue1,YValue1,XValue1)
  66. *投影点到下金手指中心线距离
  67. distance_pl(YValue1,XValue1,YValue,XValue,YValue2,XValue2,Distance)
  68. *显示结果
  69. gen_contour_polygon_xld(LineXLD,[YValue,YValue1],[XValue,XValue1])
  70. gen_contour_polygon_xld(LineXLD1,[YValue2,YValue3],[XValue2,XValue3])
  71. gen_arrow_contour_xld(Arrow, YValue1, XValue1, YValue2, XValue2, 10, 10)
  72. gen_arrow_contour_xld(Arrow1, YValue2, XValue2, YValue1, XValue1, 10, 10)
  73. dev_display(Image)
  74. dev_display(LineXLD)
  75. dev_display(LineXLD1)
  76. dev_set_color('green')
  77. dev_display(Arrow)
  78. dev_display(Arrow1)
  79. message := Distance


  80. .2f'+'mm'
  81. get_string_extents(WindowHandle, message, Ascent, Descent, Width1, Height1)
  82. dev_disp_text(message, 'image', YValue2-Height1, XValue2, 'green', ['box'], ['false'])
复制代码




回复

使用道具 举报

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