2014-04-04 21 views
9

El çizimlerindeki şekilleri tanımak için bir Python betiği uyguladı. Ancak, betik gerekenden daha fazla şekil tanır.findContours için hiyerarşi kullanımı

: Burada

bir örnek resmidir:

enter image description here

ve bu komut dosyası çıktısıdır: Aşağıdaki Yazdığım kod

enter image description here

Parçasıdır

def create_graph(vertex, color): 
    for g in range(0, len(vertex)-1): 
     for y in range(0, len(vertex[0][0])-1): 
      cv2.circle(newimg, (vertex[g][0][y], vertex[g][0][y+1]), 3, (255,255,255), -1) 
      cv2.line(newimg, (vertex[g][0][y], vertex[g][0][y+1]), (vertex[g+1][0][y], vertex[g+1][0][y+1]), color, 2) 
    cv2.line(newimg, (vertex[len(vertex)-1][0][0], vertex[len(vertex)-1][0][1]), (vertex[0][0][0], vertex[0][0][1]), color, 2) 


img = cv2.imread('star.jpg') 
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 

#Remove of noise, if any 
kernel = np.ones((2, 2),np.uint8) 
erosion = cv2.erode(gray, kernel, iterations = 1) 

#Create a new image of the same size of the starting image 
height, width = gray.shape 
newimg = np.zeros((height, width, 3), np.uint8) 

#Canny edge detector 
thresh = 175 
edges = cv2.Canny(erosion, thresh, thresh*2) 

contours,hierarchy = cv2.findContours(edges, cv2.cv.CV_RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) 
for b,cnt in enumerate(contours): 
    if hierarchy[0,b,3] == -1: #<-the mistake might be here 
     approx = cv2.approxPolyDP(cnt,0.015*cv2.arcLength(cnt,True), True) 
     clr = (255, 0, 0) 
     create_graph(approx, clr) #function for drawing the found contours in the new img 
cv2.imwrite('starg.jpg', newimg) 

Ben po değildim Çünkü tüm kodlar işe yaramaz. Konturları bulmak için hiyerarşinin kullanımını karıştırdığımı düşünüyorum. Ben böyle bir Python uzmanı değilim ve hiyerarşinin konturlarda kullanıldığını çok iyi anlamadım. Herhangi bir öneri var mı?

cevap

3

FindContours öğelerini, yalnızca dış konturların alınacağı şekilde değiştirin. Aşağıdaki örnekte olduğu gibi RETR_EXTERNAL bayrağını kullanın:

contours,hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 

Bu sorunu çözmek gerekir.

İlgili konular