Halcon缺陷检测实例转OpenCV实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Halcon缺陷检测实例转OpenCV实现相关的知识,希望对你有一定的参考价值。



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

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


    本期文章继续介绍缺陷检测专题的第三个案例,用OpenCV实现Halcon中一个物体凸缺陷检测的实例,前两个案例链接如上↑

    Halcon中对应的例子为fin.hdev,源图均有凸起缺陷,如下图所示:

Halcon缺陷检测实例转OpenCV实现(三)_二值化

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

Halcon缺陷检测实例转OpenCV实现(三)_二值化_03

    Halcon实例对应的效果和方法大家可以自己查看,这里做简单说明。核心算子共4个:

binary_threshold (Fin, Background, max_separability, light, UsedThreshold)

---二值化获取右边白色亮区域,接下来转为检测白色区域的凹缺陷来检测

closing_circle (Background, ClosedBackground, 250)

---使用半径为250的圆形结构元素做闭运算

difference (ClosedBackground, Background, RegionDifference)

---二值化结果区域与闭运算结果区域做差

opening_rectangle1 (RegionDifference, FinRegion, 5, 5)

---5x5的结构元素做开运算,滤除边缘噪点,剩余真正的缺陷区域

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

    下面介绍用Python-OpenCV来实现的步骤。第一种方法也采用上面的方式,将对应的算子转换成OpenCV对应的函数和方法。

(1) 二值化方法采用OTSU阈值方法,得到的效果基本与binary_threshold

(2) 闭运算结构元素采用半径125的圆形结构元素(这一点和Halcon有差异,如果设置为250,fin2.png腐蚀过度,有可能是算子或者结构元素差异造成)

(3) 做差使用cv2.absdiff()函数即可

(4) 开运算结构元素设置5x5圆形结构元素,效果比矩形结构元素好些


下面是完整代码(含关键步骤注释)和检测效果:

import numpy as np
import cv2


font = cv2.FONT_HERSHEY_SIMPLEX


img = cv2.imread(./imgs/fin1.png)
cv2.imshow(src,img)


gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# OTSU阈值
ret,background = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
cv2.imshow(thresh,background)


# 250*250圆形结构元素--闭运算
k1 = np.zeros((250, 250),np.uint8)
cv2.circle(k1,(125,125),125,(1,1,1),-1,cv2.LINE_AA)
#print(k1)


closing = cv2.morphologyEx(background, cv2.MORPH_CLOSE, k1, None, None, 1)#闭运算
cv2.imshow(closing,closing)
# 图像差分
diff = cv2.absdiff(background, closing)
cv2.imshow(diff,diff)


# 5*5圆形结构元素--开运算
#k2=np.ones((5,5), np.uint8) #矩形结构元素
k2 = np.zeros((5, 5),np.uint8)
cv2.circle(k2,(2,2),2,(1,1,1),-1,cv2.LINE_AA)
print(k2)


# 开运算
opening = cv2.morphologyEx(diff, cv2.MORPH_OPEN, k2)#闭运算
cv2.imshow(opening,opening)


# 轮廓查找
contours,hierarchy = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)


isNG = False
# 结果判断(还可以自己设置缺陷大小来删选)
if len(contours) > 0:
isNG = True
cv2.drawContours(img,contours,-1,(0,0,255),2)


if isNG:
rect, basline = cv2.getTextSize(Detect NG, font, 1.0, 2)
cv2.rectangle(img, (10,10,int(rect[0]*0.7),rect[1]), (212, 233, 252), -1, 8)
cv2.putText(img,Detect NG, (10,5+rect[1]), font, 0.7, (0,0,255), 2)
else:
rect, basline = cv2.getTextSize(Detect OK, font, 1.0, 2)
cv2.rectangle(img, (10,10,int(rect[0]*0.7),rect[1]), (212, 233, 252), -1, 8)
cv2.putText(img,Detect OK, (10,5+rect[1]), font, 0.7, (0,200,0), 2)
cv2.imshow(result, img)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:

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

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

Halcon缺陷检测实例转OpenCV实现(三)_二值化_07

    当然实现方法并不唯一,大家有好的方法可以在文末留言,欢迎大家一起交流。更多视觉图像处理相关内容不要忘记关注我们哟!

Halcon缺陷检测实例转OpenCV实现(三)_二值化_08

△长按关注OpenCV与AI深度学习,获取最新CV干货


觉得有用麻烦给个 


以上是关于Halcon缺陷检测实例转OpenCV实现的主要内容,如果未能解决你的问题,请参考以下文章

Halcon实例转OpenCV之焊点检测

PCB印刷缺陷检测(自定义结构元素)

halcon——缺陷检测常用方法总结(频域空间域结合)

Python+OpenCV实现图像缺陷检测

实战 | 电感元件定位--Halcon与OpenCV实现详解(附源码)

如何用halcon检测多个圆形,并计算每个圆的面积