Halcon进行饼干缺陷检测

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函数输出11再乘以矩形上的点到最近轮廓的的距离并与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()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值