Halcon缺陷檢測例項轉OpenCV實現(二) PCB印刷缺陷檢測

Color Space發表於2020-12-14

    後面連續幾周將開啟缺陷檢測專題模式,這是第二篇,上篇連結如下,敬請關注!

    Halcon缺陷檢測例項轉OpenCV實現(一)---網格缺陷檢測


    本期來用OpenCV實現Halcon中一個簡單的PCB印刷缺陷檢測例項。

    Halcon中對應的例子為pcb_inspection.hdev,源圖和結果圖如下:

圖片

圖片

    Halcon程式碼比較簡單,這裡也貼出來,短短13行:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
read_image (Image, 'pcb')dev_close_window ()get_image_size (Image, Width, Height)dev_open_window (0, 0, Width, Height, 'black', WindowHandle)dev_display (Image)* detect defects ...gray_opening_shape (Image, ImageOpening, 7, 7, 'octagon')gray_closing_shape (Image, ImageClosing, 7, 7, 'octagon')dyn_threshold (ImageOpening, ImageClosing, RegionDynThresh, 75, 'not_equal')dev_display (Image)dev_set_color ('red')dev_set_draw ('margin')dev_display (RegionDynThresh)

    實現步驟:對原圖做開運算、閉運算然後將二者結果做差,閾值提取。OpenCV的實現我們也參考上面的步驟,詳細展示說明如下:

    源圖:

圖片    (1)對源圖做開運算:

圖片

    (2)對源圖做閉運算:

圖片

    (3)開運算和閉運算做差:

圖片

    (4)對差值圖閾值處理:

圖片

    (5)對閾值圖找輪廓並標記結果:

圖片

    完整程式碼與注意事項:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
import numpy as npimport cv2
font = cv2.FONT_HERSHEY_SIMPLEX
img = cv2.imread('./pcb.png')cv2.imshow('src',img)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
k1 = np.zeros((7, 7),np.uint8)pts = np.array([[2,0],[4,0],[6,2],[6,4],[4,6],[2,6],[0,4],[0,2]],np.int32)pts = pts.reshape((-1,1,2))cv2.fillPoly(k1,[pts],(1,1,1),cv2.LINE_AA)k1[5,1] = 1k1[6,2:5] = 1
print(k1) 
opening = cv2.morphologyEx(gray, cv2.MORPH_OPEN, k1) cv2.imshow('opening',opening)
closing = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, k1) cv2.imshow('closing',closing)
diff = cv2.absdiff(opening, closing)cv2.imshow('diff',diff)
ret,thresh = cv2.threshold(diff, 80, 255, cv2.THRESH_BINARY)cv2.imshow('thresh',thresh)

contours,hierarchy = cv2.findContours(thresh, 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('meshDefects', img)cv2.waitKey(0)cv2.destroyAllWindows()

    注意Halcon程式碼中建立的是正八邊形結構元素,所以我們也模仿建立如下

  •  
  •  
  •  
  •  
  •  
  •  
k1 = np.zeros((7, 7),np.uint8)pts = np.array([[2,0],[4,0],[6,2],[6,4],[4,6],[2,6],[0,4],[0,2]],np.int32)pts = pts.reshape((-1,1,2))cv2.fillPoly(k1,[pts],(1,1,1),cv2.LINE_AA)k1[5,1] = 1k1[6,2:5] = 1

結構元素輸出如下:

圖片

為什麼用正八邊形形狀的結構元素,因為PCB的佈線圖結構和八邊形比較類似,如果換矩形結構元素,會多出更多的誤判,大家可以自己嘗試,對於結構元素的說明以前的文章以詳細說明了,這裡不做贅述,可參考

OpenCV形態學處理使用技巧與應用演示,C++ OpenCV程式碼把對應函式轉換即可。

圖片

△長按關注OpenCV與AI深度學習,獲取最新CV乾貨

 

相關文章