首页 文章

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

提问于
浏览
1

我正在尝试使用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 回答

  • 2

    "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."

    输出相同的代码,但有以下变化 -

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

    enter image description here

相关问题