Cheloved
@Cheloved
Good man

Как сохранить контуры слева направо?

Есть программа, которая обрезает изображение по контурам. Но при сохранении обрезанные объекты сохраняются в случайном порядке. Как сделать, чтобы они сохранялись последовательно?

import cv2
image = cv2.imread("C:/Users/pikro/PycharmProjects/CV/20.png")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edged = cv2.Canny(image, 10, 250)
_, cnts, _ = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
idx = 0

for c in cnts:
    x, y, w, h = cv2.boundingRect(c)
    if w > 20 and h > 20:
        idx += 1
        new_img = image[y:y + h, x:x + w]
        cv2.imwrite(str(idx) + '.png', new_img)
cv2.imshow("im", image)
cv2.waitKey(0)


5d9f1353af09c246877050.png

Результат:
5d9f138fdea87282517443.png
5d9f13b51ab61047561339.png
5d9f13b92d922276411529.png
5d9f13bd285b8446232857.png
  • Вопрос задан
  • 194 просмотра
Решения вопроса 1
@o5a
cv2.boundingRect же выдает координату x прямоугольника каждого контура. Просто отсортировать по ней. Примерно так:
rects = sorted([cv2.boundingRect(c) for c in cnts], key=lambda x: x[0])

for x,y,w,h in rects:
    # и далее как есть. x, y, w, h = cv2.boundingRect(c) соответственно убрать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@D3Nd3R
Найдите центры boundingRect и отсортируйте по X.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы