Опубликован: 02.09.2013 | Доступ: свободный | Студентов: 429 / 54 | Длительность: 19:27:00

Самостоятельная работа 4: Классификация изображений с использованием bag-of-words методов

2. Обзор возможностей модуля features2d библиотеки OpenCV

2.1. Детектирование ключевых точек на изображении

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

Одним из наиболее простых алгоритмов, который находит на изображении углы, является детектор Моравеца (Moravec) [15]. Основная идея алгоритма заключается в поиске точек, соответствующих максимуму изменения суммарной интенсивности в окрестности рассматриваемого пикселя при смещении данной окрестности на один пиксель в каждом из восьми принципиальных направлений (2 горизонтальных, 2 вертикальных и 4 диагональных). Основными недостатками данного детектора являются отсутствие инвариантности к преобразованию типа "поворот" и возникновение большого числа ложных срабатываний на диагональных ребрах. Детектор Моравеца обладает свойством анизотропии в 8 принципиальных направлениях смещения окна.

Детектор Харриса (Harris) [16] строится на основании детектора Моравеца и является его улучшением. По сравнению со своим предшественником он инвариантен относительно поворота, количество ложных срабатываний не велико за счет введения свертки с Гауссовыми весовыми коэффициентами. Однако результаты поиска значительно меняются при масштабировании изображения. Также существуют модификации детектора Харриса, которые учитывают вторые производные функции интенсивности (например, детектор Харриса-Лапласа (Harris- Laplace) [10]).

Детектор MSER (Maximally Stable Extremal Regions) [9] выделяет множество регионов, являющихся областями локального экстремума интенсивности, максимально устойчивыми к вариациям интенсивности в окрестности данных регионов. Детектор обладает свойством инвариантности относительно масштабирования изображения. Похожая идея поиска областей с экстремальными свойствами интенсивности пикселей, устойчивых к изменению масштаба, лежит в основе детекторов LoG (Laplacian of Gaussian [7]) и SIFT [8]).

Приведенные выше детекторы определяют расположение ключевых точек на изображении, используя только пиксели исходного изображения. Альтернативный подход состоит в том, чтобы использовать алгоритмы машинного обучения для тренировки классификатора точек на некотором множестве изображений. FAST-детектор (Features from Accelerated Test) [11] является типичным представителем данного класса детекторов.

Более подробное описание детекторов ключевых точек приведено в лекционной части курса.

В библиотеке OpenCV реализованы следующие детекторы: FAST [11], STAR [1], SIFT [8], SURF [2], ORB [12], MSER [9], GoodFeaturesToTrack [20], Harris [16], Dense [17], Simple blob [17]. Для использования детекторов особых точек необходимо подключить заголовочный файл opencv2/features2d/features2d.hpp и библиотеку features2d243(d).lib.

Классы, содержащие реализацию данных детекторов, унаследованы от базового абстрактного класса FeatureDetector. Рассмотрим подробнее методы данного класса.

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

Ptr<FeatureDetector> FeatureDetector::create( 
                                const string& detectorType) 
                                

В качестве параметра данной функции передается строка, содержащая идентификатор типа детектора ("FAST", "STAR", "SIFT", "SURF", "ORB", "MSER", "GFTT" (GoodFeaturesToTrack), "HARRIS", "Dense", "SimpleBlob".

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

void FeatureDetector::detect(const Mat& image,        
vector<KeyPoint>& keypoints,  
         const Mat& mask=Mat() ) const 
         

Рассмотрим параметры данного метода:

  • image – входное изображение
  • keypoints – массив найденных особых точек на изображении.
  • mask – маска, определяющая область изображения, в которой осуществляется поиск ключевых точек (элементами матрицы, описывающей маску, являются восьмибитные целые числа; ненулевые значения соответствуют области изображения).

Необходимо учесть, что при использовании детекторов SIFT и SURF требуется в исходном коде дополнительно подключить заголовочный файл opencv2/nonfree/nonfree.hpp, а в настройках проекта библиотеку nonfree243(d).lib. Наряду с этим вызвать функцию инициализации данного модуля: initModule_nonfree().

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

// fileName – путь к изображению 
// keypoints – найденные ключевые точки на изображении 
void DetectKeypointsOnImage(const string& fileName, 
                            vector<KeyPoint>& keypoints) 
{ 
  // загружаем изображение из файла 
Mat img = imread(fileName);  
// инициализируем модуль nonfree для использования 
// детектора SIFT  
initModule_nonfree();  
// создаем SIFT детектор 
Ptr<FeatureDetector> featureDetector = 
                  FeatureDetector::create("SIFT"); 
// детектируем ключевые точки  
// на загруженном изображении 
featureDetector->detect(img, keypoints);  
} 
Андрей Терёхин
Андрей Терёхин

Нахожу в тесте вопросы, которые в принципе не освещаются в лекции. Нужно гуглить на других ресурсах, чтобы решить тест, или же он всё же должен испытывать знания, полученные в ходе лекции?

Демянчик Иван
Демянчик Иван

В главе 14 мы видим понятие фильтра, но не могу разобраться, чем он является в теории и практике.

" Искомый объект можно описать с помощью фильтра F= \lbrace f_{x',y'},x' \in \lbrace0, ...,w_f \rbrace , y' \in \lbrace 0,...,h_f \rbrace \rbrace "