Ещё одного важного инструмента машинного зрения — функции выделения контуров. Контур объекта — это его видимый край, который отделяет объект от фона. В OpenCV конечно же есть такая функция.
Функция OpenCV для поиска контуров findContours() .
findContours( кадр, режим_группировки, метод_упаковки)
- кадр — картинка где мы будем искать контуры.
- режим_группировки — один из четырех режимов группировки найденных контуров: CV_RETR_LIST — выдаёт все контуры без группировки; CV_RETR_EXTERNAL — выдаёт только крайние внешние контуры; CV_RETR_CCOMP — группирует контуры в двухуровневую иерархию. На верхнем уровне — внешние контуры объекта. На втором уровне — контуры отверстий, если таковые имеются. Все остальные контуры попадают на верхний уровень; CV_RETR_TREE — группирует контуры в многоуровневую иерархию.
- метод_упаковки — один из трёх методов упаковки контуров: CV_CHAIN_APPROX_NONE — упаковка отсутствует и все контуры хранятся в виде отрезков, состоящих из двух пикселей; CV_CHAIN_APPROX_SIMPLE — склеивает все горизонтальные, вертикальные и диагональные контуры; CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS — применяет к контурам метод упаковки (аппроксимации) Teh-Chin.
Так же есть и функция для отображения контуров drawContours() )))))
drawContours( кадр, контуры, индекс, цвет[, толщина[, тип_линии[, иерархия[, макс_слой[, сдвиг]]]]])
- контуры — те самые контуры, найденные функцией findContours() ;
- индекс — индекс контура, который следует отобразить. -1 — если нужно отобразить все контуры;
- иерархия — информация об иерархии контуров; иерархия — информация о топологии контуров. Каждый элемент иерархии представляет собой сборку из четырех индексов, которая соответствует контуру[i] ;
- макс_слой — индекс слоя, который следует отображать. Если параметр равен 0, то будет отображен только выбранный контур. Если параметр равен 1, то отобразится выбранный контур и все его дочерние контуры. Если параметр равен 2, то отобразится выбранный контур, все его дочерние и дочерние дочерних.
Type of the line:
- LINE_8 (or omitted) — 8-connected line.
- LINE_4 — 4-connected line.
- LINE_AA — antialiased line.
Для наглядности запускаем данный код :
import numpy as np import cv2 as cv # параметры цветового фильтра hsv_min = np.array((59, 119, 17), np.uint8) hsv_max = np.array((79, 255, 255), np.uint8) img = cv.imread("gren_33.jpg") hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV ) # меняем цветовую модель с BGR на HSV thresh = cv.inRange(hsv, hsv_min, hsv_max ) # применяем цветовой фильтр # ищем контуры и складируем их в переменную contours contours, hierarchy = cv.findContours(thresh.copy(), cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE) # hierarchy хранит информацию об иерархии # отображаем контуры поверх изображения cv.drawContours(img, contours, -1, (255, 0, 0), 2, cv.LINE_AA, hierarchy, 0) cv.imshow('contours', img) cv.drawContours(img, contours, -1, (255, 0, 0), 2, cv.LINE_AA, hierarchy, 2) # выводим итоговое изображение в окно cv.imshow('All_con', img) cv.imshow('thresh', thresh) cv.waitKey() cv.destroyAllWindows()
