求圓環毛刺凸出高度是否超標的算法實現


 

 

項目需求:要求圓環外圈毛刺的凸出高度不得超過20像素,如超過判為NG。

 

算法分析:按照一般的思路,應該是先將外圈擬合成一個圓;然后將這個工件閾值化,提取工件區域;然后用該區域減去之前擬合的圓,剩下的區域就是毛刺部分了。那么什么樣特征的毛刺算超標的呢?很顯然,如果僅僅用'area'、'inner_radius'等參數去篩選,至少從原理上來看,是不完全契合項目需求的。

 

具體完整算法如下:

 1 read_image (Image, 'C:/Users/02/Desktop/Ring.png')  2 dev_set_draw ('margin')  3 threshold (Image, Region, 0, 253)  4 fill_up_shape (Region, RegionFillUp, 'area', 1, 20000)  5 fill_up (RegionFillUp, RegionFillUp1)  6 difference (RegionFillUp1, RegionFillUp, CircleInner)  7 smallest_circle (CircleInner, Row, Column, Radius)  8 find_circle (Image, PartCircleXLD, Regions, Cross, Circle, Row, Column, Radius + 100, 0, 360, 40, 100, 20, 1, 40, 'negative', 'first', 'inner', 10, 'circle', RowCenter, ColCenter, Radius1)  9 gen_region_contour_xld (Circle, RegionCircle, 'filled') 10 
11 *稍微膨脹一下,便於后續處理 12 dilation_circle (RegionCircle, RegionCircle, 1.5) 13 difference (RegionFillUp, RegionCircle,RegionDifference) 14 opening_circle (RegionDifference, RegionDifference, 3.5) 15 connection (RegionDifference, ConnectedRegions) 16 select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 50, 9999999) 17 count_obj (SelectedRegions, Number) 18 
19 *后面精確測量一下多出的毛刺是否超標 20 gen_empty_obj (RegionDefects) 21 if (Number >0) 22     for i := 1 to Number by 1
23  select_obj (SelectedRegions, ObjectSelected, i) 24  distance_pr (ObjectSelected, RowCenter, ColCenter, DistanceMin, DistanceMax) 25         *如果毛刺凸出高度超過20像素,則判斷超標 26         if (DistanceMax - Radius1 > 20) 27  concat_obj (RegionDefects, ObjectSelected, RegionDefects) 28  endif 29  endfor 30 endif 31 
32 dev_display (Image) 33 dev_display (RegionDefects) 34 disp_cross (3600, RowCenter, ColCenter, 20, 0.45)

 

 

與程序中的抓圓函數find_circle相關的函數,可以從這里下載:

https://files.cnblogs.com/files/xh6300/find_line_find_circle.zip

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM