opencv python中的轮廓近似每次给出错误的结果

时间:2017-11-14 09:24:14

标签: python opencv approximation opencv-contour

我是图像处理的绝对初学者。我想在各种不同的边缘中检测到嵌套的形状。从我的程序中,我已经通过层次关系成功地检测到了我的预期轮廓。但是当我要检测形状时,我的问题出现了。 。对于轮廓近似,我使用cv2.approxpolyDP()方法/函数在我想要的轮廓上使用它的索引号。但是每次它产生相同的输出,这是" 1"。我不&# 39;知道我在哪里错了。请看一下并给我一些建议。下面给出了代码,并且在这些链接中也给出了要检测的图像。请帮帮我......

import cv2
import numpy as np
maxx=0
original_color=cv2.imread("tri.jpg",1)
original=cv2.cvtColor(original_color,cv2.COLOR_BGR2GRAY)
#cv2.imshow("original",original)
blur=cv2.GaussianBlur(original,(5,5),0)
ret,thresh=cv2.threshold(blur,50,255,cv2.THRESH_BINARY)
edges = cv2.Canny(thresh,100,200)
image,contours,hierarchy=cv2.findContours(edges.copy(),cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
print len(contours)
##for c in range(0,len(hierarchy)) :
##    a=zip(hierarchy[c],contours[c])

for i in range(0,len(hierarchy[0])):
    if hierarchy[0][i][2]>=maxx :
         if(hierarchy[0][i][3]==(hierarchy[0][i][2]-2)):
             maxx=hierarchy[0][i][2]
             index=i
cnt=contours[index]
for c in cnt :
    peri=cv2.arcLength(c,True)
    approx=cv2.approxPolyDP(c,0.04*peri,True)
print hierarchy
print maxx
print len(approx)

cv2.drawContours(original_color,contours,index,(0,255,0),3)
cv2.imshow("Show",original_color)
cv2.waitKey()
cv2.destroyAllWindows()

检测前

before detection

成功检测到

successfully detected

1 个答案:

答案 0 :(得分:0)

findContours的结果是一个点列表列表,这意味着问题在于:

cnt=contours[index]
for c in cnt :
    peri=cv2.arcLength(c,True)
    approx=cv2.approxPolyDP(c,0.04*peri,True)

在这里,您选择一个轮廓(pointS列表),然后循环每个点,并仅使用1个点执行approxPolyDP。你应该做到轮廓。因此,如果您希望它为选定的轮廓进行,您应该:

cnt=contours[index]
peri=cv2.arcLength(cnt,True)
approx=cv2.approxPolyDP(cnt,0.04*peri,True)

如果你想为每个轮廓做这样的事情,那么这样做(将打印保留在循环中,如果不是,它将只显示最后一个):

for c in contours:
    peri=cv2.arcLength(c,True)
    approx=cv2.approxPolyDP(c,0.04*peri,True)
    print len(approx)