Цель данной работы - освоить методы нахождение особых точек и оптического потока и реализовать метод сопровождения объектов с их использованием.
Основные задачи:
- Реализовать базовый вариант алгоритма трекинга Median Flow.
- Разработать приложение, демонстрирующее применение реализованного
алгоритма. Приложение обеспечивать следующий функционал:
- Загрузка видео.
- Выделение объекта для сопровождения с использованием окаймляющего прямоугольника на первом кадре видео.
- Демонстрация кадров видео. При отображении кадров необходимо выделить сопровождаемый объект вплоть до момента его выхода из области видимости камеры.
- Реализовать и протестировать следующие модификации алгоритма Median Flow:
- Модификация, которая заключается в учете изменения размеров объекта (масштаба).
- Модификация, предполагающая определение срыва трекинга.
- Использование различных видов особых точек (Harris corners, Good Features To Track, SIFT/SURF/ORB features и т.п.).
- Использование различных способов фильтрации точек (фиксированный порог, среднее и т.п.).
Дополнительные задачи:
- Реализовать схему с использованием результата работы детектора для инициализации трекера, ограничившись случаем наличия не более одного объекта в кадре.
- Добавить в разработанное приложение возможность оценки качества трекинга
при наличии файла с описанием истинных положений объектов на кадрах видео,
используя класс
DetectionQualityEvaluator
, объявленный в файлеinclude/benchmark.hpp
.
В лабораторной работе основные задачи решаются на базе программного
модуля tracking
библиотеки summer_school_2016_lib
. Модуль
включает заголовочный файл include\tracking.hpp
и исходный файл src\tracking.cpp
. Модуль содержит объявление
абстрактного класса Tracker
.
class Tracker {
public:
static std::shared_ptr<Tracker> CreateTracker(const std::string &name);
virtual bool Init(const cv::Mat &frame, const cv::Rect &roi) = 0;
virtual cv::Rect Track(const cv::Mat &frame) = 0;
};
Класс имеет следующие чисто виртуальные методы:
Init
- метод инициализации трекера, принимающий текущий кадр видеоframe
и положение объекта на немroi
.Track
- метод сопровождения объекта, который по новому кадруframe
находит новое положение объекта и возвращает его.
Также класс содержит фабричный метод CreateDetector
.
- Объявить класс-наследник
MedianFlowTracker
от классаTracker
. - Последовательно реализовать методы класса
MedianFlowTracker
. - Создать новое приложение
tracking_demo.cpp
в директорииsamples
. - Разработать приложение
samples\tracking_demo.cpp
в соответствии с перечнем требований, представленным в описании основных задач. - Разработать приложения, решающие дополнительные задачи.
- Дополнить заголовочный файл
include\tracking.hpp
объявлением классаMedianFlowTracker
, унаследовав его от классаTracker
.
class MedianFlowTracker : public Tracker {
public:
virtual bool Init(const cv::Mat &frame, const cv::Rect &roi);
virtual cv::Rect Track(const cv::Mat &frame);
protected:
cv::Rect position_;
cv::Mat frame_;
};
- Добавить код для создания экземпляра класса
MedianFlowTracker
в фабричный методTracker::CreateTracker
.
if (name == "median_flow") {
return std::make_shared<MedianFlowTracker>();
}
-
Реализовать метод
MedianFlowTracker::Init
, который запоминает текущий кадр и положение объекта на нем. -
Реализовать базовую версию алгоритма Median Flow в методе
MedianFlowTracker::Track
. Общая схема работы метода должна заключаться в выполнении следующих шагов:- Выбор (поиск) особых точек в области изображения с объектом для предыдущего кадра видео.
- Вычисление оптического потока между предыдущим и следующим кадрами
для найденных особых точек. Для вычисления оптического потока
следует использовать функцию
calcOpticalFlowPyrLK
(документация, пример использования). - Отфильтровать "плохие" точки, отбросив точки, для которых не удалось найти оптический поток.
- Найти медиану смещений оставшихся точек по координате X и Y независимо. Полученное смещение принять за смещение объекта.
-
Создать новое приложение
tracking_demo.cpp
в директорииsamples
и реализовать в нем следующую логику:- Загрузка видео из файла/захват с камеры.
- Выделение пользователем прямоугольной области, содержащей интересующий объект, на первом кадре.
- Инициализация трекера выбранной областью.
- Сопровождение объекта на последующих кадрах видео и отрисовка результата на экране.
-
Реализовать полную версию алгоритма Median Flow, дополнив метод
MedianFlowTracker::Track
следующими шагами:- Вычисление обратного оптического потока (от текущего кадра к предыдущему). И отбрасывание точек, для которых оптический поток не может быть найден.
- Отбрасывание "плохих" точек на основе forward-backward правила:
- Вычислить ошибку (смещение) особых точек после прямого и обратного прохода.
- Найти медианную ошибку.
- Назначить "плохими" все точки, для которых ошибка больше медианной.
- Найти медиану смещений оставшихся точек по координате X и Y независимо. Полученное смещение принять за смещение объекта.
- Оценить изменение размера объекта (масштаба):
- Для всех пар точек определить отношение расстояния между ними на предыдущем и следующем кадре.
- Выбрать медианное отношение и скорректировать в соответствии с ним размер объекта.
- Добавить возможность определения срыва сопровождения, основываясь на количестве "хороших" точек.
-
Разработать приложения, решающие дополнительные задачи.