2017-02-14 169 views
1

對於一個學校項目,我試圖用python和opencv來識別視頻截圖中的六邊形形狀。問題是,當我使用這段代碼時,它永遠找不到六邊形。我沒有找到它不工作的原因,所以我希望有人能幫助我。python opencv形狀檢測

代碼:

import numpy as np 
import cv2 

stop_cascade = cv2.CascadeClassifier('cascade.xml') 

cap = cv2.VideoCapture(0) 

while(True): 
    ret, img = cap.read() 
    lower = np.array([0,0,0]) 
    upper = np.array([20,20,20]) 
    mask = cv2.inRange(img, lower, upper) 
    contours, h = cv2.findContours(mask, 1, 2) 
    contours.sort(key = len) 

    for contour in contours[-3:]: 
     approx = cv2.approxPolyDP(contour,0.1*cv2.arcLength(contour,True),True) 
     if len(approx) == 6: 
      print "hexagon" 

    cv2.imshow('image', mask) 

    if cv2.waitKey(1) & 0xFF == ord('q'): 
     break 

cap.release() 
cv2.destroyAllWindows() 

在此先感謝

編輯: 要成爲一個更具體一點。我試過多個不同的六邊形,但是當我打印len(大約)時,它不會高​​於4.這是我的對象中的錯誤,還是我在找到我不知道的輪廓時出錯?

+0

你在調試程序的過程中做了什麼,而不是說「我沒有找到它不工作的原因,所以我希望有人能幫助我?」請有一個*特定的*問題,而不是「請調試這個...」 – blacksite

+0

我很抱歉不夠具體。我所做的調試代碼是在相機前面放置不同的六邊形形狀,而程序打印出len(大約),但它從未顯示過高於4的數字。我這樣做是因爲我的對象(六進製紙上的圖像)還是我在尋找輪廓方面的錯誤? – Nerdeose

+0

你可以附加樣本輸入嗎? – ZdaR

回答

0

看起來像你的程序正在簡化輪廓超出你想要的。所以approxPolyDP是進一步簡化你的六角形到正方形或三角形。這也可以解釋爲什麼LEN(約)永遠不會返回一個值大於4.嘗試改用小量你傳遞給approxPolyDP的價值。這些都是變化,我建議:

  1. 嘗試使用範圍小量值的approxPolyDP。將0.1*cv2.arcLength(contour,True)中的倍增因子從0.01改爲0.1
  2. 使用drawContours實際顯示大約曲線。這將幫助你選擇最好的倍增因數

另一種方法是使用六邊形而非輪廓的凸包,然後應用approxPolyDP功能。理想情況下,如果圖像足夠清晰,只需檢查凸包中的點數就足以告訴您圖形是否爲六邊形。進一步簡化船體應該可以幫助您對噪點圖像更加健壯。但是再次選擇正確的倍增因子將很重要。