halcon实现饼干缺陷检测代码
read_image (Image, 'C:/Users/Administrator/Desktop/halcon识别图片/饼干检测.jpg')
dev_close_window()
dev_open_window (0, 0, 720, 520, 'black', WindowHandle)
get_image_size (Image, Width, Height)
dev_display (Image)
rgb1_to_gray (Image, GrayImage)
gen_rectangle1 (ROI_0, 7.5, 160, 518, 710)
reduce_domain (GrayImage, ROI_0, ImageReduced)
*提取边缘
threshold (ImageReduced, Regions, 60, 208)
connection (Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 26693.4, 47014.3)
dilation_circle (SelectedRegions, RegionDilation, 1)
closing_rectangle1 (RegionDilation, RegionClosing, Width, Height)
area_holes (RegionClosing, Area)
*此处用于检测孔洞,如果area不为0,则有孔洞缺陷
if(Area>0)
endif
count_obj (RegionClosing, Number)
dev_display (Image)
j:=0
for i:=1 to Number by 1
dev_set_line_width (1)
dev_set_color ('red')
dev_set_draw ('margin')
select_obj (RegionClosing, ObjectSelected, i)
*将区域转XLD轮廓(上面因为区域是边缘描绘,所以此句代码运行后不会产生啥变化)
gen_contour_region_xld (ObjectSelected, Contours, 'border')
*得到XLD轮廓上所有点的坐标
get_contour_xld (Contours, Row_R, Col_R)
*拟合
*对这个XLD轮廓拟合外接矩形(带方向的外接矩形)得到外接矩形的一些数据(中心行列坐标,角度,半宽半高等)
fit_rectangle2_contour_xld (Contours, 'regression', -1, 0, 0, 3, 2, Row, Column, Phi, Length1, Length2, PointOrder)
*将外接矩形一些参数输入形成XLD轮廓
gen_rectangle2_contour_xld (Rectangle, Row, Column, Phi, Length1, Length2)
*得到这个XLD轮廓的四个顶点,(有五个点,最后一个点与第一个点重合)
get_contour_xld (Rectangle, RowC, ColC)
*求解xld轮廓上各个点到矩形四个角的距离
D1 := sqrt((Row_R - RowC[0]) * (Row_R - RowC[0]) + (Col_R - ColC[0]) * (Col_R - ColC[0]))
D2 := sqrt((Row_R - RowC[1]) * (Row_R - RowC[1]) + (Col_R - ColC[1]) * (Col_R - ColC[1]))
D3 := sqrt((Row_R - RowC[2]) * (Row_R - RowC[2]) + (Col_R - ColC[2]) * (Col_R - ColC[2]))
D4 := sqrt((Row_R - RowC[3]) * (Row_R - RowC[3]) + (Col_R - ColC[3]) * (Col_R - ColC[3]))
*并求出每个点距离四个角距离中的最小距离(也就是离他最近的点的距离)放到DistCorner数组里面
DistCorner := min2(min2(D1,D2),min2(D3,D4))
*求最小外接矩形上的点到离他最近的里面的轮廓上对应点的距离
dist_rectangle2_contour_points_xld (Contours, 0, Row, Column, Phi, Length1, Length2, Dist)
*符号函数sgn(),若sgn后面括号里的数大于0,则sgn输出1,若括号里的数小于0,则输出-1,若括号里的数等于0,则输出0
*判断拐角处,有的商品拐角处是圆角,此处先判断矩形上一个角与最近轮廓上的点的距离最大值与60比较,若大于60,则sgn函数输出1,1再乘以矩形上的点到最近轮廓的的距离并与4.5比较,得出是否合格
*若小于60,则sgn函数输出0,故与Dist乘积肯定小于4.5,合格。
Mask := sgn(max2(DistCorner - 60.0,0.0))
RectangleOK := max(Dist * Mask) <= 4.5
*做判断,并且排除拐角处的点
if (RectangleOK)
dev_set_line_width (3)
dev_set_color ('green')
dev_display(Rectangle)
set_tposition (WindowHandle, Row, Column)
write_string (WindowHandle, 'OK')
disp_message (WindowHandle, max(Dist * Mask), 'window', 20+40*i, 20, 'black', 'true')
else
dev_set_line_width (3)
dev_set_color ('red')
dev_display(Rectangle)
set_tposition (WindowHandle, Row, Column)
write_string (WindowHandle, 'NOT OK')
disp_message (WindowHandle, max(Dist * Mask), 'window', 20+40*i, 20, 'red', 'true')
j := j + 1
endif
endfor
stop()