Главная страница

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


Скачать 18.73 Kb.
НазваниеОбнаружение углов с помощью детектора Харриса выполняется следующей функцией
Анкорключевые точки
Дата30.12.2020
Размер18.73 Kb.
Формат файлаdocx
Имя файла11. Ключевые точки.docx
ТипДокументы
#165318

  1. Детектор углов Харриса

Обнаружение углов с помощью детектора Харриса выполняется следующей функцией:

cv2.cornerHarris(img, blockSize, ksize, k)

где img – изображение, blockSize – размер области угла, ksize – размер фильтра оператора Собеля, k – регулирует чувствительность детектора, чем больше k, Тем меньше ложных срабатываний, как и срабатываний в целом, чем меньше k, тем больше углов будет найдено, при этом будет больше ложных срабатываний.

import cv2

import numpy as np

img = cv2.imread('D:/chessboard.png', cv2.IMREAD_GRAYSCALE)

img = cv2.resize(img, dsize=(512,512))

float_img = img.astype(np.float32)

detections = cv2.cornerHarris(float_img, 2, 3, 0.1)

threshold = 0.05 * detections.max()

img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)

filtered = np.zeros((img.shape[0], img.shape[1]), dtype=np.uint8)

for y in range(img.shape[0]):

for x in range(img.shape[1]):

if detections[y, x] > threshold :

img[y, x] = [0, 0, 255]

filtered[y, x] = 255

cv2.imshow('detections', detections)

cv2.imshow('filtered detections', filtered)

cv2.imshow('output', img)

cv2.waitKey()

  1. Напишите программу, которая выполнит детекцию углов с помощью алгоритма Харриса на изображении cat.jpg. Посмотрите, как повлияют на результат величина параметра k и уровень отсечки (в примере задается в переменной threshold). Улучшится ли результат, если предварительно применить к изображению оператор Собеля и выполнить детекцию углов на изображении с границами объектов.



  1. FAST

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

import cv2

import numpy as np

img = cv2.imread('D:/chessboard.png', cv2.IMREAD_GRAYSCALE)

img = cv2.resize(img, dsize=(512,512))

fast = cv2.FastFeatureDetector()

kp = fast.detect(img, None)

img2 = cv2.drawKeypoints(img, kp, color=(0,0,255))

cv2.imshow('output', img2)

cv2.waitKey()

  1. ORB

ORB выполняет детекцию углов используя модифицированный алгоритм FAST, и в отличие от детекторов Харриса и FAST выполняет описание найденных ключевых точек с помощью модифицированного дескриптора BRIEF, для того, чтобы в дальнейшем можно было сопоставить найденные ключевые точки с ключевыми точками на другом изображении.

import cv2

import numpy as np

template = cv2.imread('D:/template.png', cv2.IMREAD_GRAYSCALE)

img = cv2.imread('D:/test.png', cv2.IMREAD_GRAYSCALE)

orb = cv2.ORB()

kp1, des1 = orb.detectAndCompute(template, None)

kp2, des2 = orb.detectAndCompute(img, None)

bf_matcher = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)

matches = bf_matcher.match(des1, des2)

# создаем пустое изображение для отрисовки найденных совпадений

out = np.zeros((img.shape[0], template.shape[1] + img.shape[1]), dtype=np.uint8)

out[:template.shape[0], :template.shape[1]] = template

out[:, template.shape[1]:] = img

out = cv2.cvtColor(out, cv2.COLOR_GRAY2RGB)

# Отрисовка сопоставленных точек

for match in matches:

template_idx = match.queryIdx

img_idx = match.trainIdx

(x1, y1) = kp1[template_idx].pt

(x2, y2) = kp2[img_idx].pt

cv2.circle(out, (int(x1), int(y1)), 4, (0, 0, 255), 1)

cv2.circle(out, (int(x2) + template.shape[1], int(y2)), 4, (255, 0, 0), 1)

cv2.line(out, (int(x1), int(y1)), (int(x2) + template.shape[1], int(y2)), (0, 255, 0), 1)

cv2.imshow('output', out)

cv2.waitKey()

  1. Работа с видео

Для работы с видеофайлами и видеопотоками в OpenCV существует класс cv2.VideoCapture. В качестве единственного параметра он принимает название файла, номер камеры или ссылку на видеопоток как показано ниже:

Cap = cv2.VideoCapture('my_video.avi')

У VideoCapture есть ряд параметров, наличие отдельных параметров зависит от того, какие из них поддерживаются видеокодеком(при чтении видео из файла), параметрами камеры и т.д. Параметры задаются с помощью функции set(param_code, value), где param_code – код параметра(приведены далее), value – значение для параметра.

Основные параметры:

CAP_PROP_FRAME_WIDTH – задает ширину кадра

CAP_PROP_FRAME_HEIGHT – задает высоту кадра

CAP_PROP_FPS – задает целевую частоту кадров, в основном для камер.

import cv2

cam1 = cv2.VideoCapture(0) # читаем кадры с камеры 0

cam1.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

cam1.set(cv2.CAP_PROP_FRAME_WIDTH, 640)

cam1.set(cv2.CAP_PROP_FPS, 15)

#Обработка видео производится по одному кадру в цикле

while True:

# Читаем кадр из потока

frame, ret = cam1.read()

# выполняем обработку

frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

# отображаем кадр на экране

cv2.imshow('gray frame', frame)

# следующие строки создают задержку в 1 мс

# и проверяют нажал ли пользователь клавишу q

if cv2.waitKey(1) & 0xFF == ord('q'):

break # если нажал, то прерываем цикл чтения потока

cam1.Close() # закрываем поток

cv2.destroyAllWindows() # закрываем все окна

  1. Попробуйте применить сглаживающий фильтр Гаусса и оператор Собеля к изображению с веб камеры.

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

  3. Используя код пункта 6 по аналогии с пунктом 2, попробуйте применить детектор углов Харриса к оригинальному изображению и к изображению границ.


написать администратору сайта