2

请教一个 opencv 算法,图片中检测圆形对象

 6 months ago
source link: https://www.v2ex.com/t/1021666
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

请教一个 opencv 算法,图片中检测圆形对象

sunshijie      21 小时 42 分钟前

推荐 YoLov5 +1

Muniesa      21 小时 42 分钟前 via Android

霍夫圆的参数对结果影响很大,如果不需要拟合圆的话,直接 yolo 吧

xinyu391      21 小时 36 分钟前

yolov5 +1

bluesenzhu      21 小时 36 分钟前   3

如果全是这种有规律的图案,自己手搓代码(硬编码)速度应该可以在 0.1s 内。你这个肉眼看特征很明显,就是白底上的小圆,二值化后找轮廓,然后手工写代码判断下是不是圆

alexsz      21 小时 32 分钟前

从图片上看特征还是比较明显的,第一步可以行把方形小纸片扣出来,因为圆形的直径和小纸片长宽基本保持在一个比例范围,所以可以根据小纸片尺寸指定一个适合的霍夫算法参数,第二步再用霍夫检测圆,如果检测出多个圆形,第三步可以再次根据圆形和小纸片的面积或者尺寸比例 排除一下

0312birdzhang      21 小时 32 分钟前

intel 的 CPU 的话可以用 openvino 来加速,跑 onnx 模型没那么慢。用上面提到的 yolov5 ,应该不难。

wjx0912      21 小时 6 分钟前

感谢大家~打算先试下霍夫(图片先缩放一下),然后 15 楼的模版匹配,然后再试试 yolo5

wjx0912      20 小时 55 分钟前

大概率不用霍夫,这个准确度是在是难以达到。。。

Yuhyeong      20 小时 50 分钟前   1

这种程度直接模式匹配就行了,用不上机器学习都。opencv 自带的有模式匹配函数

sslzjx      20 小时 19 分钟前

Halcon 代码,可以试下

* This program fits circles into circular contour segments
* to extract their positions and radii
*
dev_update_off ()
*
* step: acquire image
*
read_image (Image, 'OXfE6Ph.png')

* auto_threshold (Image, all_Region, 15.0)
* connection (all_Region, all_ConnectedRegions)
* select_shape (all_ConnectedRegions, all_ConnectedRegions, 'area', 'and', 7000, 14000)
* count_obj (all_ConnectedRegions, all_NumberContours)
* for Index := 1 to all_NumberContours by 1
* select_obj(all_ConnectedRegions, ObjectSelected1, Index)
* smallest_rectangle1(ObjectSelected1, Row1, Column1, Row2, Column2)
* crop_part(Image, ImagePart, Row1, Column1, Row2-Row1, Column2-Colu)
* endfor

get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width / 2, Height / 2, 'light gray', WindowID)
dev_set_part (0, 0, Height - 1, Width - 1)
dev_set_line_width (3)
dev_set_color ('white')
dev_set_draw ('margin')
dev_display (Image)
set_display_font (WindowID, 14, 'mono', 'true', 'false')
disp_continue_message (WindowID, 'black', 'true')
stop ()
*
* step: segment image into regions
*
dev_set_colored (12)
dev_set_line_width (2)
dev_set_draw ('fill')

*equ_histo_image (Image, Image)
scale_image_max (Image, Image)
decompose3 (Image, Image_R, Image_G, Image_B)
* fast_threshold (Image, Region, 180, 230, 20)
auto_threshold (Image_G, Region, 5.0)
stop()

connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'circularity', 'and', 0.6, 1.2)
select_shape (SelectedRegions, SelectedRegions, 'area', 'and', 200, 500)
dev_display (Image)
dev_display (SelectedRegions)
disp_continue_message (WindowID, 'black', 'true')
stop ()
*
* step: create ROI for contour processing
*
boundary (SelectedRegions, RegionBorder, 'inner_filled')
dilation_circle (RegionBorder, RegionDilation, 3.5)
union1 (RegionDilation, RegionUnion)
reduce_domain (Image, RegionUnion, ImageReduced)
dev_clear_window ()
dev_display (ImageReduced)
disp_continue_message (WindowID, 'black', 'true')
stop ()
*
* step: create contours and fit circles to them
*
edges_sub_pix (ImageReduced, Edges, 'canny', 1.5, 10, 40)
segment_contours_xld (Edges, ContoursSplit, 'lines_circles', 5, 2, 2)
select_contours_xld (ContoursSplit, SelectedContours, 'contour_length', 25, 99999, -0.5, 0.5)
count_obj (SelectedContours, NumberContours)
gen_empty_obj (Circles)
for i := 1 to NumberContours by 1
select_obj (SelectedContours, ObjectSelected, i)
get_contour_global_attrib_xld (ObjectSelected, 'cont_approx', Attrib)
if (Attrib == 1)
concat_obj (Circles, ObjectSelected, Circles)
endif
endfor
union_cocircular_contours_xld (Circles, UnionContours, rad(60), rad(10), rad(30), 100, 50, 10, 'true', 1)
dev_clear_window ()
dev_set_color ('black')
dev_display (UnionContours)
disp_continue_message (WindowID, 'black', 'true')
stop ()
count_obj (UnionContours, NumberCircles)
CenterRow := []
CenterColumn := []
dev_clear_window ()
dev_set_color ('black')
set_display_font (WindowID, 12, 'mono', 'true', 'false')
dev_display (SelectedContours)
for i := 1 to NumberCircles by 1
select_obj (UnionContours, ObjectSelected, i)
fit_circle_contour_xld (ObjectSelected, 'algebraic', -1, 0, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
gen_circle_contour_xld (ContCircle, Row, Column, Radius, 0, rad(360), 'positive', 1.5)
dev_set_color ('white')
dev_display (ContCircle)
if (i == 1)
Row2 := Row + Radius * sin(rad(-45))
Column2 := Column + Radius * cos(rad(-45))
set_tposition (WindowID, Row2 - 35, Column2 + 5)
endif
if (i > 1)
exist := 0
for j := 0 to i - 2 by 1
distance_pp (Row, Column, CenterRow[j], CenterColumn[j], DistanceCenters)
if (DistanceCenters < 20)
exist := 1
endif
endfor
if (exist == 1)
Row2 := Row + Radius * sin(rad(-135))
Column2 := Column + Radius * cos(rad(-135))
set_tposition (WindowID, Row2 - 40, Column2 - 30)
else
Row2 := Row + Radius * sin(rad(-45))
Column2 := Column + Radius * cos(rad(-45))
set_tposition (WindowID, Row2 - 35, Column2 + 5)
endif
endif
disp_arrow (WindowID, Row, Column, Row2, Column2, 2)
write_string (WindowID, i)
if (i < 8)
disp_message (WindowID, 'R' + i + ' = ' + Radius$'.4', 'window', i * 20, 130, 'black', 'false')
else
disp_message (WindowID, 'R' + i + ' = ' + Radius$'.4', 'window', (i - 7) * 20, 400, 'black', 'false')
endif
CenterRow := [CenterRow,Row]
CenterColumn := [CenterColumn,Column]
endfor
*
dev_update_window ('on')


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK