openCV:使用findContours

时间:2017-10-09 09:58:23

标签: python opencv cv2

我正在开发一个程序,在那里我应该检测形状 - 圆形,正方形和traingles-并用不同的颜色为每种类型着色。

我使用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 :(得分:1)

我看到您修改了代码作为我的建议,如果凸性检查解决了您的问题,请关闭上一个问题。答案:

对不同的形状使用不同的epsilon值。代码中的epsilon值为0.03

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

但它可能会因轮廓的分辨率和面积而改变,所以你应该为不同的形状尝试不同的epsilon值