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

contour approximation in opencv python is giving wrong result everytime

我是图像的绝对初学者 processing.I 想检测各种不同的嵌套形状 edges.from 我的程序我已经成功地通过层次结构检测到我预期的轮廓 relation.but 我的问题出现了当我要检测 shape.for 轮廓近似值时,我在我想要的轮廓上使用 cv2.approxpolyDP() method/function 使用它的索引 number.but 每次它都会产生相同的输出,这是“1”。我不知道我在哪里 mistaking.please 看看并建议我 some.The 下面给出了代码,这些链接中也给出了要检测的图像。请帮助我...

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

检测前

检测成功

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

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

在这里你 select 一个轮廓(点列表)然后循环每个点并只用 1 个点做 approxPolyDP。你应该按照轮廓来做。所以,如果你想让它为 selected 轮廓做,你应该做:

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)