因爱智能

halcon学习笔记(11)——Bonding Balls例子

例子是检测pcb板上的圆形接线处,并标记位置,例子很简单,下面是原图和结果,代码也直接上了。


[plain] view plain copy 在CODE上查看代码片派生到我的代码片

  1. * ball.hdev: Inspection of Ball Bonding  
  2. *   
  3. dev_update_window ('off')  
  4. dev_close_window ()  
  5. dev_open_window (0, 0, 728, 512, 'black', WindowID)  
  6. read_image (Bond, 'die/die_03')  
  7. dev_display (Bond)  
  8. set_display_font (WindowID, 14, 'mono', 'true', 'false')  
  9. disp_continue_message (WindowID, 'black', 'true')  
  10. stop ()  
  11. threshold (Bond, Bright, 100, 255)  
  12. *灰度分割  
  13. shape_trans (Bright, Die, 'rectangle2')  
  14. *图形分割  
  15. dev_set_color ('green')  
  16. dev_set_line_width (3)  
  17. dev_set_draw ('margin')  
  18. dev_display (Die)  
  19. disp_continue_message (WindowID, 'black', 'true')  
  20. stop ()  
  21. reduce_domain (Bond, Die, DieGrey)  
  22. *降低图形需要计算的领域,去除不必要干扰  
  23. *threshold (DieGrey, Wires, 0, 50)  
  24. *fill_up_shape (Wires, WiresFilled, 'area', 1, 100)  
  25. *这句是原来实例中的算子,对比了一下,去掉后没有什么影响,不明白有什么具体作用,待求解;  
  26. *算子中的解释是给特定区域进行填补;  
  27. threshold (DieGrey,WiresFilled, 0, 50)  
  28. *继续灰度分割  
  29. dev_display (Bond)  
  30. dev_set_draw ('fill')  
  31. dev_set_color ('red')  
  32. dev_display (WiresFilled)  
  33. disp_continue_message (WindowID, 'black', 'true')  
  34. stop ()  
  35. opening_circle (WiresFilled, Balls, 15.5)  
  36. *打开圆形机构的元素,半径在小于15.5以下  
  37. dev_set_color ('green')  
  38. dev_display (Balls)  
  39. disp_continue_message (WindowID, 'black', 'true')  
  40. stop ()  
  41. connection (Balls, SingleBalls)  
  42. *合并联通区域  
  43. select_shape (SingleBalls, IntermediateBalls, 'circularity', 'and', 0.85, 1.0)  
  44. *区域特征选择,选择需要的面积范围  
  45. sort_region (IntermediateBalls, FinalBalls, 'first_point', 'true', 'column')  
  46. *将检查出的图形排序  
  47. dev_display (Bond)  
  48. dev_set_colored (12)  
  49. dev_display (FinalBalls)  
  50. disp_continue_message (WindowID, 'black', 'true')  
  51. stop ()  
  52. smallest_circle (FinalBalls, Row, Column, Radius)  
  53. *计算最小圆,xy坐标及r半径  
  54. NumBalls := |Radius|  
  55. Diameter := 2 * Radius  
  56. meanDiameter := sum(Diameter) / NumBalls  
  57. mimDiameter := min(Diameter)  
  58. dev_display (Bond)  
  59.   
  60. disp_circle (WindowID, Row, Column, Radius)  
  61. *绘制圆  
  62.   
  63. dev_set_color ('white')  
  64. for i := 1 to NumBalls by 1  
  65.     if (fmod(i,2) == 1)  
  66.         disp_message (WindowID, 'D: ' + Diameter[i - 1], 'image', Row[i - 1] - 2.7 * Radius[i - 1], max([Column[i - 1] - 60,0]), 'white', 'false')  
  67.     else  
  68.         disp_message (WindowID, 'D: ' + Diameter[i - 1], 'image', Row[i - 1] + 1.2 * Radius[i - 1], max([Column[i - 1] - 60,0]), 'white', 'false')  
  69.    endif  
  70. endfor  
  71. *dump_window (WindowID, 'tiff_rgb', './ball')  
  72. dev_set_color ('green')  
  73. dev_update_window ('on')  
  74. disp_continue_message (WindowID, 'black', 'true')  
  75. stop ()  
  76. dev_close_window () 

评论