使用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”。这有什么理由吗?
输出: t,l,h,b,e,r,g,o,e
答案 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。
希望这有用!