OpenCV findContours不按顺序排列

时间:2016-09-05 15:08:48

标签: python opencv opencv3.0 opencv-contour

使用OpenCV findContours方法时,为什么没有按顺序找到轮廓?

inputImage = cv2.imread("randomImage.jpg",0)

im2, contours, hierarchy = cv2.findContours(inputImage.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

j=1

for cnt in reversed(contours):

    letter = inputImage[y:y+h, x:x+w]
    cv2.imwrite(str(j)+"sub/"+str(k)+'.png', letter) 
    k+=1

输入图像由几个字母组成,例如“abcde”。但是,当轮廓保存到文件时,它们以随机顺序保存,如“c”,“e”,“d”,“a”,“b”。这有什么理由吗?

enter image description here

输出: t,l,h,b,e,r,g,o,e

1 个答案:

答案 0 :(得分:1)

如果您仔细观察Opencv Contours层次结构页面,请附上它的链接:https://docs.opencv.org/3.4.0/d9/d8b/tutorial_py_contours_hierarchy.html

您将观察到,根据层次结构和您使用存储的轮廓的顺序(在您的情况下tlhb ...等等)将有所不同。它将处理没有孩子的轮廓然后轮廓生个孩子。

但是如果您选择一个层次结构,例如RETR_CCOMP,它将开始从最深处到轮廓的轮廓,最后没有孩子。

如果您选择了像RETR_TREE这样的层次结构,则首先获取具有最大子项数的轮廓。

这就是如何处理轮廓而不是根据x,y坐标。如果你想输出这样一个序列,你应该得到一个质心,然后选择x,y sort。

希望这有用!