I implemented a Python script for recognizing shapes in hand drawings. However, the script recognizes more shapes than needed.
Here is an example picture:
and this is the output of the script:
Part of the code I wrote is the following:
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)
I did not post all the code because is useless. I think that I am mistaking the use of hierarchy for finding the contours. I am not such a Python expert and I did not understand that well the use of hierarchy in the contours. Does anybody have suggestions?
Change the flags of findContours so that only the external contours are retrieved. Use the RETR_EXTERNAL
flag as in the following example:
contours,hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
This should solve the problem.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With