Рисование контура в определенной области изображения и нахождение самого внешнего контура в opencv-python

#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) находится в верхнем левом углу изображения.