1 暴力拟合法
Step2: 然后绘制这个圆的两个同心圆作为边界,即直径略大于和略小于它的两个同心圆;
Step3: 这样做的目的,是为了把包含待测量圆边界的环状区域分割出来;
Step4: 对分割出的局部环形区域作边缘提取,得到一系列边界轮廓;
Step5: 采用Halcon的轮廓拟合算子完成圆的拟合。
短短五步,成功获得了当前圆的拟合参数。
参考代码如下所示:
dev_close_window() dev_update_off () dev_open_file_dialog ('read_image', 'default', 'default', Selection) read_image (Image, Selection) get_image_size (Image, Width, Height) dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle) dev_display (Image) draw_circle_mod (WindowHandle, Height/2, Width/2, Width/20, Row, Column, Radius) gen_circle_contour_xld (ContCircle, Row, Column, Radius, 0, 6.28318, 'positive', 1) dev_display (ContCircle) dev_set_color ('green') gen_circle (Circle1, Row, Column, Radius*13.0/10) gen_circle (Circle2, Row, Column, Radius*7.0/10) dev_set_draw ('margin') dev_display (Circle1) dev_display (Circle2) stop() difference (Circle1, Circle2, RegionDifference) reduce_domain (Image, RegionDifference, ImageReduced) edges_sub_pix (ImageReduced, Edges, 'canny', 1, 20, 40) fit_circle_contour_xld (Edges, 'algebraic', -1, 0, 0, 3, 2, Row1, Column1, Radius1, StartPhi, EndPhi, PointOrder) gen_circle_contour_xld (ContCircle1, Row1, Column1, Radius1, 0, 6.28318, 'positive', 1) dev_clear_window () dev_display (Image) dev_display (ContCircle1) message1 := 'CenterRow: ' + Row1 message2 := 'CenterCol: ' + Column1 message3 := 'Radius: ' + Radius1 set_display_font (WindowHandle, 16, 'mono', 'true', 'false') disp_message (WindowHandle, message1, 'window', 0, -1, 'forest green', 'false') disp_message (WindowHandle, message2, 'window', 20, -1, 'forest green', 'false') disp_message (WindowHandle, message3, 'window', 40, -1, 'forest green', 'false')
2 真的成功了吗?
3 测量工具法
这个方法和任何其他测量工具一样,都可以与前置的定位工具进行align,省下了好多事情,而且也维持了Halcon在定位-测量环节上工具逻辑的一致性。
参考代码如下:
dev_close_window() dev_update_off () dev_open_file_dialog ('read_image', 'default', 'default', Selection) read_image (Image, Selection) get_image_size (Image, Width, Height) dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle) dev_display (Image) draw_circle_mod (WindowHandle, Height/2, Width/2, Width/20, Row, Column, Radius) gen_circle_contour_xld (ContCircle, Row, Column, Radius, 0, 6.28318, 'positive', 1) dev_display (ContCircle) dev_set_color ('green') create_metrology_model (MetrologyHandle) add_metrology_object_generic (MetrologyHandle, 'circle', [Row, Column, Radius], 20, 5, 1, 30, [], [], Index) apply_metrology_model (Image, MetrologyHandle) get_metrology_object_result (MetrologyHandle, 'all', 'all', 'result_type', 'all_param', Parameter) get_metrology_object_result_contour (Contour, MetrologyHandle, 'all', 'all', 1.5) get_metrology_object_measures (Contours, MetrologyHandle, 'all', 'all', Row1, Column1) dev_display (Contours) stop() clear_metrology_model (MetrologyHandle) dev_clear_window () dev_display (Image) dev_display (Contour) message1 := 'CenterRow: ' + Parameter[0] message2 := 'CenterCol: ' + Parameter[1] message3 := 'Radius: ' + Parameter[2] set_display_font (WindowHandle, 16, 'mono', 'true', 'false') disp_message (WindowHandle, message1, 'window', 0, -1, 'forest green', 'false') disp_message (WindowHandle, message2, 'window', 20, -1, 'forest green', 'false') disp_message (WindowHandle, message3, 'window', 40, -1, 'forest green', 'false')
4 总结
转载自:https://blog.csdn.net/libaineu2004/article/details/106745204
本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:


