设置首页收藏本站
开启左侧

求助 抓到中间的圈 并拟合圆

[复制链接]
Jescal0001 发表于 2025-8-12 15:05:33 | 显示全部楼层 |阅读模式
悬赏2视觉币
寻求各方大神思路 初步试了一下canny 但有些图抓不太到

想达到下方的效果
00.jpg

通过网盘分享的文件:百度网盘 提取码: d69j

最佳答案

查看完整内容

很简单的需求,本质就是圆形测量,代码如下: 其中measure_circle是我自己封装的算子,作用就是集成测量圆需要的步骤,参数放到最后了,内容如下:
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
大凡光学,专注标定板提供
UKimiF 发表于 2025-8-12 15:05:34 | 显示全部楼层
很简单的需求,本质就是圆形测量,代码如下:
  1. list_files ('./Image', ['files','follow_links','recursive'], ImageFiles)
  2. tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
  3. for Index := 0 to |ImageFiles| - 1 by 1
  4.     read_image (Image, ImageFiles[Index])
  5.     decompose3 (Image, R, G, B)
  6.     *//提取基准区域找圆心用于圆形测量
  7.     threshold (B, RegionB, 163, 255)
  8.     connection (RegionB, RegionB)
  9.     fill_up (RegionB, RegionB)
  10.     select_shape_std (RegionB, RegionB, 'max_area', 70)
  11.     *//找基准区域圆心
  12.     smallest_circle (RegionB, RowB, ColB, RadB)
  13.    
  14.     *//用i2通道为基准去测圆
  15.     trans_from_rgb (R, G, B, null, i2, null, 'i1i2i3')
  16.     measure_circle (i2, ContsMetro, ContCRes, RowB, ColB, RadB-300, 20, 0.5, 1, 20, 1, 'first', 'all', RowRes, ColRes, RadRes, RowsRes, ColsRes)
  17.     *//RowRes, ColRes, RadRes即拟合的圆心和半径
  18.     gen_cross_contour_xld (CrossC, RowRes, ColRes, 20, 0.785398)
  19.     *//RowsRes, ColsRes是拟合圆measure_pos找到的所有点,可以通过gen_cross_contour_xld显示出来
  20.     *gen_cross_contour_xld (CrossS, RowsRes, ColsRes, 10, 0.785398)
  21.    
  22.     dev_clear_window ()
  23.     dev_display (i2)
  24.     dev_set_draw ('margin')
  25.     dev_set_color ('green')
  26.     dev_display (ContCRes)
  27.     dev_display (CrossC)
  28.     *dev_set_color ('red')
  29.     *dev_display (CrossS)
  30.     disp_message (200000, 'Row: '+RowRes+', Column: '+ColRes+'\nRadius: '+ColRes+' pix', 'window', 10, 10, 'green', 'false')
  31.     stop ()
  32. endfor
复制代码


其中measure_circle是我自己封装的算子,作用就是集成测量圆需要的步骤,参数放到最后了,内容如下:
  1. get_image_size (Image, Width, Height)
  2. create_metrology_model (MetrologyHandle)
  3. set_metrology_model_image_size (MetrologyHandle, Width, Height)
  4. add_metrology_object_circle_measure (MetrologyHandle, Row, Column, Radius,\
  5.                                      DefectH, DefectW, Sigma, Gray, [], [], Index)
  6. set_metrology_object_param (MetrologyHandle, Index, 'measure_distance', measure_distance)
  7. set_metrology_object_param (MetrologyHandle, Index, 'measure_select', measure_select)
  8. set_metrology_object_param (MetrologyHandle, Index, 'measure_transition', measure_transition)

  9. get_metrology_object_model_contour (ContoursMetro, MetrologyHandle, Index, 1.5)
  10. apply_metrology_model (Image, MetrologyHandle)

  11. get_metrology_object_measures (Contours_Metro, MetrologyHandle, Index, 'all', Rows_Res, Columns_Res)

  12. gen_contour_polygon_xld (Contour, Rows_Res, Columns_Res)
  13. fit_circle_contour_xld (Contour, 'algebraic', -1, 0, 0, 3, 2, RowRes, ColumnRes, RadiusRes, StartPhi, EndPhi, PointOrder)

  14. gen_circle_contour_xld (ContCircleRes, RowRes, ColumnRes, RadiusRes, 0, 6.28318, 'positive', 1)
  15. clear_metrology_model (MetrologyHandle)
  16. return ()
复制代码

效果1.png
效果2.png
效果3.png
效果4.png
参数.png

奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复

使用道具 举报

雾里看花 发表于 2025-8-12 17:39:46 | 显示全部楼层
直径找圆吧,,,,,,
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复

使用道具 举报

UKimiF 发表于 2025-8-13 08:43:47 | 显示全部楼层
这是在原图的效果
原图1.png
原图2.png
原图3.png
原图4.png
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复

使用道具 举报

xah 发表于 2025-8-13 09:56:19 | 显示全部楼层
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复

使用道具 举报

 楼主| Jescal0001 发表于 2025-8-13 10:01:20 | 显示全部楼层
本帖最后由 Jescal0001 于 2025-8-13 15:04 编辑
UKimiF 发表于 2025-8-13 08:42
很简单的需求,本质就是圆形测量,代码如下:

感谢你
但我有一张图 比较偏离中心位置 这要怎么调整
我多上传了一张 5.jpg
另外NG图档要怎么判断没抓到圆
再麻烦你,谢谢
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复

使用道具 举报

UKimiF 发表于 2025-8-13 15:12:20 | 显示全部楼层
Jescal0001 发表于 2025-8-13 10:01
感谢你
但我有一张图 比较偏离中心位置 这要怎么调整
我多上传了一张 5.jpg

可以的 加一个预处理就行了 本来的思路是以Blob的中心为基准生成检测区域
现在改成在Blob的范围内找可能是圆形的区域块 提取最接近的两个然后拟合一个大概的圆形
再沿用第一次的思路进行第二次测量即可 代码如下:
  1. list_files ('./Image', ['files','follow_links','recursive'], ImageFiles)
  2. tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
  3. for Index := 0 to |ImageFiles| - 1 by 1
  4.     read_image (Image, ImageFiles[Index])
  5.     decompose3 (Image, R, G, B)
  6.     trans_from_rgb (R, G, B, null, i2, null, 'i1i2i3')
  7.    
  8.     *//提取基准区域找圆心用于圆形测量
  9.     threshold (B, RegionB, 163, 255)
  10.     connection (RegionB, RegionB)
  11.     fill_up (RegionB, RegionB)
  12.     select_shape_std (RegionB, RegionB, 'max_area', 70)
  13.     *//找基准区域圆心
  14.     smallest_circle (RegionB, RowB, ColB, RadB)
  15.     gen_circle (CircleD, RowB, ColB, RadB-200)
  16.    
  17.     *//新增处理 用圆形部分点集为基准找圆形测量的基准圆心和半径
  18.     reduce_domain (i2, CircleD, i2)
  19.     mean_image (i2, i2Mean, 15, 15)
  20.     dyn_threshold (i2, i2Mean, RegionC, 5, 'dark')
  21.     connection (RegionC, RegionC)
  22.     select_most_regions_by_feature (RegionC, RegionC, 'big', 2, 'rect2_len2')
  23.     union1 (RegionC, RegionC)
  24.     get_region_points (RegionC, RowsB, ColsB)
  25.     gen_contour_polygon_xld (ContB, RowsB, ColsB)
  26.     fit_circle_contour_xld (ContB, 'algebraic', -1, 0, 0, 3, 2, RowB, ColB, RadB, StartPhi, EndPhi, PointOrder)
  27.    
  28.     *//用i2通道为基准去测圆
  29.     measure_circle (i2, ContsMetro, ContCRes, RowB, ColB, RadB, 20, 0.5, 1, 20, 1, 'first', 'all', RowRes, ColRes, RadRes, RowsRes, ColsRes)
  30.     *//RowRes, ColRes, RadRes即拟合的圆心和半径
  31.     gen_cross_contour_xld (CrossC, RowRes, ColRes, 20, 0.785398)
  32.     *//RowsRes, ColsRes是拟合圆measure_pos找到的所有点,可以通过gen_cross_contour_xld显示出来
  33.     *gen_cross_contour_xld (CrossS, RowsRes, ColsRes, 10, 0.785398)
  34.    
  35.     dev_clear_window ()
  36.     dev_display (Image)
  37.     dev_set_draw ('margin')
  38.     dev_set_color ('green')
  39.     dev_display (ContCRes)
  40.     dev_display (CrossC)
  41.     *dev_set_color ('red')
  42.     *dev_display (CrossS)
  43.     disp_message (200000, 'Row: '+RowRes+', Column: '+ColRes+'\nRadius: '+ColRes+' pix', 'window', 10, 10, 'green', 'false')
  44.     stop ()
  45. endfor
复制代码

其中select_most_regions_by_feature是我自己封装的算子,作用是提取所有区域特征最大的X个或最小的X个, 代码实现如下:
  1. connection (Regions, Regions)
  2. count_obj (Regions, Number)
  3. if(Number>SelectNumber)
  4.     region_features (Regions, Feature, Area)
  5.     tuple_sort_index (Area, Indices)
  6.     if(Mode=='big')
  7.         tuple_select (Indices, [|Area|-1-(SelectNumber-1):|Area|-1], Indices)
  8.     elseif(Mode=='small')
  9.         tuple_select (Indices, [0:(SelectNumber-1)], Indices)
  10.     else
  11.         SelectRegions:=Regions
  12.         return ()
  13.     endif
  14.     select_obj (Regions, SelectRegions, Indices+1)
  15. else
  16.     SelectRegions:=Regions
  17.     return ()
  18. endif
  19. return ()
复制代码
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复

使用道具 举报

UKimiF 发表于 2025-8-13 15:31:52 | 显示全部楼层
新的效果图
原图1.png
原图2.png
原图3.png
原图4.png
原图5.png
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复

使用道具 举报

hangma 发表于 2025-8-18 11:38:59 | 显示全部楼层
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复

使用道具 举报

xah 发表于 2025-9-9 10:18:39 | 显示全部楼层
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表