halcon之检测圆

直接上原码:

read_image()

*中间插入选取ROI和旋转图像

threshold (ImageReduced, Region, 0, 128)

fill_up (Region, RegionFillUp)
orientation_region (RegionFillUp, Phi)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle1)
area_center (RegionFillUp, Area, RowCenter, ColumnCenter)
vector_angle_to_rigid (RowCenter, ColumnCenter, Phi, RowCenter, ColumnCenter, rad(2), HomMat2D)
affine_trans_region (Region, RegionAffineTrans, HomMat2D, 'false')
dev_display (RegionAffineTrans)
connect_and_holes (Region, NumConnected, NumHoles)
edges_sub_pix (ImageReduced, Edges, 'canny', 0.6, 30, 70)
area_center_xld (Edges, AreaContours, RowCenterCntours, ColumnCenterContours, PointOrderContours)
orientation_xld (Edges, Phi1)
gen_region_contour_xld (Edges, RegionEdges, 'margin')
get_region_points (RegionAffineTrans, RowsEdges, ColumnsEdges)
smallest_rectangle2_xld (Edges, Row, Column, Phi2, Length1, Length2)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Edges)
segment_contours_xld (Edges, ContoursSplit, 'lines_circles', 5, 10, 5)
sort_contours_xld (ContoursSplit, SortedContours, 'upper_left', 'true', 'row')
dev_clear_window()
dev_set_colored(12)
dev_display(ContoursSplit)
gen_empty_obj (CircularArcs)
count_obj (ContoursSplit, Number)
NumberCircles:=0
j:=1
for j := 1 to Number by 1
    select_obj (ContoursSplit, ObjectSelected, j)
    get_contour_global_attrib_xld (ObjectSelected, 'cont_approx', Attrib)
    
    if (Attrib = 1)
        concat_obj (CircularArcs, ObjectSelected, CircularArcs)
    endif
endfor
dev_clear_window()
dev_display(CircularArcs)
union_cocircular_contours_xld (CircularArcs, UnionContours, 0.5, 0.5, 0.2, 30, 10, 20, 'true', 1)
fit_circle_contour_xld (UnionContours, 'geotukey', -1, 0, 0, 3, 1, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
dev_clear_window()
dev_display(UnionContours)
CircleIds := find(sgn(Radius-500),-1)
select_obj (UnionContours, Circles, CircleIds+1)
dev_clear_window()
dev_display(Circles)
dev_clear_window ()
dev_display (ImageRotate)
dev_set_color ('magenta')
gen_ellipse_contour_xld (ContCircle, subset(Row,CircleIds), subset(Column,CircleIds), gen_tuple_const(|CircleIds|,0), subset(Radius,CircleIds), subset(Radius,CircleIds), gen_tuple_const(|CircleIds|,0), gen_tuple_const(|CircleIds|,rad(360)), subset(PointOrder,CircleIds), 1.5)
dev_display (ContCircle)
count_obj (Circles, Number)
for Index := 0 to Number-1 by 1
    RowCenter := Row[CircleIds[Index]]
    ColCenter := Column[CircleIds[Index]]
    Rad := Radius[CircleIds[Index]]
    set_tposition (WindowHandle, RowCenter+sin(rad(-60))*(Rad+20), ColCenter+cos(rad(-75))*(Rad+10))
    write_string (WindowHandle, Rad$'.2f')
endfor
IndicesUppermost := (sort_index(Row))[0:3]
RowOval := subset(Row,IndicesUppermost)
ColOval := subset(Column,IndicesUppermost)
Indices := sort_index(ColOval)
RowOvalSorted := subset(RowOval,Indices)
ColOvalSorted := subset(ColOval,Indices)
stop()
 get_image_size (Image, Width, Height)
 dev_set_draw ('margin')
 dev_set_line_width (2)
发布了9 篇原创文章 · 获赞 5 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_39954922/article/details/79117336