ключевые точки. 11. Ключевые точки. Обнаружение углов с помощью детектора Харриса выполняется следующей функцией
Скачать 18.73 Kb.
|
Детектор углов Харриса Обнаружение углов с помощью детектора Харриса выполняется следующей функцией: 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() Напишите программу, которая выполнит детекцию углов с помощью алгоритма Харриса на изображении cat.jpg. Посмотрите, как повлияют на результат величина параметра k и уровень отсечки (в примере задается в переменной threshold). Улучшится ли результат, если предварительно применить к изображению оператор Собеля и выполнить детекцию углов на изображении с границами объектов. 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() 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() Работа с видео Для работы с видеофайлами и видеопотоками в 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() # закрываем все окна Попробуйте применить сглаживающий фильтр Гаусса и оператор Собеля к изображению с веб камеры. По примерам отсечения по цвету выделите на изображении с камеры объект определенного цвета и закрасьте его красным цветом на оригинальном изображении. Используя код пункта 6 по аналогии с пунктом 2, попробуйте применить детектор углов Харриса к оригинальному изображению и к изображению границ. |