很简单的需求,本质就是圆形测量,代码如下:
- list_files ('./Image', ['files','follow_links','recursive'], ImageFiles)
- tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
- for Index := 0 to |ImageFiles| - 1 by 1
- read_image (Image, ImageFiles[Index])
- decompose3 (Image, R, G, B)
- *//提取基准区域找圆心用于圆形测量
- threshold (B, RegionB, 163, 255)
- connection (RegionB, RegionB)
- fill_up (RegionB, RegionB)
- select_shape_std (RegionB, RegionB, 'max_area', 70)
- *//找基准区域圆心
- smallest_circle (RegionB, RowB, ColB, RadB)
-
- *//用i2通道为基准去测圆
- trans_from_rgb (R, G, B, null, i2, null, 'i1i2i3')
- measure_circle (i2, ContsMetro, ContCRes, RowB, ColB, RadB-300, 20, 0.5, 1, 20, 1, 'first', 'all', RowRes, ColRes, RadRes, RowsRes, ColsRes)
- *//RowRes, ColRes, RadRes即拟合的圆心和半径
- gen_cross_contour_xld (CrossC, RowRes, ColRes, 20, 0.785398)
- *//RowsRes, ColsRes是拟合圆measure_pos找到的所有点,可以通过gen_cross_contour_xld显示出来
- *gen_cross_contour_xld (CrossS, RowsRes, ColsRes, 10, 0.785398)
-
- dev_clear_window ()
- dev_display (i2)
- dev_set_draw ('margin')
- dev_set_color ('green')
- dev_display (ContCRes)
- dev_display (CrossC)
- *dev_set_color ('red')
- *dev_display (CrossS)
- disp_message (200000, 'Row: '+RowRes+', Column: '+ColRes+'\nRadius: '+ColRes+' pix', 'window', 10, 10, 'green', 'false')
- stop ()
- endfor
复制代码
其中measure_circle是我自己封装的算子,作用就是集成测量圆需要的步骤,参数放到最后了,内容如下:
- get_image_size (Image, Width, Height)
- create_metrology_model (MetrologyHandle)
- set_metrology_model_image_size (MetrologyHandle, Width, Height)
- add_metrology_object_circle_measure (MetrologyHandle, Row, Column, Radius,\
- DefectH, DefectW, Sigma, Gray, [], [], Index)
- set_metrology_object_param (MetrologyHandle, Index, 'measure_distance', measure_distance)
- set_metrology_object_param (MetrologyHandle, Index, 'measure_select', measure_select)
- set_metrology_object_param (MetrologyHandle, Index, 'measure_transition', measure_transition)
- get_metrology_object_model_contour (ContoursMetro, MetrologyHandle, Index, 1.5)
- apply_metrology_model (Image, MetrologyHandle)
- get_metrology_object_measures (Contours_Metro, MetrologyHandle, Index, 'all', Rows_Res, Columns_Res)
- gen_contour_polygon_xld (Contour, Rows_Res, Columns_Res)
- fit_circle_contour_xld (Contour, 'algebraic', -1, 0, 0, 3, 2, RowRes, ColumnRes, RadiusRes, StartPhi, EndPhi, PointOrder)
- gen_circle_contour_xld (ContCircleRes, RowRes, ColumnRes, RadiusRes, 0, 6.28318, 'positive', 1)
- clear_metrology_model (MetrologyHandle)
- return ()
复制代码
|