#python #opencv #hierarchy #contour
#python #opencv #иерархия #контур
Вопрос:
Мой код выбирает кадр из видео, который затем вычитается с фоновым кадром, выбранным из того же видео. Затем он преобразуется в оттенки серого, размывается, а затем применяется пороговое значение изображения. Затем рисуется контур, который выводит это изображение. Однако я хотел бы иметь только самый внешний контур, а также не иметь никаких контуров, нарисованных выше y = 500. Как я могу это реализовать?
Контурный код:
contours, hierarchy = cv2.findContours(tframe,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
image = cv2.drawContours(sampleframe, contours, -1, (0, 255, 0), 2)
Я пробовал использовать cv2.dilate
, который работает при условии достаточной итерации для удаления внутренних контуров, но итерация приводит к переоценке контура, что нежелательно.
Комментарии:
1. Используйте cv2.RETR_EXTERNAL вместо cv2.RETR_TREE
2. @fmw42 Это сработало отлично! Спасибо. Просто нужно выяснить, как избавиться от того, что указано выше
y=500
3. Я не уверен, какой именно, но вы можете фильтровать по площади или периметру.
Ответ №1:
Если вы отфильтруете контуры по размеру их площади, то сможете сохранить самый большой контур. пожалуйста, проверьте эту ссылку: https://docs.opencv.org/3.4/dd/d49/tutorial_py_contour_features.html
И для второй проблемы вы можете обрезать рамку по оси y, чтобы она была меньше 500.
Комментарии:
1. Мне удалось отсортировать его по площади , но это не всегда будет работать , так как центральный контур может иметь площадь меньше указанной выше
y=500
. Как я могу вырезать рамку по оси y, как вы уже упоминали?2. Просто используя NumPy slicing, например:
tframe = tframe[0:500:, :]
, чтобы выполнить эту работу, обратите внимание, что начало координат изображения (т. Е. x = 0, y = 0) находится в верхнем левом углу изображения.