缺陷检测_Halcon缺陷检测实例转OpenCV实现(六) 瓶口缺陷检测

本文介绍了如何使用OpenCV实现Halcon中的瓶口缺陷检测实例,包括使用HSV提取轮廓、霍夫圆变换、极坐标变换、均值滤波做差分等步骤,详细展示了各个步骤的效果,并提供完整测试效果视频。
摘要由CSDN通过智能技术生成

a56a7ff9f4592a0e0566aeb28d9d7593.gif


    Halcon缺陷检测实例转OpenCV实现(一)---网格缺陷检测

    Halcon缺陷检测实例转OpenCV实现(二)---PCB印刷缺陷检测

    Halcon缺陷检测实例转OpenCV实现(三)---凸缺陷检测

    Halcon缺陷检测实例转OpenCV实现(四)---同颜色药片缺陷检测

    Halcon缺陷检测实例转OpenCV实现(五)---混合颜色药片缺陷检测


    本期文章继续介绍缺陷检测专题的第六个案例,用OpenCV实现Halcon中一个瓶口缺陷检测的实例,前面案例链接如上↑↑↑。

    Halcon中对应的例子为inspect_bottle_mouth.hdev,用于检测酒瓶瓶口是否出现破损等缺陷情形,检测效果如下:

   (1) 正常情瓶口完整,无破损

27cfec8b7947a46f65a6373b58eb9229.png

   (2) 异常情况包含不同情况的破损

1b895ae42803e863ea11d595007c5465.png

c2136e69e680eaf7f15778a71ab0a544.png

33375a16ce09cdd9b6713a3be977ed64.png

    Halcon实例主要步骤包含五步,分别是:

  • 使用阈值处理和形态学粗定位品口位置;

  • XLD轮廓拟合最近似的圆形区域作为瓶口的轮廓;

  • 极坐标变换,转换到水平或垂直方向进行处理;

  • 均值滤波图与原图做差分,根据阈值提取;

  • 将绘制的缺陷部分通过反极坐标变换投影到原图上。


    具体的实现代码大家有兴趣看下Halcon的实例代码,这里有几个重要步骤需要对比说明:

    (1) 瓶口轮廓粗定位,OpenCV实现是根据瓶口部分区域为黑色且明显易于提取所以选择了HSV提取黑色轮廓的方法,然后通过计算轮廓的最小外接圆来近似,大部分效果还可以,如下:

5dfc1a4d17d5f01b5da94c1291f17ee3.png

但有一些情况圆边上多出一部分杂讯,如下:

3d4146b7defca506ecbde94005789eed.png

Halcon中通过拟合圆算子可以过滤,OpenCV中需要自己写

c21a8af734bcb33c22b6ec86b427e848.png

    (2) 所以,第一步和第二步这里直接同霍夫圆变换来替换(最重要的就是参数要设置合适):

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)gray = cv2.medianBlur(gray,3)circles = cv2.HoughCircles(gray,cv2.HOUGH_GRADIENT,1,100,\         param1=200,param2=30,minRadius=150,maxRadius=500)

282473f119bc1d4debef9c4171cd80f0.png

我测试了一下,16张测试图,效果都不错,暂时采用它。    (3) 第三步,极坐标变换。这里的重点就是基于上一步骤要准确找到圆,将圆心作为极坐标变换的中心。

x = circles[0][i][0] - circles[0][i][2]y = circles[0][i][1] - circles[0][i][2]w = h = 2 * circles[0][i][2]center = (circles[0][i][0], circles[0][i][1])radius = circles[0][i][2]ROI = img[y:y+h,x:x+w].copy()cv2.imshow('ROI',ROI)trans_center = (center[0]-x, center[1]-y)polarImg = cv2.warpPolar(ROI,(300,600),trans_center,radius,cv2.INTER_LINEAR + cv2.WARP_POLAR_LINEAR)cv2.imshow('polarImg',polarImg)

变换前:

c88ac53e592822f193b783b808f303f0.png

变换后:

019a056cb180d629c497d091e65ee1ca.png

    (3) 均值滤波做差分,注意这里的均值滤波核大小,一般我们都是设置(3,3)或(5,5)等,这里物体垂直方向较长,参考Halcon例子中设置为(3, 501),看效果:

blur = cv2.blur(gray,(3,501))cv2.imshow('blur',blur)diff = cv2.absdiff(gray,blur)cv2.imshow('diff',diff)cv2.imwrite("diff.png",diff)ret,thres = cv2.threshold(diff,55,255,cv2.THRESH_BINARY)thres = cv2.medianBlur(thres, 3)contours2,hierarchy2 = cv2.findContours(thres, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)for cnt2 in contours2:  (x2, y2, w2, h2) = cv2.boundingRect(cnt2)    #print(x, y, w, h)  if w2 > 13:    cv2.drawContours(polarImg,cnt2,-1,(0,0,255),2)    isNG = True

eb0f39a0cf8c4f50d1ff357b1d168d3b.png

然后做差分,阈值处理,绘制轮廓:

1c60fc230658ff650c7bcc7444d04fbe.png

0eb13cfded3d51e58ec01236072a12a1.png

    (4) 反极坐标变换,结果投影到原图:

50301ad98e35501f5025394757f80f11.png

    (5) 最后把ROI图贴到结果图中:

5a492e2e6cb2c37e09ebf143bf163acf.png

完整测试效果见下面视频:

核心代码上面已展示,如果对完整源码感兴趣,欢迎加入知识星球获取和讨论,感谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值