Halcon拟合测量

halcon中除了可以使用助手测量外,还可通过拟合来进行一系列的几何测量。

要测量的工件如下:

*采集图像
read_image (Image, '1.png')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)
dev_set_color ('yellow')
 
*定位
threshold (Image, Regions, 89, 255)
area_center (Regions, Area, Row, Column)
orientation_region (Regions, Phi)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_display (Image)
set_tposition (WindowHandle, 360, 10)
write_string (WindowHandle, 'Area:'+Area)
set_tposition (WindowHandle, 400, 10)
write_string (WindowHandle, 'Center:'+Row+' '+Column)
set_tposition (WindowHandle, 440, 10)
write_string (WindowHandle, 'Orientation:'+Phi+'rad')
disp_cross (WindowHandle, Row, Column, 10, 0)
disp_arrow (WindowHandle,Row,Column, Row-150*sin(Phi), Column+150*cos(Phi),2)
 
*提取亚像素轮廓
boundary (Regions, RegionBorder, 'inner')
dilation_rectangle1 (RegionBorder, RegionDilation, 5, 5)
reduce_domain (Image, RegionDilation, ImageReduced)
edges_sub_pix (ImageReduced, Edges, 'canny', 1, 20, 40)
select_shape_xld (Edges, SelectedXLD, 'contlength', 'and', 22.98, 1000)
 
*分割轮廓
segment_contours_xld (SelectedXLD, ContoursSplit, 'lines_circles', 6, 4, 4)
count_obj (ContoursSplit, Number)
dev_set_line_width (2)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
k:=1
c:=1
line_row:=[]
line_col:=[]
circle_row:=[]
circle_col:=[]
 
*拟合测量
for i:=1 to Number by 1
   select_obj (ContoursSplit, ObjectSelected, i)
   *得到轮廓的'cont_approx'属性,-1时为直线,1时为圆
   get_contour_global_attrib_xld (ObjectSelected, 'cont_approx', Attrib)
   if(Attrib == -1)
       *直线拟合
       fit_line_contour_xld (ObjectSelected, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)
       *生成多边形亚像素轮廓
       gen_contour_polygon_xld (line, [RowBegin,RowEnd], [ColBegin,ColEnd]) 
       distance_pp (RowBegin, ColBegin, RowEnd, ColEnd, Distance)
       disp_message (WindowHandle, 'L'+k, 'image', (RowBegin+RowEnd)/2, (ColBegin+ColEnd)/2, 'black', 'false')
       disp_message (WindowHandle, 'L'+k+'='+Distance, 'window', 20*i, 10, 'white', 'false')
       k:=k+1
       line_row:=[line_row,RowBegin,RowEnd]
       line_col:=[line_col,ColBegin,ColEnd]
   else
       *拟合圆
       fit_circle_contour_xld (ObjectSelected, 'algebraic', -1, 0, 0, 3, 2, Row1, Column1, Radius, StartPhi, EndPhi, PointOrder)
       gen_circle_contour_xld (ContCircle, Row1, Column1, Radius, 0, 6.28318, 'positive', 1)
       disp_message (WindowHandle, 'C'+c, 'image', Row1-2*Radius, Column1, 'black', 'false')
       disp_message (WindowHandle, 'C'+c+'='+Radius, 'window', 20*i, 10, 'white', 'false')
       c:=c+1
       circle_row:=[circle_row,Row1]
       circle_col:=[circle_col,Column1]
   endif
   stop()
endfor
distance_pp (line_row[6],line_col[6],line_row[9], line_col[9], Distance0)
disp_message (WindowHandle, 'L4L5'+'='+Distance0, 'window', 240, 10, 'green', 'false')
distance_pp (circle_row[0], circle_col[0],circle_row[2], circle_col[2], Distance1)
disp_message (WindowHandle, 'C1C3'+'='+Distance1, 'window', 260, 10, 'green', 'false')
distance_pp (circle_row[3], circle_col[3],circle_row[3], circle_col[4], Distance2)
disp_message (WindowHandle, 'C4C5'+'='+Distance2, 'window', 280, 10, 'green', 'false')

运行结果如下:

发布了455 篇原创文章 · 获赞 535 · 访问量 324万+

猜你喜欢

转载自blog.csdn.net/libaineu2004/article/details/103828269
今日推荐