2017-10-09 10 views
-1

私は、形を検出する必要があるプログラムで作業しています - 円形と四角形と小文字 -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

凸凹チェックによって問題が解決された場合は、私の提案と同じコードを修正しています。答え:

異なる形状の異なるイプシロン値を使用してください。イプシロン値は、あなたのコード内の0.03

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

あるしかし、あなたは異なる形状

に異なるイプシロン値を試す必要がありますので、それは、輪郭の解像度や面積によって変更される可能性があり
関連する問題