Skip to content

Latest commit

 

History

History
161 lines (129 loc) · 10.3 KB

README_4.md

File metadata and controls

161 lines (129 loc) · 10.3 KB

Практика 4. Сопровождение объектов с использованием алгоритма Median Flow

Feedback

Цели

Цель данной работы - освоить методы нахождение особых точек и оптического потока и реализовать метод сопровождения объектов с их использованием.

Задачи

Основные задачи:

  1. Реализовать базовый вариант алгоритма трекинга Median Flow.
  2. Разработать приложение, демонстрирующее применение реализованного алгоритма. Приложение обеспечивать следующий функционал:
    • Загрузка видео.
    • Выделение объекта для сопровождения с использованием окаймляющего прямоугольника на первом кадре видео.
    • Демонстрация кадров видео. При отображении кадров необходимо выделить сопровождаемый объект вплоть до момента его выхода из области видимости камеры.
  3. Реализовать и протестировать следующие модификации алгоритма Median Flow:
    • Модификация, которая заключается в учете изменения размеров объекта (масштаба).
    • Модификация, предполагающая определение срыва трекинга.
    • Использование различных видов особых точек (Harris corners, Good Features To Track, SIFT/SURF/ORB features и т.п.).
    • Использование различных способов фильтрации точек (фиксированный порог, среднее и т.п.).

Дополнительные задачи:

  1. Реализовать схему с использованием результата работы детектора для инициализации трекера, ограничившись случаем наличия не более одного объекта в кадре.
  2. Добавить в разработанное приложение возможность оценки качества трекинга при наличии файла с описанием истинных положений объектов на кадрах видео, используя класс 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;
};

Класс имеет следующие чисто виртуальные методы:

  1. Init - метод инициализации трекера, принимающий текущий кадр видео frame и положение объекта на нем roi.
  2. Track - метод сопровождения объекта, который по новому кадру frame находит новое положение объекта и возвращает его.

Также класс содержит фабричный метод CreateDetector.

Общая последовательность действий

  1. Объявить класс-наследник MedianFlowTracker от класса Tracker.
  2. Последовательно реализовать методы класса MedianFlowTracker.
  3. Создать новое приложение tracking_demo.cpp в директории samples.
  4. Разработать приложение samples\tracking_demo.cpp в соответствии с перечнем требований, представленным в описании основных задач.
  5. Разработать приложения, решающие дополнительные задачи.

Детальная инструкция по выполнению работы

  1. Дополнить заголовочный файл 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_;
};
  1. Добавить код для создания экземпляра класса MedianFlowTracker в фабричный метод Tracker::CreateTracker.
if (name == "median_flow") {
  return std::make_shared<MedianFlowTracker>();
}
  1. Реализовать метод MedianFlowTracker::Init, который запоминает текущий кадр и положение объекта на нем.

  2. Реализовать базовую версию алгоритма Median Flow в методе MedianFlowTracker::Track. Общая схема работы метода должна заключаться в выполнении следующих шагов:

    1. Выбор (поиск) особых точек в области изображения с объектом для предыдущего кадра видео.
    2. Вычисление оптического потока между предыдущим и следующим кадрами для найденных особых точек. Для вычисления оптического потока следует использовать функцию calcOpticalFlowPyrLK (документация, пример использования).
    3. Отфильтровать "плохие" точки, отбросив точки, для которых не удалось найти оптический поток.
    4. Найти медиану смещений оставшихся точек по координате X и Y независимо. Полученное смещение принять за смещение объекта.
  3. Создать новое приложение tracking_demo.cpp в директории samples и реализовать в нем следующую логику:

    1. Загрузка видео из файла/захват с камеры.
    2. Выделение пользователем прямоугольной области, содержащей интересующий объект, на первом кадре.
    3. Инициализация трекера выбранной областью.
    4. Сопровождение объекта на последующих кадрах видео и отрисовка результата на экране.
  4. Реализовать полную версию алгоритма Median Flow, дополнив метод MedianFlowTracker::Track следующими шагами:

    1. Вычисление обратного оптического потока (от текущего кадра к предыдущему). И отбрасывание точек, для которых оптический поток не может быть найден.
    2. Отбрасывание "плохих" точек на основе forward-backward правила:
      1. Вычислить ошибку (смещение) особых точек после прямого и обратного прохода.
      2. Найти медианную ошибку.
      3. Назначить "плохими" все точки, для которых ошибка больше медианной.
    3. Найти медиану смещений оставшихся точек по координате X и Y независимо. Полученное смещение принять за смещение объекта.
    4. Оценить изменение размера объекта (масштаба):
      1. Для всех пар точек определить отношение расстояния между ними на предыдущем и следующем кадре.
      2. Выбрать медианное отношение и скорректировать в соответствии с ним размер объекта.
    5. Добавить возможность определения срыва сопровождения, основываясь на количестве "хороших" точек.
  5. Разработать приложения, решающие дополнительные задачи.