2017-03-05 32 views
0

我正在研究一個程序,以查找在我製作的部分卡住的碎片。到目前爲止,我已經能夠獲得一個乾淨的部分和一個芯片的一部分,並減去兩個圖像,留下二者之間的差異作爲二進制圖像。我不明白的是如何檢測二進制圖像中的這個項目。到目前爲止,我使用了SimpleBlobDetector函數,但我必須對圖像進行模糊處理才能使其工作,我擔心它不能用於較小的碎片。我希望能夠在沒有大量模糊的情況下檢測原稿。任何幫助,將不勝感激。代碼和圖像如下。Opencv二進制項目檢測

import cv2 
import numpy as np 

#Load Images 
tempImg = cv2.imread('images/partchip.jpg') 
lineImg = cv2.imread('images/partnochip.jpg') 

#Crop Images 
cropTemp = tempImg[460:589, 647:875] 
cropLine = lineImg[460:589, 647:875] 

#Gray Scale 
grayTemp = cv2.cvtColor(cropTemp,cv2.COLOR_BGR2GRAY) 
grayLine = cv2.cvtColor(cropLine,cv2.COLOR_BGR2GRAY) 

#Subtract Images 
holder = cv2.absdiff(grayTemp,grayLine) 

#THreshold Subtracted Image 
th, imgDiff = cv2.threshold(holder, 160, 255, cv2.THRESH_BINARY_INV) 

#Blur Image 
#blur = imgDiff 
blur = cv2.blur(imgDiff,(20,20)) 

#Detect Blobs 
detector = cv2.SimpleBlobDetector_create() 
blob = detector.detect(blur) 


imgkeypoints = cv2.drawKeypoints(blur, blob, np.array([]), (0,255,0), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) 
originalWithPoints=cv2.drawKeypoints(cropTemp, blob, np.array([]), (0,255,0), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) 

cv2.namedWindow("Template", cv2.WINDOW_NORMAL) 
cv2.namedWindow("Line", cv2.WINDOW_NORMAL) 
cv2.namedWindow("Difference", cv2.WINDOW_NORMAL) 

cv2.resizeWindow("Template", 500, 300) 
cv2.resizeWindow("Line", 500, 300) 
cv2.resizeWindow("Difference", 500, 300) 


cv2.imshow('Template',originalWithPoints) 
cv2.imshow('Line',cropLine) 
cv2.imshow('Difference',imgkeypoints) 


cv2.waitKey(0) 
cv2.destroyAllWindows() 

Part with chip Part with No Chip

+0

你能上傳正在使用的圖像嗎? –

+0

只是,他們鏈接下面的代碼 – shark38j

+0

但你似乎沒有(視覺)之間的差異,你已經上傳的兩幅圖片 – ZdaR

回答

1

我用你的代碼,以查找異常。我在imgDiff二值圖像上獲得了具有最大面積的輪廓。使用該功能,我可以將它與一個矩形綁定。

enter image description here

我希望這是你在找什麼....

編輯:

注:

我曾與下面的代碼一起解釋的過程:使用cv2.bitwise_not(imgDiff)反轉您的imgDiff,因爲如果對象是白色,則會找到輪廓。

#---Finding the contours present in 'imgDiff'--- 
_, contours,hierarchy = cv2.findContours(imgDiff,2,1) 

ff = 0 #----to determine which contour to select--- 
area = 0 #----to determine the maximum area--- 
for i in range(len(contours)): 
    if(cv2.contourArea(contours[i]) > area): 
     area = cv2.contourArea(contours[i]) 
     ff = i 

#---Bounding the contour having largest area--- 
x,y,w,h = cv2.boundingRect(contours[ff]) 
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2) 
cv2.imshow('fin.jpg',img) 
+0

Jeru,你可以爲此發佈代碼嗎?這正是我想要做的,但我不知道如何找到最大的區域。再次感謝!!! – shark38j