OpenCV findContours не в порядке
При использовании 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
1 ответ
Если вы внимательно наблюдаете страницу иерархии Opencv Contours, прикрепив ее ссылку: https://docs.opencv.org/3.4.0/d9/d8b/tutorial_py_contours_hierarchy.html
Вы заметите, что в зависимости от иерархии и от того, что вы используете порядок сохраненных контуров (в вашем случае t l h b ... и т. Д.), Они будут различаться. Сначала будут обрабатываться контуры, у которых нет дочернего элемента, а затем контуры с дочерним.,
Но если вы выберете иерархию, например, RETR_CCOMP, она начнет принимать контуры от самой глубины до контуров без дочерних элементов.
Если вы выбрали иерархию вроде RETR_TREE, то сначала берется контур с максимальным количеством дочерних элементов.
Таким образом обрабатывается контур, а не в соответствии с координатами x,y. Если вы хотите вывести такую последовательность, вы должны получить центроид и перейти к сортировке по x,y.
Надеюсь, что это полезно!