opencv python findcontours что возвращает

OpenCV на python: выделение контуров

Освоив работу с цветовыми фильтрами приступим к изучению ещё одного важного инструмента машинного зрения — функции выделения контуров.

Контур объекта — это его видимый край, который отделяет объект от фона. В действительности, большинство методов анализа изображений работают именно с контурами, а не с пикселями как таковыми. Совокупность методов работы с контурами называется контурным анализом.

Возьмём в качестве подопытного изображения что-нибудь такое, где есть ярко выраженные вложенные контуры, какой-нибудь диск. И попробуем применить к нему стандартные функции OpenCV для поиска и визуализации контуров объектов.

opencv python findcontours что возвращает. Смотреть фото opencv python findcontours что возвращает. Смотреть картинку opencv python findcontours что возвращает. Картинка про opencv python findcontours что возвращает. Фото opencv python findcontours что возвращает

1. Функция OpenCV для поиска контуров findContours

В OpenCV для поиска контуров имеется функцией findContours, которая имеет вид:

кадр — должным образом подготовленная для анализа картинка. Это должно быть 8-битное изображение. Поиск контуров использует для работы монохромное изображение, так что все пиксели картинки с ненулевым цветом будут интерпретироваться как 1, а все нулевые останутся нулями. На уроке про поиск цветных объектов была точно такая же ситуация.

режим_группировки — один из четырех режимов группировки найденных контуров:

метод_упаковки — один из трёх методов упаковки контуров:

контуры — список всех найденных контуров, представленных в виде векторов;

иерархия — информация о топологии контуров. Каждый элемент иерархии представляет собой сборку из четырех индексов, которая соответствует контуру[i]:

сдвиг — величина смещения точек контура.

2. Функция OpenCV для отображения контуров drawContours

Полученные с помощью функции findContours контуры хорошо бы каким-то образом нарисовать в кадре. Машине это не нужно, зато нам это поможет лучше понять как выглядят найденные алгоритмом контуры. Поможет в этом ещё одна полезная функция — drawContours.

кадр — кадр, поверх которого мы будем отрисовывать контуры;

контуры — те самые контуры, найденные функцией findContours;

цвет — цвет контура;

толщина — толщина линии контура;

тип_линии — тип соединения точек вектора;

иерархия — информация об иерархии контуров;

макс_слой — индекс слоя, который следует отображать. Если параметр равен 0, то будет отображен только выбранный контур. Если параметр равен 1, то отобразится выбранный контур и все его дочерние контуры. Если параметр равен 2, то отобразится выбранный контур, все его дочерние и дочерние дочерних! И так далее.

сдвиг — величина смещения точек контура.

3. Программа поиска и отображения контуров

Теперь напишем программу, которая будет искать контуры предметов в кадре с пончиком. Прежде всего, следует подготовить изображение. Помним, что функция findContours работает с монохромной картинкой, и нам потребуется обработать наш пончик цветовым фильтром, чтобы сам пончик стал абсолютно белым, а фон — чёрным.

В результате работы программы мы получим пончики с выделенными внешними и вложенными границами.

opencv python findcontours что возвращает. Смотреть фото opencv python findcontours что возвращает. Смотреть картинку opencv python findcontours что возвращает. Картинка про opencv python findcontours что возвращает. Фото opencv python findcontours что возвращает

Теперь разберёмся как параметры кадр и макс_слой влияют на отображаемые контуры.

Алгоритм findContours нашел у пончиков четыре замкнутых контура. Если вывести иерархию в консоль с помощью обычного print, то мы увидим следующую таблицу:

opencv python findcontours что возвращает. Смотреть фото opencv python findcontours что возвращает. Смотреть картинку opencv python findcontours что возвращает. Картинка про opencv python findcontours что возвращает. Фото opencv python findcontours что возвращает

Вернёмся к параметрам.

При макс_слой = 0 отображается первый попавшийся контур на верхнем уровне иерархии. Такая комбинация параметров вообще нетипичная и бесполезная, она эквивалентна комбинации контур = 0, макс_слой=0.

При макс_слой = 1 отобразятся все контуры на самом верхнем уровне иерархии — это уже полезно. Так мы сможем увидеть все бублики в кадре.

Наконец, при макс_слой = 2 отобразятся контуры на верхнем уровне и все контуры на следующем уровне — то есть дырки.

Теперь наоборот, зафиксируем макс_слой = 0, и будем менять контур в диапазоне от 0 до 3.

opencv python findcontours что возвращает. Смотреть фото opencv python findcontours что возвращает. Смотреть картинку opencv python findcontours что возвращает. Картинка про opencv python findcontours что возвращает. Фото opencv python findcontours что возвращает

Чтобы самостоятельно поэкспериментировать с параметрами можно написать программу, которая добавит в окно два бегунка для изучаемых параметров. Подобное мы делали на уроке про цветовые фильтры.

К размышлению

Теперь мы можем находить контуры и отображать их прямо в картинке. Имея готовые контуры можно приступить к дальнейшему анализу, включая: поиск геометрических фигур, вычисление их координат и положения, детектирование лиц и жестов.

На следующем уроке начнем с простого — займемся поиском прямоугольников в кадре и вычислением угла их наклона.

Источник

Русские Блоги

Обнаружение контура cv2.findContours ()

По сравнению с C ++ Python подходит для создания прототипов. В этой серии статей рассказывается, как использовать графическую библиотеку OpenCV в Python, и в чем отличие от вызова соответствующей функции OpenCV в C ++. Эта статья знакомит с использованием OpenCV в Python для обнаружения и рисования контуров.

незамедлительный:

Обнаружение контура

Обнаружение контура также часто используется при обработке изображений. Интерфейс OpenCV-Python использует функцию cv2.findContours (), чтобы найти контуры обнаруженных объектов.

достигать

Использование заключается в следующем:

результат

Оригинальная картина выглядит следующим образом:

opencv python findcontours что возвращает. Смотреть фото opencv python findcontours что возвращает. Смотреть картинку opencv python findcontours что возвращает. Картинка про opencv python findcontours что возвращает. Фото opencv python findcontours что возвращает

Результаты теста следующие:

opencv python findcontours что возвращает. Смотреть фото opencv python findcontours что возвращает. Смотреть картинку opencv python findcontours что возвращает. Картинка про opencv python findcontours что возвращает. Фото opencv python findcontours что возвращает

нотаФункция Findcontours изменит входное изображение «на месте». Это можно проверить с помощью следующего утверждения:

После выполнения этих утверждений вы обнаружите, что исходное изображение было изменено.

функция cv2.findContours ()

возвращает два значения: контур: иерархия.

параметр

возвращаемое значение

возвращаемое значение контура

Поскольку мы знаем, что возвращены два силуэта, мы можем передать

и Нарисуйте два контура отдельно, пожалуйста, обратитесь к следующему разделу об этом параметре. Пройти одновременно
Выведите количество точек, сохраненных в двух контурах. Как видите, в первом контуре всего 4 элемента. Это потому, что ** контуры не хранят все контуры. Точки, но хранят только количество точек, которые могут описать контур прямой линией **, такой как «выпрямленный» прямоугольник, только 4 вершины могут описать контур.

возвращаемое значение иерархии

Кроме того, функция также может возвращать необязательный результат иерархии, который представляет собой ndarray, в котором количество элементов и количество контуров одинаковы, каждый контурный контур [i] соответствует 4 иерархическим элементам иерархии [i] [0]

Иерархия [i] [3] представляет порядковые номера следующего контура, предыдущего контура, родительского контура и встроенного контура. Если соответствующего элемента нет, значение является отрицательным.

получил
Видно, что сама иерархия содержит два ndarrays, каждый ndarray соответствует контуру, и каждый контур имеет четыре атрибута.

Контурный рисунок

OpenCV использует cv2.drawContours для рисования контуров на изображении.

функция cv2.drawContours ()

дополнение:

Я написал, что обнаружил, что статья не может быть представлена, поэтому вот введение. Существует возможность открыть еще одну статью для получения дополнительной информации о контурах.

Но друг предложил вычислить крайние точки контура. Можно рассчитать следующим образом, следующим образом

Обновление: О значении пентаграммы [:, 0]

В массиве numpy индекс оси разделяется запятыми. Например, предположим, у вас есть следующий массив:

Его форма (5, 1, 2). Это так же, как наш план. Тогда результат [:, 0]: Здесь a [:, 0] означает a [0: 5,0], который представляет собой [0: 5,0: 0: 2] Эти три эквивалентны 。

Оглядываясь назад, форма a (5,1,2) указывает на то, что она имеет три оси. В числовых массивах индексы осей разделены запятыми. В то же время индекс двоеточия «:» указывает на все элементы оси. Таким образом, [:, 0] означает все элементы первой оси и первый элемент второй оси. Здесь это эквивалентно [0: 5, 0].

Чтобы быть более подробным, все содержимое a: [[[3,4]], [[1,2]], [[5,7]], [[3,7]], [[1,8]] ]. Снимите первую квадратную скобку, Есть пять элементов, и каждый элемент [[3,4]], поэтому диапазон первого индекса равен [0: 5].Обратите внимание на разницу между многомерным массивом, возвращаемым функцией OpenCV, и обычным массивом numpy!

Наблюдая [[3,4]], мы обнаружили, что существует только один элемент, а именно [3, 4], а второй индекс равен [0: 1].

После удаления еще одного слоя квадратных скобок мы сталкиваемся с [3,4], который имеет два элемента, поэтому диапазон третьего индекса равен [0: 2].

Еще раз подчеркнем организационные различия между массивом NumPy, возвращаемым интерфейсной функцией OpenCVPython, и обычным массивом NumPy.

PS: дискуссионная группа OpenCV-Python-219962286, приглашаем всех присоединиться к нам, чтобы обсудить и поучиться друг у друга.

Полученные результаты следующие:

opencv python findcontours что возвращает. Смотреть фото opencv python findcontours что возвращает. Смотреть картинку opencv python findcontours что возвращает. Картинка про opencv python findcontours что возвращает. Фото opencv python findcontours что возвращает

Справочные материалы:

1、《Opencv2 Computer Vision Application Programming Cookbook》

2、《OpenCV References Manule》

Источник

OpenCV в Python. Часть 4

Привет, Хабр! В этой статье я бы хотел рассказать как с помощью только OpenCV распознавать объекты, на примере игральных карт:

opencv python findcontours что возвращает. Смотреть фото opencv python findcontours что возвращает. Смотреть картинку opencv python findcontours что возвращает. Картинка про opencv python findcontours что возвращает. Фото opencv python findcontours что возвращает

Введение

Допустим, у нас имеется следующее изображение с картами:

opencv python findcontours что возвращает. Смотреть фото opencv python findcontours что возвращает. Смотреть картинку opencv python findcontours что возвращает. Картинка про opencv python findcontours что возвращает. Фото opencv python findcontours что возвращает

А также у нас имеются эталонные изображения каждой карты:

opencv python findcontours что возвращает. Смотреть фото opencv python findcontours что возвращает. Смотреть картинку opencv python findcontours что возвращает. Картинка про opencv python findcontours что возвращает. Фото opencv python findcontours что возвращает

И теперь для того, чтобы детектировать каждую карту, нам необходимо написать три ключевые функции, которые:

Нахождение контуров карт

Первым аргументом в данную функцию мы передаём изображение в оттенках серого, к которому применяем гауссово размытие, для того, чтобы было легче найти контуры карт. После этого с помощью функции threshold() мы преобразуем наше серое изображение в бинарное. Данная функция принимает первым параметром изображение, вторым — пороговое значение, третьим — это максимальное значение, которое присваивается значениям пикселей, превышающим пороговое значение. Из нашего примера следует, что любое значение пикселя, превышающее 215, устанавливается равным 255, а любое значение, которое меньше 215, устанавливается равным нулю. И последним параметром передаём метод порогового значения. Мы используем THRESH_BINARY(), который указывает на то, что значения пикселей, которые больше 215 устанавливаются в максимальное значение, которое мы передали третьим параметром. Данная функция возвращает два значения, где первое — это значение, которое мы передали в данную функцию вторым аргументом, а второе — чёрно-белое изображение, которое выглядит подобным образом:

opencv python findcontours что возвращает. Смотреть фото opencv python findcontours что возвращает. Смотреть картинку opencv python findcontours что возвращает. Картинка про opencv python findcontours что возвращает. Фото opencv python findcontours что возвращает

Теперь мы можем найти контуры наших карт, где контур — это кривая, соединяющая все непрерывные точки, которые имеют одинаковый цвет. Поиск контуров осуществляется с помощью метода findContours(), где в качестве первого аргумента эта функция принимает изображение, вторым — это тип контуров, который мы хотим извлечь. Я использую cv2.RETR_EXTERNAL для извлечения только внешних контуров. К примеру, для того, чтобы извлечь все контуры используют cv2.RETR_LIST, а последний параметром мы указываем метод аппроксимации контура. Мы используем cv2.CHAIN_APPROX_SIMPLE, указывая на то, что все лишние точки будут удалены, тем самым экономя память. Например, если вы нашли контур прямой линии, то разве вам нужны все точки этой линии, чтобы представить эту линию? Нет, нам нужны только две конечные точки этой линии. Это как раз то, что и делает cv2.CHAIN_APPROX_SIMPLE.

Нахождение координат карт

Данная функция принимает контуры, которые мы нашли в предыдущей функции, а также основное изображение в оттенках серого. Первым делом мы создаём словарь, где в роли ключа будет выступать название карты, а в роли значения координаты каждой карты. Далее мы проходимся в цикле по нашим контурам, где с помощью функции boundingRect() находим ограничительные рамки каждого контура: начальные x и y координаты, за которыми следуют ширина и высота рамки. Так получилось, что функция, которая искала контура, нашла аж 31 контур, хотя карт всего 4. Это могут быть незначительные контуры, которые мы дальше сортируем в условии, исходя из размера контура.

Теперь, зная координаты контура, мы можем вырезать по этим координатам каждую карту, что собственно мы и делаем в следующей строчке кода. Далее вырезанное изображение мы передаём в функцию find_features()(о ней мы поговорим ниже), которая опираясь на ключевые точки, возвращает нам название вырезанной карты. После этого добавляем всё в словарь.

Распознавание карт

Как говорилось выше, распознавание карт будет осуществляться на основе ключевых точек. Ключевые точки — это интересные области изображения. Интересными участками называются такие участки, которые неоднородны. Например, это могут быть углы, так как там происходит резкое изменение интенсивности в двух разных направлениях. Если мы посмотрим на изображение ниже, а потом закроем глаза и попытаемся визуализировать этот образ, то мы вряд ли сможем увидеть что-то конкретное и особенное на этом изображении. Причина этого в том, что изображение не содержит никакой интересной информации:

opencv python findcontours что возвращает. Смотреть фото opencv python findcontours что возвращает. Смотреть картинку opencv python findcontours что возвращает. Картинка про opencv python findcontours что возвращает. Фото opencv python findcontours что возвращает

Теперь закройте глаза и попытайтесь представить это изображение:

opencv python findcontours что возвращает. Смотреть фото opencv python findcontours что возвращает. Смотреть картинку opencv python findcontours что возвращает. Картинка про opencv python findcontours что возвращает. Фото opencv python findcontours что возвращает

И вы увидите, что помните много деталей об этом образе. Причина этого в том, что на изображении много интересных областей. Теперь переходим к практике:

Для обнаружения ключевых точек я использую ORB, который мы инициализируем с помощью вызова функции ORB_create(), после чего мы находим ключевые точки и дискрипторы(которые кодируют интересную информацию в ряд чисел) для эталонной карты и для карты, которую мы вырезали из главного изображения. Вот, к примеру, как выглядят ключевые точки для короля:

Источник

OpenCV (findContours) Detailed Guide

OpenCV has many Image Processing features that are helpful in detecting edges, removing Noise,Threshold Image etc. One such feature that often confuses a lot of Beginners is ( findContours). In this article I will try to go to all of the topics covered in the findContours and how it can be helpful to you.

To put in simple words findContours detects change in the image color and marks it as contour. As an example, the image of number written on paper the number would be detected as contour.

opencv python findcontours что возвращает. Смотреть фото opencv python findcontours что возвращает. Смотреть картинку opencv python findcontours что возвращает. Картинка про opencv python findcontours что возвращает. Фото opencv python findcontours что возвращает

opencv python findcontours что возвращает. Смотреть фото opencv python findcontours что возвращает. Смотреть картинку opencv python findcontours что возвращает. Картинка про opencv python findcontours что возвращает. Фото opencv python findcontours что возвращает

From the above two images we can see the findContours detects differently on the same image because of how we calculated the binary image. The above one is Binary Threshold Inverted (cv2.THRESH_BINARY_INV) which shows the numbers highlighted in White and the Below image is just Binary Threshold (cv2.THRESH_BINARY)

The part that you want to detect should be white like above numbers in 1st image.

opencv python findcontours что возвращает. Смотреть фото opencv python findcontours что возвращает. Смотреть картинку opencv python findcontours что возвращает. Картинка про opencv python findcontours что возвращает. Фото opencv python findcontours что возвращает

Parameter — Mode ( RetrievalModes)

The output of RetrievalModes is array Hierarchy which shows how various contours are linked to each other, their relation with other contours, Parent Child relation

opencv python findcontours что возвращает. Смотреть фото opencv python findcontours что возвращает. Смотреть картинку opencv python findcontours что возвращает. Картинка про opencv python findcontours что возвращает. Фото opencv python findcontours что возвращает

RETR_TREE — Python: cv.RETR_TREE

opencv python findcontours что возвращает. Смотреть фото opencv python findcontours что возвращает. Смотреть картинку opencv python findcontours что возвращает. Картинка про opencv python findcontours что возвращает. Фото opencv python findcontours что возвращает

Retrieves all of the contours and reconstructs a full hierarchy of nested contours. source
Below is have shown how contours are created and its Hierarchy

Parent and Child Relationship are created as well in TREE

Источник

what are values returned by findcontour function in opencv 2.4.9

i’m using openCV 2.4.9 version and the code i was referring to had the following line: im2,contours,hier=cv2.findContours(im_th.copy(),cv2.RETR_EXTERNAL,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

opencv python findcontours что возвращает. Смотреть фото opencv python findcontours что возвращает. Смотреть картинку opencv python findcontours что возвращает. Картинка про opencv python findcontours что возвращает. Фото opencv python findcontours что возвращает

2 Answers 2

In the three parameter version of this function, it returns the additional «im2» parameter. I’ll cover contours and hierarchy returns briefly as they are well documented. The two return values depend on the two constants passed in. They are variants on the below.

Contours is a list, or tree of lists of points. The points describe each contour, that is, a vector that could be drawn as an outline around the parts of the shape based on it’s difference from a background.

Experimenting with the im2 return value

The documentation at https://docs.opencv.org/3.3.1/d4/d73/tutorial_py_contours_begin.html suggests im2 is a modified image. I’m interested in this one return value because documentation doesn’t really tell me what it does or is useful for.

Actual experimentation shows no difference. My code:

Shapes and colors is a test image from pyimagesearch:

opencv python findcontours что возвращает. Смотреть фото opencv python findcontours что возвращает. Смотреть картинку opencv python findcontours что возвращает. Картинка про opencv python findcontours что возвращает. Фото opencv python findcontours что возвращает

This is turned into a greyscale to threshold it:

opencv python findcontours что возвращает. Смотреть фото opencv python findcontours что возвращает. Смотреть картинку opencv python findcontours что возвращает. Картинка про opencv python findcontours что возвращает. Фото opencv python findcontours что возвращает

I then apply a threshold, to get a binary image:

opencv python findcontours что возвращает. Смотреть фото opencv python findcontours что возвращает. Смотреть картинку opencv python findcontours что возвращает. Картинка про opencv python findcontours что возвращает. Фото opencv python findcontours что возвращает

opencv python findcontours что возвращает. Смотреть фото opencv python findcontours что возвращает. Смотреть картинку opencv python findcontours что возвращает. Картинка про opencv python findcontours что возвращает. Фото opencv python findcontours что возвращает

There is no visible difference. Perhaps a sophisticated image diff algorithm could find something I can’t. I realise these are lossy JPG’s which may confound that. So far, I can’t see that the im2 return value serves much of a purpose, but that contours and hierarchy are definitely useful.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *