Разное

Opencv canny: OpenCV: Canny Edge Detector

Содержание

Детектор границ Канни / Хабр

Доброго времени суток!

Последнее время, на Хабре часто стал упоминаться алгоритм выделения границ Канни (который, к моему удивлению, переводится дословно: хитрый). Итак, я созрел поделиться с общественностью своим опытом реализации этого детектора.


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

Чтобы с одной стороны, упростить кодирование, а с другой – придать повествованию нотки brainfuck-программирования, я покажу реализацию в среде компьютерной алгебры Mathcad (алгоритмы протестированы в версиях 13 и 14), с как можно меньшим использованием специфических встроенных методов. Подобный поход, на мой взгляд, улучшает восприятие демонстрации, и облегчает возможный перенос алгоритмов в другие среды проектирования/разработки. Следует отметить, что некоторые этапы работы детектора Канни могут подразумевать не только различную оптимизацию (например, программная реализация оператора Собеля с использованием SIMD-расширения системы команд процессора), но и возможность замены одних операторов (методов) другими (например, оператор Собеля может быть заменён оператором Робертса или Прюитта), и возможность варьирования коэффициентов, задающих параметры работы операторов.

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

Выделение границ Канни

Канни (John F. Canny; 1953 г.) изучил математическую проблему получения фильтра, оптимального по критериям выделения, локализации и минимизации нескольких откликов одного края. Это означает, что детектор должен реагировать на границы, но при этом игнорировать ложные, точно определять линию границы (без её фрагментирования) и реагировать на каждую границу один раз, что позволяет избежать восприятия широких полос изменения яркости как совокупности границ. Канни ввел понятие Non-Maximum Suppression (подавление не-максимумов), которое означает, что пикселями границ объявляются точки, в которых достигается локальный максимум градиента в направлении вектора градиента.
Хотя его работа была проведена на заре компьютерного зрения (1986 г. ), детектор границ Канни до сих пор является одним из лучших детекторов. Кроме особенных частных случаев трудно найти детектор, который бы работал существенно лучше, чем детектор Канни.

Задача

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

Алгоритм состоит из пяти отдельных шагов:

  1. Сглаживание. Размытие изображения для удаления шума.
  2. Поиск градиентов. Границы отмечаются там, где градиент изображения приобретает максимальное значение.
  3. Подавление не-максимумов. Только локальные максимумы отмечаются как границы.
  4. Двойная пороговая фильтрация. Потенциальные границы определяются порогами.
  5. Трассировка области неоднозначности. Итоговые границы определяются путём подавления всех краёв, несвязанных с определенными (сильными) границами.

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

Преобразование в оттенки серого

Для преобразования исходного изображения в изображение в градациях серого, необходимо получить его «яркость»-составляющую. Для этого удобно представить изображение в цветовой модели YUV (или HSL, HSV, других).
Изначально рисунок представлен в RGB цветовой модели, причём функция загрузки возвращает три компонента в виде одной матрицы.

Для перевода изображения в модель YUV выполним следующие операции.
Получим матрицы, описывающие компоненты модели (R,G,B):

Рассчитаем Y-компоненту YUV модели:

Коэффициенты перевода (они постоянны и определяются особенностями человеческого восприятия, а ведь именно с позиции человека мы здесь оцениваем границы):

Результат преобразования:

Сглаживание

Для подавления шума, воспользуемся размытием изображения фильтром Гаусса.
Функция Гаусса для двумерного случая:

Метод, составляющий ядро фильтра размером size с параметром σ:

Процедура, применения фильтра с ядром размера size и параметром σ к матрице изображения Matrix:

Необходимо выбрать параметры фильтра, обеспечивающие наилучшее подавление шума. Влияние пикселей друг на друга при гауссовой фильтрации обратно пропорционально квадрату расстояния между ними: коэффициент пропорциональности, а, следовательно, и степень размытия, определяются параметром σ. Чрезмерное повышение коэффициента приведёт к усилению усреднения вплоть до равномерно чёрного цвета всех пикселей:

Выберем σ=1.0.
Ядро фильтра очень быстро убывает к нулю при удалении от точки (0, 0), и потому на практике можно ограничиться сверткой с окном небольшого размера вокруг (0, 0) (например, руководствуясь правилом трёх сигм, возьмём радиус окна равным 3σ). Ниже представлен результат применения фильтра с фиксированным значением параметра σ, и разным размером ядра (параметром size).

Выберем size=7. Результат применения фильтра с выбранными параметрами изображён на рисунке выше.

Поиск градиентов

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

Реализация (сопоставляет каждой точке вектор градиента):

Угол вектора квантуется по 45° — именно такие значения необходимы для одного из следующих этапов.
На рисунке ниже показан результат применения оператора к размытому (А) и исходному (в градациях серого) изображению (Б).

Подавление не-максимумов

Пикселями границ объявляются пиксели, в которых достигается локальный максимум градиента в направлении вектора градиента. Значение направления должно быть кратно 45°.

Принцип подавления проиллюстрирован на рисунке выше. Почти все пиксели в примере «имеют ориентацию вверх», поэтому значение градиента в этих точках будет сравнено с ниже- и вышерасположенными пикселями. Обведённые белым контуром пиксели останутся в результирующем изображении, остальные – будут подавлены.
Реализация проверки точки на принадлежность изображению:

Сравнение значения:

Реализация подавления:

После подавления не-максимумов, края стали более точными и тонкими.

Ниже, на первом рисунке, представлено векторное поле градиентов (углы кратны 45°) всего исходного (то есть, до подавления) изображения, а на втором – небольшого фрагмента.

Двойная пороговая фильтрация

Следующий шаг — применение порога, чтобы определить находится или нет граница в данной точке изображения. Чем меньше порог, тем больше границ будет находиться, но тем более восприимчивым к шуму станет результат, выделяя лишние данные изображения. Наоборот, высокий порог может проигнорировать слабые края или получить границу фрагментами.
Выделение границ Канни использует два порога фильтрации: если значение пикселя выше верхней границы – он принимает максимальное значение (граница считается достоверной), если ниже – пиксель подавляется, точки со значением, попадающим в диапазон между порогов, принимают фиксированное среднее значение (они будут уточнены на следующем этапе).
Реализация:

Результат применения с порогами 55% и 60% от диапазона приведён на рисунке далее.

Трассировка области неоднозначности

Упрощённо, задача сводится к выделению групп пикселей, получивших на предыдущем этапе промежуточное значение, и отнесению их к границе (если они соединены с одной из установленных границ) или их подавлению (в противном случае). Пиксель добавляется к группе, если он соприкасается с ней по одному из 8-ми направлений.
Реализация:

Результат трассировки:

Список источников

В процессе разработки я использовал следующие источники (главным образом, [1]):

  1. Canny Edge Detection www. cvmt.dk/education/teaching/f09/VGIS8/AIP
  2. Википедия. Edge detection en.wikipedia.org/wiki/Edge_detection
  3. Википедия. Оператор Собеля ru.wikipedia.org/wiki/Оператор_Собеля
  4. Алгоритмические основы растровой графики www.intuit.ru/department/graphics/rastrgraph/8/rastrgraph_8.html

Буду рад критике и замечаниям, так как область машинного зрения не связана с моей профессиональной деятельностью.

upd А вот и критика. Спасибо andreyivanoff за указание на принципиальные ошибки в алгоритме и ссылке на статью (тут).

upd2 andreyivanoff даёт важные комментарии к алгоритму тут.

OpenCV, Машинное зрение на Python: Поиск лица на фото. Часть 4

Вот мы с вами и подошли к самому интересному. К поиску лица\лиц на фото или в видеопотоке. Для поиска мы будем использовать Каскад Хаара.

Каскад Хаара — способ обнаружения объектов на изображении, основанный на машинном обучении, идея которого была была предложена в статье за авторством Пола Виолы (Paul Viola) и Майкла Джонса (Michael Jones). Обученный каскад Хаара, принимая на вход изображение, определяет, есть ли на нем искомый объект, т.е. выполняет задачу классификации, разделяя входные данные на два класса (есть искомый объект, нет искомого объекта) . Собственно сам алгоритм работы сводиться к тому что есть Признак Хаара (набором прямоугольных областей) которые проходят по изображению и находят искомый объект. Я не очень силен в объяснение теория, кому интересны подробности ищем в интернете.

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

pip install opencv-python # Только основные методы
pip install opencv-contrib-python # Все методы если не ошибаюсь
import cv2

faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FPS, 24) # Чистота кадров

while True:
    ret, img = cap.read()
    gray = cv2. cvtColor(img, cv2.COLOR_BGR2GRAY)

    faces = faceCascade.detectMultiScale(
        gray,               #
        scaleFactor=1.2,    #
        minNeighbors=5,     #
        minSize=(20, 20)    #
    )

    for (x, y, w, h) in faces:
        cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
    cv2.imshow("camera", img)
    if cv2.waitKey(10) == 27:  # Esc key
        break
cap.release()
cv2.destroyAllWindows()

faceCascade = cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’) .

Собственно этой командой мы загружаем уже обученные классификаторы haarcascade_frontalface_default.xml . Взять их можно с нашего сайта или Github OpenCV.

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Переводим изображение в серый цвет, алгоритм лучше работает с черно-белым изображением.

faces = faceCascade.detectMultiScale(
gray, #
scaleFactor=1. 2, #
minNeighbors=5, #
minSize=(20, 20) #
)

Это функция поиска лиц.

  • scaleFactor=1.2 — Параметр, указывающий, на сколько уменьшается размер изображения при каждом масштабе изображения. Он используется для создания масштабной пирамиды.
  • minNeighbors=5 — Параметр, указывающий, сколько соседей должен иметь каждый прямоугольник-кандидат для его сохранения. (чем выше , тем больше точность).
  • minSize=(20, 20) — Минимально возможный размер объекта. Объекты меньшего размера игнорируются.

for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)

Рисуем прямоугольники во круг найденого лица.

Конечно бывают ложные срабатывания или наоборот не видет лицо алгоритм. Можно попробовать другие классификаторы, поиграться с параметрами. Все очень сильно зависит от освещения и т. д. Для более точного распознавания прибегают к разнообразным методам нормализации изображения.

Например нормализовать среднеквадратическое отклонение. Это необходимо для того, чтобы разница в освещенности на фотографиях оказывала минимум влияния на результат классификации.

Давайте добавим поиск глаз :

import cv2

faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# Загружаем каскады для глаз.
eyeCascade = cv2.CascadeClassifier('haarcascade_eye.xml')

img = cv2.imread('semia.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

faces = faceCascade.detectMultiScale(
        gray,               #
        scaleFactor=1.2,    # Находим лица на фото
        minNeighbors=4,     #
        minSize=(20, 20)    #
    )

for (x, y, w, h) in faces:
    roi_gray = gray[y:y + h, x:x + w] # Вырезаем область с лицами
    roi_color = img[y:y + h, x:x + w]
    cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
    eyes = eyeCascade. detectMultiScale(
        roi_gray,              #
        scaleFactor=1.2,       # Ищем глаза в области с лицом
        minNeighbors=4,
        minSize=(5, 5),
    )
    for (ex, ey, ew, eh) in eyes:
        cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)  # Рисуем область глаз

cv2.imshow("camera", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

OpenCV: шпаргалка — PYTHON

Что такое OpenCV?

Библиотека компьютерного зрения и машинного обучения с открытым исходным кодом. В неё входят более 2500 алгоритмов, в которых есть как классические, так и современные алгоритмы для компьютерного зрения и машинного обучения. Эта библиотека имеет интерфейсы на различных языках, среди которых есть Python (в этой статье используем его), Java, C++ и Matlab.

Содержание

Установка

Инструкцию по установке на Windows можно посмотреть здесь, а на Linux — здесь.

Импорт и просмотр изображения


import cv2
image = cv2.imread("./путь/к/изображению.расширение")
cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Примечание:
При чтении способом выше изображение находится в цветовом пространстве не RGB (как все привыкли), а BGR. Возможно, в начале это не так важно, но как только вы начнёте работать с цветом — стоит знать об этой особенности. Есть 2 пути решения:

  1. Поменять местами 1-й канал (R — красный) с 3-м каналом (B — синий), и тогда красный цвет будет (0,0,255), а не (255,0,0).
  2. Поменять цветовое пространство на RGB:
    
    rgb_image = cv2. cvtColor(image, cv2.COLOR_BGR2RGB)
    

И тогда в коде работать уже не с image, а с rgb_image.

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


import cv2
def viewImage(image, name_of_window):
    cv2.namedWindow(name_of_window, cv2.WINDOW_NORMAL)
    cv2.imshow(name_of_window, image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

Кадрирование

Кадрирование — оригинальное изображениефПёсик после кадрирования


import cv2
cropped = image[10:500, 500:2000]
viewImage(cropped, "Пёсик после кадрирования")

Где image[10:500, 500:2000] — это image[y:y + высота, x:x + ширина].

Изменение размера

Изменение размера — исходное изображениеИзменение размера на 20%


import cv2
scale_percent = 20 # Процент от изначального размера
width = int(img. shape[1] * scale_percent / 100)
height = int(img.shape[0] * scale_percent / 100)
dim = (width, height)
resized = cv2.resize(img, dim, interpolation = cv2.INTER_AREA)
viewImage(resized, "После изменения размера на 20 %")

Эта функция учитывает соотношение сторон оригинального изображения. Другие функции изменения размера изображений можно увидеть здесь.

Поворот

Фото Джонатана Мейера из Pexels.Пёсик после поворота на 180 градусов.


import cv2
(h, w, d) = image.shape
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, 180, 1.0)
rotated = cv2.warpAffine(image, M, (w, h))
viewImage(rotated, "Пёсик после поворота на 180 градусов")

image.shape возвращает высоту, ширину и каналы. M — матрица поворота — поворачивает изображение на 180 градусов вокруг центра. -ve — это угол поворота изображения по часовой стрелке, а +ve, соответственно, против часовой.

Перевод в градации серого и в чёрно-белое изображение по порогу

Оригинал: PexelsГрадации серогоЧёрно-белое. Порог


import cv2
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret, threshold_image = cv2.threshold(im, 127, 255, 0)
viewImage(gray_image, "Пёсик в градациях серого")
viewImage(threshold_image, "Чёрно-белый пёсик")

gray_image — это одноканальная версия изображения.

Функция threshold возвращает изображение, в котором все пиксели, которые темнее (меньше) 127 заменены на 0, а все, которые ярче (больше) 127, — на 255.

Для ясности другой пример:


ret, threshold = cv2.threshold(im, 150, 200, 10)

Здесь всё, что темнее, чем 150, заменяется на 10, а всё, что ярче, — на 200.

Остальные threshold-функции описаны здесь.

Размытие/сглаживание

Исходное изображение с PixabayРазмытый пёсик


import cv2
blurred = cv2. GaussianBlur(image, (51, 51), 0)
viewImage(blurred, "Размытый пёсик")

Функция GaussianBlur (размытие по Гауссу) принимает 3 параметра:

  1. Исходное изображение.
  2. Кортеж из 2 положительных нечётных чисел. Чем больше числа, тем больше сила сглаживания.
  3. sigmaX и sigmaY. Если эти параметры оставить равными 0, то их значение будет рассчитано автоматически.

Больше про размытие здесь.

Рисование прямоугольников

Рисуем прямоугольники — исходное изображениеОбводим мордочку жёлтым прямоугольником


import cv2
output = image.copy()
cv2.rectangle(output, (2600, 800), (4100, 2400), (0, 255, 255), 10)
viewImage(output, "Обводим прямоугольником лицо пёсика")

Эта функция принимает 5 параметров:

  1. Само изображение.
  2. Координата верхнего левого угла (x1, y1).
  3. Координата нижнего правого угла (x2, y2).
  4. Цвет прямоугольника (GBR/RGB в зависимости от выбранной цветовой модели).
  5. Толщина линии прямоугольника.

Рисование линий

Изображение с pexelsДвух пёсиков разделим линией


import cv2
output = image.copy()
cv2.line(output, (60, 20), (400, 200), (0, 0, 255), 5)
viewImage(output, "2 пёсика, разделённые линией")

Функция line принимает 5 параметров:

  1. Само изображение, на котором рисуется линия.
  2. Координата первой точки (x1, y1).
  3. Координата второй точки (x2, y2).
  4. Цвет линии (GBR/RGB в зависимости от выбранной цветовой модели).
  5. Толщина линии.

Текст на изображении

Исходное изображение для надписиНадпись на изображении


import cv2
output = image.copy()
cv2.putText(output, "We <3 Dogs", (1500, 3600),cv2.FONT_HERSHEY_SIMPLEX, 15, (30, 105, 210), 40) 
viewImage(output, "Изображение с текстом")

Функция putText принимает 7 параметров:

  1. Непосредственно изображение.
  2. Текст для изображения.
  3. Координата нижнего левого угла начала текста (x, y).
  4. Используемый шрифт.
  5. Размер шрифта.
  6. Цвет текста (GBR/RGB в зависимости от выбранной цветовой модели).
  7. Толщина линий букв.

Распознавание лиц

На этот раз без пёсиков.

Фото с PixabayОбнаружено два лица


import cv2
image_path = "./путь/к/фото.расширение"
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
image = cv2.imread(image_path)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(
    gray,
    scaleFactor= 1.1,a
    minNeighbors= 5,
    minSize=(10, 10)
)
faces_detected = "Лиц обнаружено: " + format(len(faces))
print(faces_detected)
# Рисуем квадраты вокруг лиц
for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x+w, y+h), (255, 255, 0), 2)
viewImage(image,faces_detected)

detectMultiScale — общая функция для распознавания как лиц, так и объектов. Чтобы функция искала именно лица, мы передаём ей соответствующий каскад.

Функция detectMultiScale принимает 4 параметра:

  1. Обрабатываемое изображение в градации серого.
  2. Параметр scaleFactor. Некоторые лица могут быть больше других, поскольку находятся ближе, чем остальные. Этот параметр компенсирует перспективу.
  3. Алгоритм распознавания использует скользящее окно во время распознавания объектов. Параметр minNeighbors определяет количество объектов вокруг лица. То есть чем больше значение этого параметра, тем больше аналогичных объектов необходимо алгоритму, чтобы он определил текущий объект, как лицо. Слишком маленькое значение увеличит количество ложных срабатываний, а слишком большое сделает алгоритм более требовательным.
  4. minSize — непосредственно размер этих областей.

Contours — распознавание объектов

Распознавание объектов производится с помощью цветовой сегментации изображения. Для этого есть две функции: cv2.findContours и cv2.drawContours.

В этой статье детально описано обнаружение объектов с помощью цветовой сегментации. Всё, что вам нужно для неё, находится там.

Сохранение изображения


import cv2
image = cv2.imread("./импорт/путь.расширение")
cv2.imwrite("./экспорт/путь.расширение", image)

Заключение

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

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

Требуется регистрация для доступа к контенту. Регистрация, если Вы уже зарегистрированы — подключитесь

OpenCV — Обзор — CoderLessons.com

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

Давайте начнем главу с определения термина «компьютерное зрение».

Компьютерное зрение

Computer Vision может быть определена как дисциплина, которая объясняет, как реконструировать, прерывать и понимать трехмерную сцену из ее 2D-изображений с точки зрения свойств структуры, присутствующей в сцене. Он занимается моделированием и копированием человеческого зрения с использованием компьютерного программного и аппаратного обеспечения.

Computer Vision значительно перекрывает следующие поля:

  • Обработка изображений — фокусируется на манипулировании изображениями.

  • Распознавание образов — объясняет различные методы классификации образцов.

  • Фотограмметрия — это касается получения точных измерений из изображений.

Обработка изображений — фокусируется на манипулировании изображениями.

Распознавание образов — объясняет различные методы классификации образцов.

Фотограмметрия — это касается получения точных измерений из изображений.

Computer Vision Vs Обработка изображений

Обработка изображений связана с преобразованием изображения в изображение. Вход и выход обработки изображения оба изображения.

Компьютерное зрение — это построение явных, значимых описаний физических объектов по их изображению. Результатом компьютерного зрения является описание или интерпретация структур в трехмерной сцене.

Приложения компьютерного зрения

Здесь мы перечислили некоторые из основных областей, где интенсивно используется Computer Vision.

Применение робототехники

  • Локализация — определение местоположения робота автоматически

  • навигация

  • Избегание препятствий

  • Сборка (колышек, сварка, покраска)

  • Манипуляции (например, робот-манипулятор PUMA)

  • Human Robot Interaction (HRI) — Интеллектуальная робототехника для взаимодействия и обслуживания людей

Локализация — определение местоположения робота автоматически

навигация

Избегание препятствий

Сборка (колышек, сварка, покраска)

Манипуляции (например, робот-манипулятор PUMA)

Human Robot Interaction (HRI) — Интеллектуальная робототехника для взаимодействия и обслуживания людей

Применение в медицине

  • Классификация и обнаружение (например, классификация повреждения или клеток и обнаружение опухоли)
  • 2D / 3D сегментация
  • 3D реконструкция человеческого органа (МРТ или УЗИ)
  • Визуальная робототехника

Применение промышленной автоматизации

  • Промышленный контроль (обнаружение дефектов)
  • сборочный
  • Считывание штрих-кода и этикетки на упаковке
  • Сортировка объектов
  • Понимание документа (например, OCR)

Приложение безопасности

  • Биометрия (радужная оболочка, отпечаток пальца, распознавание лица)

  • Наблюдение — обнаружение определенных подозрительных действий или поведения

Биометрия (радужная оболочка, отпечаток пальца, распознавание лица)

Наблюдение — обнаружение определенных подозрительных действий или поведения

Транспортное приложение

  • Автономное транспортное средство
  • Безопасность, например, мониторинг бдительности водителя

Особенности библиотеки OpenCV

Используя библиотеку OpenCV, вы можете —

  • Читать и писать изображения

  • Захват и сохранение видео

  • Обрабатывать изображения (фильтровать, преобразовывать)

  • Выполнить обнаружение функции

  • Обнаружение определенных объектов, таких как лица, глаза, автомобили, в видео или изображениях.

  • Проанализируйте видео, т.е. оцените движение в нем, вычтите фон и отследите объекты в нем.

Читать и писать изображения

Захват и сохранение видео

Обрабатывать изображения (фильтровать, преобразовывать)

Выполнить обнаружение функции

Обнаружение определенных объектов, таких как лица, глаза, автомобили, в видео или изображениях.

Проанализируйте видео, т.е. оцените движение в нем, вычтите фон и отследите объекты в нем.

OpenCV изначально разрабатывался на C ++. В дополнение к этому были предоставлены привязки Python и Java. OpenCV работает в различных операционных системах, таких как Windows, Linux, OSx, FreeBSD, Net BSD, Open BSD и т. Д.

В этом руководстве объясняются концепции OpenCV на примерах, использующих привязки Java.

Библиотечные модули OpenCV

Ниже приведены основные библиотечные модули библиотеки OpenCV.

Основная функциональность

Этот модуль охватывает основные структуры данных, такие как Scalar, Point, Range и т. Д., Которые используются для создания приложений OpenCV. В дополнение к этому, он также включает в себя многомерный массив Mat , который используется для хранения изображений. В библиотеку Java OpenCV этот модуль включен как пакет с именем org.opencv.core .

Обработка изображения

Этот модуль охватывает различные операции обработки изображений, такие как фильтрация изображений, геометрические преобразования изображений, преобразование цветового пространства, гистограммы и т. Д. В библиотеку Java OpenCV этот модуль включен как пакет с именем org.opencv.imgproc .

видео

Этот модуль охватывает такие понятия анализа видео, как оценка движения, вычитание фона и отслеживание объекта. В библиотеку Java OpenCV этот модуль включен как пакет с именем org.opencv.video .

Видео ввод / вывод

Этот модуль объясняет захват видео и видеокодеки с использованием библиотеки OpenCV. В библиотеку Java OpenCV этот модуль включен как пакет с именем org.opencv.videoio .

calib3d

Этот модуль включает в себя алгоритмы, касающиеся основных алгоритмов геометрии нескольких видов, калибровки одиночной и стереокамеры, оценки позы объекта, стерео соответствия и элементов трехмерной реконструкции. В библиотеку Java OpenCV этот модуль включен как пакет с именем org.opencv.calib3d .

features2d

Этот модуль включает в себя концепции обнаружения и описания функций. В библиотеку Java OpenCV этот модуль включен как пакет с именем org.opencv.features2d .

Objdetect

Этот модуль включает в себя обнаружение объектов и экземпляров предопределенных классов, таких как лица, глаза, кружки, люди, автомобили и т. Д. В библиотеку Java OpenCV этот модуль включен как пакет с именем org.opencv.objdetect .

Highgui

Это простой в использовании интерфейс с простыми возможностями пользовательского интерфейса. В библиотеке Java OpenCV функции этого модуля включены в два разных пакета, а именно org.opencv.imgcodecs и org.opencv.videoio .

Краткая история OpenCV

OpenCV изначально была исследовательской инициативой Intel для консультирования приложений, интенсивно использующих процессор. Он был официально запущен в 1999 году.

Поиск лиц с помощью OpenCV на Python 3

Чтобы нарисовать рамки вокруг лиц (без глаз) на картинке:

def detect_faces(f_cascade, bgr_img, scale_factor=1.3):
    gray = cv2.cvtColor(bgr_img, cv2.COLOR_BGR2GRAY)  # need grayscale image
    faces = f_cascade.detectMultiScale(  # detect faces
        gray, scaleFactor=scale_factor, minNeighbors=5)
 
    for (x, y, w, h) in faces:  # draw a rectangle around each face
        cv2.rectangle(bgr_img, (x, y), (x+w, y+h), (0, 255, 0), 2)
    return len(faces)  # return the number of detected faces

где в качестве каскадного классификатора можно передать haarcascade_frontalface_alt, установленный вместе с opencv:

import os
import cv2  # $ pip install opencv-python
 
path = os.path.join(cv2.__path__[0], 'data/haarcascade_frontalface_alt.xml')
assert os.path.exists(path)
haar_face_cascade = cv2.CascadeClassifier(path)

Чтобы нарисовать лица на картинке, заданной в командной строке:

import sys
 
bgr_img = cv2.imread(sys.argv[1])
nfaces = detect_faces(haar_face_cascade, bgr_img, 1.05)
print(f'detected {nfaces}')  # -> 85
 
# show image
cv2.imshow('Image', img)
cv2.waitKey()  # wait until any key is pressed
cv2.destroyAllWindows()

Результат для фото с выставки:

Видно, что не все лица определились и есть ложные срабатывания. Увеличивая scale_factor уменьшается число ложных срабатываний и общее число обнаруженных лиц на картинке.

В качестве альтернативы можно использовать LBP каскадные классификаторы из OpenCV, требующие меньше ресурсов, но у которых больше ложных срабатываний:

face_cascade = cv2.CascadeClassifier('lbpcascade_frontalface_improved.xml')
bgr_img = cv2.imread(sys.argv[1])
nfaces = detect_faces(face_cascade, bgr_img, 1.01)
print(f'detected {nfaces}') # -> 99
cv2.imwrite('detected-faces-lbp.png', bgr_img)

Более точные результаты нежели LBP или Haar каскадные классификаторы из OpenCV, используя умеренные ресурсы (достаточно для видео), можно получить с помощью OpenCV dnn модуля. Face detection with OpenCV and deep learning.

Найти и нарисовать контуры с помощью OpenCV | питон

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

OpenCV имеет findContour() которая помогает извлекать контуры из изображения. Лучше всего он работает с двоичными изображениями, поэтому мы должны сначала применить методы пороговой обработки, ребра Собеля и т. Д.

Ниже приведен код для поиска контуров —

import cv2

import numpy as np

  

image = cv2.imread('C://Users//gfg//shapes.jpg')

cv2.waitKey(0)

  

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

  

edged = cv2.Canny(gray, 30, 200)

cv2.waitKey(0)

  

contours, hierarchy = cv2.findContours(edged, 

    cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

  

cv2.imshow('Canny Edges After Contouring', edged)

cv2.waitKey(0)

  

print("Number of Contours found = " + str(len(contours)))

  

cv2.drawContours(image, contours, -1, (0, 255, 0), 3)

  

cv2.imshow('Contours', image)

cv2.waitKey(0)

cv2.destroyAllWindows()

Выход:

Мы видим, что в функции cv2.findContours() есть три существенных аргумента. Первый — исходное изображение, второй — режим поиска контура, третий — метод аппроксимации контура, который выводит изображение, контуры и иерархию. ‘ contours ‘ — это список Python всех контуров изображения. Каждый отдельный контур представляет собой массив Numpy (x, y) координат граничных точек объекта.

Метод аппроксимации контуров —
Выше мы видим, что контуры являются границами формы с одинаковой интенсивностью. Он хранит координаты (x, y) границы фигуры. Но хранит ли он все координаты? Это задается этим методом контурной аппроксимации.
Если мы передаем cv2.CHAIN_APPROX_NONE , все граничные точки сохраняются. Но на самом деле, нам нужны все пункты? Например, если мы должны найти контур прямой линии. Нам нужны только две конечные точки этой линии. Это то, что делает cv2.CHAIN_APPROX_SIMPLE . Он удаляет все лишние точки и сжимает контур, тем самым экономя память.

Рекомендуемые посты:

Найти и нарисовать контуры с помощью OpenCV | питон

0.00 (0%) 0 votes

OpenCV: Обнаружение Canny Edge

Цель

В этой главе мы узнаем о

  • Концепция обнаружения края Canny
  • функций OpenCV для этого: cv.Canny ()

Теория

Canny Edge Detection — это популярный алгоритм обнаружения кромок. Он был разработан Джоном Ф. Кэнни в

  1. . Это многоэтапный алгоритм, и мы рассмотрим каждый этап.
  2. Снижение шума

    Поскольку обнаружение краев чувствительно к шуму в изображении, первым шагом является удаление шума в изображении с помощью гауссовского фильтра 5×5.{-1} \ bigg (\ frac {G_y} {G_x} \ bigg) \]

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

  3. Не максимальное подавление

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

    изображение

    Точка А находится на краю (в вертикальном направлении). Направление градиента нормальное к краю. Точки B и C находятся в направлениях градиента. Таким образом, точка A сравнивается с точками B и C, чтобы увидеть, образует ли она локальный максимум. Если это так, он рассматривается для следующего этапа, в противном случае он подавляется (обнуляется).

    Короче говоря, вы получаете двоичное изображение с «тонкими краями».

  4. Пороговое значение гистерезиса

    На этом этапе решается, какие из ребер действительно являются ребрами, а какие нет.Для этого нам нужны два пороговых значения: minVal и maxVal. Любые края с градиентом интенсивности больше maxVal обязательно будут краями, а те, что ниже minVal, обязательно не будут краями, поэтому отбрасывайте. Те, кто находится между этими двумя порогами, классифицируются как ребра или не ребра в зависимости от их связности. Если они соединены с пикселями с четкими краями, они считаются частью краев. В противном случае они также выбрасываются. Смотрите изображение ниже:

    изображение

    Край A выше maxVal, поэтому считается «надежным ребром».Хотя край C ниже maxVal, он соединен с ребром A, поэтому он также считается допустимым, и мы получаем полную кривую. Но ребро B, хотя оно выше minVal и находится в той же области, что и ребро C, не связано ни с каким «верным ребром», поэтому оно отбрасывается. Поэтому очень важно выбрать minVal и maxVal соответственно, чтобы получить правильный результат.

    На этом этапе также удаляются мелкие шумы пикселей при условии, что края представляют собой длинные линии.

Итак, в итоге мы получаем четкие края изображения.

Обнаружение Canny Edge в OpenCV

OpenCV объединяет все вышеперечисленное в одну функцию, cv.Canny () . Посмотрим, как это использовать. Первый аргумент — это наше входное изображение. Второй и третий аргументы — это наши minVal и maxVal соответственно. Третий аргумент — aperture_size. Это размер ядра Собеля, используемого для поиска градиентов изображения. По умолчанию это 3. Последний аргумент — L2gradient, который задает уравнение для определения величины градиента. Если это True, используется уравнение, указанное выше, которое является более точным, в противном случае используется эта функция: \ (Edge \ _Gradient \; (G) = | G_x | + | G_y | \).По умолчанию это False.

import numpy as np

import cv2 as cv

from matplotlib import pyplot as plt

plt.subplot (121), plt.imshow (img, cmap = ‘gray’)

plt.title (‘Original Image ‘), plt.xticks ([]), plt.yticks ([])

plt.subplot (122), plt.imshow (edge, cmap =’ gray ‘)

plt.title (‘ Edge Image ‘) , plt.xticks ([]), plt.yticks ([])

plt.show ()

См. результат ниже:

изображение

Дополнительные ресурсы

  1. Детектор края Canny в Википедии
  2. Учебное пособие по обнаружению Canny Edge от Билла Грина, 2002.

Упражнения

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

Обнаружение Canny Edge — OpenCV-Python Tutorials 1 документация

Цель

В этой главе мы узнаем о

  • Концепция обнаружения края Canny
  • функций OpenCV для этого: cv2.Канни ()

Теория

Canny Edge Detection — это популярный алгоритм обнаружения кромок. Он был разработан Джоном Ф. Кэнни в 1986 году. Это многоэтапный алгоритм, и мы рассмотрим каждый этап.

  1. Снижение шума

Поскольку обнаружение краев чувствительно к шуму в изображении, первым шагом является удаление шума в изображении с помощью гауссовского фильтра 5×5. Мы уже видели это в предыдущих главах.

  1. Определение градиента интенсивности изображения

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

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

  1. Не максимальное подавление

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

Точка А находится на краю (в вертикальном направлении). Направление градиента нормальное к краю. Точки B и C находятся в направлениях градиента. Таким образом, точка A сравнивается с точками B и C, чтобы увидеть, образует ли она локальный максимум. Если это так, он рассматривается для следующего этапа, в противном случае он подавляется (обнуляется).

Короче говоря, вы получаете двоичное изображение с «тонкими краями».

  1. Пороговое значение гистерезиса

На этом этапе решается, какие из ребер действительно являются ребрами, а какие нет.Для этого нам нужны два пороговых значения: minVal и maxVal . Любые края с градиентом интенсивности более maxVal обязательно будут краями, а те, что ниже minVal , обязательно не будут краями, поэтому отбрасывайте. Те, кто находится между этими двумя порогами, классифицируются как ребра или не ребра в зависимости от их связности. Если они соединены с пикселями с четкими краями, они считаются частью краев. В противном случае они также выбрасываются. Смотрите изображение ниже:

Кромка A выше maxVal , поэтому считается «надежной кромкой».Хотя край C ниже maxVal , он соединен с ребром A, так что это также считается допустимым краем, и мы получаем эту полную кривую. Но край B, хотя он выше minVal и находится в той же области, что и край C, он не связан с каким-либо «надежным краем», поэтому он отбрасывается. Поэтому очень важно выбрать minVal и maxVal соответственно, чтобы получить правильный результат.

На этом этапе также удаляются мелкие шумы пикселей при условии, что края представляют собой длинные линии.

Итак, в итоге мы получаем четкие края изображения.

Обнаружение Canny Edge в OpenCV

OpenCV объединяет все вышеперечисленное в одну функцию cv2.Canny () . Посмотрим, как это использовать. Первый аргумент — это наше входное изображение. Второй и третий аргументы — это наши minVal и maxVal соответственно. Третий аргумент — aperture_size . Это размер ядра Собеля, используемого для поиска градиентов изображения. По умолчанию это 3. Последний аргумент — L2gradient , который задает уравнение для определения величины градиента.Если это Истинно , используется уравнение, упомянутое выше, которое является более точным, в противном случае используется эта функция:. По умолчанию это Ложь .

 импорт cv2
импортировать numpy как np
из matplotlib импортировать pyplot как plt

img = cv2.imread ('messi5.jpg', 0)
ребра = cv2.Canny (img, 100,200)

plt.subplot (121), plt.imshow (img, cmap = 'серый')
plt.title ('Исходное изображение'), plt.xticks ([]), plt.yticks ([])
plt.subplot (122), plt.imshow (края, cmap = 'серый')
plt.title ('Edge Image'), plt.xticks ([]), plt.yticks ([])

plt.show ()
 

См. Результат ниже:

Contour Features — OpenCV-Python Tutorials 1 документация

Цель

В этой статье мы узнаем

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

1. Моменты

Моменты изображения помогают вычислить некоторые характеристики, такие как центр масс объекта, площадь объекта и т. Д.Посетите страницу википедии на Image Moments

Функция cv2.moments () дает словарь всех вычисленных значений моментов. См. Ниже:

 импорт cv2
импортировать numpy как np

img = cv2.imread ('star.jpg', 0)
ret, thresh = cv2.threshold (img, 127,255,0)
контуры, иерархия = cv2.findContours (thresh, 1, 2)

cnt = contours [0]
M = cv2.moments (cnt)
печать M
 

С этого момента вы можете извлечь полезные данные, такие как площадь, центроид и т. Д. Центроид задается отношениями, и.Это можно сделать так:

 cx = int (M ['m10'] / M ['m00'])
cy = int (M ['m01'] / M ['m00'])
 

2. Площадь контура

Площадь контура задается функцией cv2.contourArea () или моментом M [‘m00’] .

 площадь = cv2.contourArea (cnt)
 

3. Контур периметра

Также называется длиной дуги. Это можно узнать с помощью функции cv2.arcLength () . Второй аргумент указывает, является ли форма замкнутым контуром (если передано значение True ) или просто кривой.

 периметр = cv2.arcLength (cnt, True)
 

4. Аппроксимация контура

Он приближает форму контура к другой форме с меньшим количеством вершин в зависимости от указанной нами точности. Это реализация алгоритма Дугласа-Пекера. Проверьте страницу википедии для алгоритма и демонстрации.

Чтобы понять это, предположим, что вы пытаетесь найти квадрат на изображении, но из-за некоторых проблем с изображением вы получили не идеальный квадрат, а «плохую форму» (как показано на первом изображении ниже).Теперь вы можете использовать эту функцию для аппроксимации формы. В этом случае второй аргумент называется эпсилон , что представляет собой максимальное расстояние от контура до аппроксимируемого контура. Это параметр точности. Чтобы получить правильный результат, необходим мудрый выбор epsilon .

 epsilon = 0,1 * cv2.arcLength (cnt, True)
приблизительно = cv2.approxPolyDP (cnt, epsilon, True)
 

Ниже, на втором изображении, зеленая линия показывает аппроксимированную кривую для эпсилон = 10% длины дуги .Третье изображение показывает то же самое для epsilon = 1% от нулевого параметра

, автоматическое обнаружение края Canny с Python и OpenCV

Получите мгновенный доступ к коду для этого руководства и всех других 400+ руководств по PyImageSearch.

Внутри вы найдете …

  • Доступ к централизованным репозиториям кода для все 400 руководств в блоге PyImageSearch
  • Предварительно настроенные блокноты Jupyter в Google Colab для всех новых руководств
  • Углубленные видеоуроки для всех новых сообщений в блогах — эти видео включают дополнительные комментарии, методы и советы, которые я не включаю в текстовые версии своих руководств

Введите свой адрес электронной почты ниже и получите доступ:

Я использовал часть одного из ваших руководств для решения возникшей у меня проблемы с Python и OpenCV.Боролся с этим две недели, а от других экспертов не ответили. Прочтите вашу статью я нашел …. Исправил за два часа. И это тоже было критически важно. Ваши вещи качественные!

Исмаил Томас-Бенге Старший консультант по обеспечению качества и архитектор

PyImageSearch Plus — получите мгновенный доступ к коду для этого руководства и всех других 400 руководств по PyImageSearch!

Выберите свой тарифный план ниже …

$ 4.95 / мес

49,50 $ / год (экономия 15%)

  • Доступ к централизованным репозиториям кода для все 400 руководств на PyImageSearch
  • Простой код доступа для всех новых руководств , которые публикуются каждый понедельник
  • Простая загрузка в один клик кода, моделей, наборов данных и т. Д.

$ 14.95 / мес

149,50 $ / год (экономия 15%)

  • Предварительно настроенные блокноты Jupyter в Google Colab для всех новых руководств
  • Запускайте все примеры кода в своем веб-браузере. — работает в Windows, macOS и Linux.
  • Доступ к централизованным репозиториям кода для все 400 руководств на PyImageSearch
  • Простой код доступа для всех новых руководств , которые публикуются каждый понедельник
  • Простая загрузка в один клик кода, моделей, наборов данных и т. Д.

$ 74.95 / мес

749,50 $ / год (экономия 15%)

  • Видеоуроки для всех новых сообщений в блоге
  • Предварительно настроенные блокноты Jupyter в Google Colab для всех новых руководств
  • Запускайте все примеры кода в своем веб-браузере. — работает в Windows, macOS и Linux.
  • Доступ к централизованным репозиториям кода для все 400 руководств на PyImageSearch
  • Простой код доступа для всех новых руководств , которые публикуются каждый понедельник
  • Простая загрузка в один клик кода, моделей, наборов данных и т. Д.
  • Доступ к централизованным репозиториям кода для все 400+ руководств в блоге PyImageSearch
  • Простой код доступа для всех новых руководств , которые публикуются каждый понедельник в 10:00 EST
  • Простая загрузка в один клик для исходного кода, наборов данных, предварительно обученных моделей и т. Д.
  • Отменить в любой момент
  • Легкий доступ к коду, наборам данных и предварительно обученным моделям для всех 400+ руководств в блоге PyImageSearch
  • Изучите использование Jupyter Notebooks в Google Colab для всех новых руководств , опубликованных на PyImageSearch
  • Используйте предварительно настроенных сред разработки в Google Colab — больше никаких головных болей и траты времени на настройку среды разработки
  • Подробные видеоуроки и пошаговые инструкции для всех новых руководств и руководств
  • Доступ к эксклюзивных предложений моих книг и курсов

Я использовал часть одного из ваших руководств для решения возникшей у меня проблемы с Python и OpenCV.Боролся с этим две недели, а от других экспертов не ответили. Прочтите вашу статью я нашел …. Исправил за два часа. И это тоже было критически важно. Ваши вещи качественные!

Исмаил Томас-Бенге Старший консультант по обеспечению качества и архитектор

Руководств по программированию на Python

Canny Edge Detection and Gradients OpenCV Python Tutorial

Добро пожаловать в другой учебник OpenCV с Python. В этом уроке мы рассмотрим градиенты изображения и обнаружение краев.Градиенты изображения могут использоваться для измерения направленной интенсивности, а обнаружение краев делает именно то, на что похоже: оно находит края! Спорим, ты не ожидал этого.

Сначала покажем несколько примеров градиента:

 импорт cv2
импортировать numpy как np

cap = cv2.VideoCapture (1)

а (1):

    # Возьмите каждый кадр
    _, frame = cap.read ()
    hsv = cv2.cvtColor (кадр, cv2.COLOR_BGR2HSV)
    
    lower_red = np.array ([30,150,50])
    upper_red = np.array ([255,255,180])
    
    маска = cv2.inRange (hsv, lower_red, upper_red)
    res = cv2.bitwise_and (кадр, кадр, маска = маска)

    Laplacian = cv2.Laplacian (кадр, cv2.CV_64F)
    sobelx = cv2.Sobel (рамка, cv2.CV_64F, 1,0, ksize = 5)
    sobely = cv2.Sobel (frame, cv2.CV_64F, 0,1, ksize = 5)

    cv2.imshow ('Оригинал', рамка)
    cv2.imshow ('Маска', маска)
    cv2.imshow ('лапласианский', лапласианский)
    cv2.imshow ('sobelx', sobelx)
    cv2.imshow ('трезво', трезво)

    k = cv2.waitKey (5) & 0xFF
    если k == 27:
        перемена

cv2.destroyAllWindows ()
cap.release ()
 

Результат:

Если вам интересно, что такое cv2.CV_64F , это тип данных. ksize — размер ядра. Мы используем 5, поэтому консультируются по регионам 5×5.

Хотя мы можем использовать эти градиенты для преобразования в чистые края, мы также можем использовать обнаружение Canny Edge!

 импорт cv2
импортировать numpy как np

cap = cv2.VideoCapture (0)

а (1):

    _, frame = cap.read ()
    hsv = cv2.cvtColor (кадр, cv2.COLOR_BGR2HSV)
    
    lower_red = np.array ([30,150,50])
    upper_red = np.array ([255,255,180])
    
    маска = cv2.inRange (hsv, lower_red, upper_red)
    res = cv2.bitwise_and (кадр, кадр, маска = маска)

    cv2.imshow ('Оригинал', рамка)
    Edge = cv2.Canny (рамка, 100,200)
    cv2.imshow ('Ребра', края)

    k = cv2.waitKey (5) & 0xFF
    если k == 27:
        перемена

cv2.destroyAllWindows ()
cap.release () 

Результат:

Чертовски хорошо! Однако не все так идеально. Обратите внимание, что тени вызывают обнаружение краев. Один из самых очевидных — тень, которую испускает синяя собачья кровать.

В следующем руководстве по OpenCV мы поговорим о том, как мы можем искать и находить идентичные шаблоны изображений в других изображениях.

Следующий учебник: Учебник по сопоставлению шаблонов OpenCV Python

OpenCV: функции рисования

imgRemote bool (React. & pt1, Point & pt2)

void

void cv :: arrowedLine (InputOutputArray img, Point pt1, Point pt2, const Scalar & color, int width = 1, int line_type = 8, int shift = 0, double tipLength = 0,1)
Рисует сегмент стрелки, указывающий от первой точки ко второй.Подробнее …
void cv :: circle (InputOutputArray img, Point center, int radius, const Scalar & color, int width = 1, int lineType = LINE_8, int shift = 0)
Рисует круг. Подробнее …
bool cv :: clipLine (Size imgSize, Point & pt1, Point & pt2)
Обрезает линию по прямоугольнику изображения.Подробнее …
bool cv :: clipLine (Size2l imgSize, Point2l & pt1, Point2l & pt2)
void cv :: drawContours (изображение InputOutputArray, контуры InputArrayOfArrays, int contourIdx, const Scalar & color, int width = 1, int lineType = 1, int lineType) , int maxLevel = INT_MAX, Point offset = Point ())
Рисует контуры контуров или контуры с заливкой.Подробнее …
void cv :: drawMarker (Mat & img, Point position, const Scalar & color, int markerType = MARKER_CROSS, int markerSize = 20, int толщина = 1, int line_type = 8 )
Рисует маркер в заранее заданной позиции на изображении. Подробнее …
void cv :: ellipse (InputOutputArray img, Point center, Size Axes, double angle, double startAngle, double endAngle, const Scalar & color, int width = 1, int lineType = LINE_8, int shift = 0)
Рисует простую или толстую эллиптическую дугу или заполняет сектор эллипса.Подробнее …
void cv :: ellipse (InputOutputArray img, const RotatedRect & box, const Scalar & color, int толщина = 1, int lineType = LINE_338)
cv :: ellipse2Poly (Point center, Size Axes, int angle, int arcStart, int arcEnd, int delta, std :: vector & pts)
Приближает эллиптическую дугу к полилинии.

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

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

2024 © Все права защищены. Карта сайта