0

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

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”。这有什么原因吗?

在此处输入图像描述

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

4

1 回答 1

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 排序。

希望这有帮助!

于 2018-04-20T06:51:39.770 回答