简体   繁体   中英

openCV: cannot detect small shapes using findContours

I'm trying to detect specific types of shapes - triangle, square, circle - in a binary image using cv2.findContours, and to color each type with differnt color. The following code works for big shapes, but it's not working for small shapes - about 10*10 px.

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.01*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) > 15: print "circle" cv2.drawContours(img,[cnt],0,(220,152,91),-1)

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

cv2.destroyAllWindows()

the image I used: before

and the result: after

I'd be very thankful if you could try to help me solve this problem!

"The second argument in cv2.approxPolyDP is called epsilon, which is maximum distance from contour to approximated contour. It is an accuracy parameter. A wise selection of epsilon is needed to get the correct output."

The Output of the same code with the following change-

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

在此处输入图片说明

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM