项目要求和检具图片如下图所示:
最终识别效果如下图所示:
halcon代码如下:
read_image (Image, 'C:/Users/Administrator/Desktop/RaisingVM/halcon/20210719汽车零件圆孔识别/零件.jpg')
gen_rectangle1 (ROI_0, 483.141, 469.92, 674.5, 1011.43)
reduce_domain (Image, ROI_0, ImageReduced)
decompose3 (ImageReduced, R,G,B)
threshold (B, Region, 0,150)
connection(Region, ConnectedRegions)//将区域进行分开
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 5000, 20000)//选择孔面积大小的区域
count_obj (SelectedRegions, Number)
center_array_row := []
center_array_column := []
hole_num := 0
for i := 1 to Number by 1
select_obj (SelectedRegions, ObjectSelected, i)
circularity (ObjectSelected, Circularity)
if(Circularity >0.8)
dev_set_color ('blue')
dev_display (ObjectSelected)
area_center (ObjectSelected, Area, Row, Column)
*用下面的轮廓方式也可以计算得到中心
*gen_contour_region_xld (ObjectSelected, Contours, 'center')
*fit_circle_contour_xld (Contours, 'algebraic', -1, 0, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
dev_set_color ('white')
disp_cross (3600, Row, Column, 30, 0)
areamessage := (hole_num+1)+'孔面积'+ Area
center_array_row[hole_num] := Row
center_array_column[hole_num] := Column
disp_message(3600, areamessage, 'image', Row-150, Column-90, 'red', 'true')//指定孔
hole_num := hole_num + 1
endif
endfor
*计算两两孔距
for i := 0 to hole_num-1 by 1
if (i < hole_num-1)
distance_pp (center_array_row[i], center_array_column[i], center_array_row[i+1], center_array_column[i+1], Distance)
disp_line (3600, center_array_row[i], center_array_column[i], center_array_row[i+1], center_array_column[i+1])
distmessage := '第'+(i+1)+'和第'+(i+2)+'孔距离为:'+Distance
*disp_message(3600, distmessage, 'image', 0.5*(center_array_row[i]+center_array_row[i+1]), 0.5*(center_array_column[i]+center_array_column[i+1]), 'yellow', 'false')//指定孔
disp_message(3600, distmessage, 'image', 30+i*50, 0, 'red', 'true')//指定孔
else
distance_pp (center_array_row[i], center_array_column[i], center_array_row[0], center_array_column[0], Distance)
disp_line (3600, center_array_row[i], center_array_column[i], center_array_row[0], center_array_column[0])
distmessage := '第'+(i+1)+'和第'+1+'孔距离为:'+Distance
disp_message(3600, distmessage, 'image', 30+i*50, 0, 'red', 'true')//指定孔
endif
endfor
项目合作请联系微信: