2017-10-09 121 views
-1

我正在研究一個程序,我應該檢測形狀 - 圓形,正方形和traingles - 並用不同的顏色爲每種類型着色。openCV:無法正確檢測形狀使用findContours

我使用cv2.findCountours,然後cv2.approxPolyDP來檢測每個形狀。

這是我的代碼:

import numpy as np 
import cv2 

img = cv2.imread('1.jpg') 
gray = cv2.imread('1.jpg',0) 

ret,thresh = cv2.threshold(gray,127,255,1) 

contours,h = cv2.findContours(thresh,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_NONE) 

for cnt in contours: 
    approx = cv2.approxPolyDP(cnt, 0.03 * cv2.arcLength(cnt, True), True) 
    print len(approx) 
    if len(approx)==3: 
     print "triangle" 
     cv2.drawContours(img,[cnt],0,(122,212,78),-1) 
    elif len(approx)==4: 
     print "square" 
     cv2.drawContours(img,[cnt],0,(94,234,255),-1) 
    elif len(approx) == 8: 
     k = cv2.isContourConvex(approx) 
     if k: 
      cv2.drawContours(img, [cnt], 0, (220, 152, 91), -1) 


cv2.imshow('img',img) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

它檢測到我所提到的形狀,但它檢測以及形狀,這是不是圓/三角形/平方米,並提出他們,因爲他們是。

這是我所使用的圖像:1

輸出:2

任何建議如何解決這個問題呢? 我可以添加哪些考試?

謝謝!

回答

1

我看到你修改你的代碼作爲我的建議,如果凸性檢查解決了你的問題,請關閉上一個問題。對於答案:

對不同的形狀使用不同的epsilon值。 ε - 值是在你的代碼

approx = cv2.approxPolyDP(cnt, 0.03 * cv2.arcLength(cnt, True), True) 

0.03,但可以通過輪廓的分辨率和麪積變化,所以你應該嘗試不同的形狀

不同小量值