openCV:使用findContours无法检测小形状

时间:2017-10-08 07:40:31

标签: python opencv

我正在尝试使用cv2.findContours在二进制图像中检测特定类型的形状(三角形,正方形,圆形),并使用不同颜色为每种类型着色。 以下代码适用于大型形状,但它不适用于小型形状 - 大约10 * 10像素。

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()

我使用的图片:before

结果:after

如果你能帮我解决这个问题,我将非常感激!

1 个答案:

答案 0 :(得分:2)

“cv2.approxPolyDP中的第二个参数称为epsilon,它是从轮廓到近似轮廓的最大距离。它是一个精度参数。需要明智的选择epsilon才能获得正确的输出。”

输出相同的代码,并进行以下更改 -

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

enter image description here