OpenCV, машинное зрение на python: выделение контуров. Часть 2

Ещё одного важного инструмента машинного зрения — функции выделения контуров. Контур объекта — это его видимый край, который отделяет объект от фона. В 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()