Трекинг и движение

Основы трекинга

Задача определения движения объекта, состоит из двух компонентов: идентификация и моделирование.

Идентификация сводится к поиску интересующего объекта в последовательности фреймов из видео потока. Методы моментов или цветовые гистограммы помогают идентифицировать искомый объект.  Также трекинг может применяться и к не идентифицированным объектам, когда мы хотим определить, совершает ли объект интересующее нас движение.

Методы, которые используются для трекинга не идентифицированных объектов обычно отслеживают только ключевые точки (визуальные признаки которые близки к уникальным). OpenCV предоставляет два метода для трекинга: метод Лукас-Канаде и метод Хорна-Шунка, эти методы работают с плотностью и разреженностью оптических потоков.

Второй компонент, моделирование, помогает нам установить тот факт, что указанные выше методы  дают нам «шумное» измерение фактического положения объекта. Было разработано много мощных математических методов для оценки траектории объекта положение, которого было измерено с «шумами».  Эти методы применимы к двух- или трехмерным моделям объектов  и их местоположений.

Поиск угловых точек

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


А если все точки стены будут похожими или идентичными, то отследить точку в следующем фрейме будет затруднительно. С другой стороны если мы выберем уникальную точку то есть хороший шанс найти ее снова.

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


Точки в кругах хороший выбор для слежения. Точки в прямоугольниках плохой выбор.

Возвращаясь к нашей интуиции от большой белой стены, нам хочется найти точки содержащие в себе значительные изменения, например производная (strong derivative, далее SD). Оказывается, что этого недостаточно, но это только начало. Точка с которой ассоциирована SD может быть частью ребра и выглядеть как все остальные точки на протяжении ребра (см. aperture probplem).

Однако если SD наблюдается в двух ортогональных направлениях тогда мы можем предположить что точка похожа на уникальную. Из-за этой причины множество трекируемых областей называется углами (corners). Интуитивно углы – не ребра – это точки которые содержат достаточно информации чтобы быть найденными в следующем фрейме.

Самое распространенное определение углов предоставлено Харрисом. В основе его определения лежит матрица производных второго порядка


от интенсивности картинки.

Мы можем думать о производной второго порядка от изображения, взяв ее от всех точек изображения (“second-derivative images”, далее SDI) или когда объединяем все вместе чтобы получить изображение Hessian’а. Это терминология приходит из матрицы Hessian’а, которая задается для точки определенной в двухмерном пространстве.


Для угла Харриса, мы рассмотрим матрицу автокорреляции для SDI над маленьким окном около каждой точки. Такая матрица определяется как


Здесь под w[i][j] понимается вес который может быть равномерным, но часто используется для создания кругового окна или Гауссовского взвешивания. Углы по определению Харриса, это места где матрица автокорреляции для вторых производных имеет два больших собственных значений. В сущности это означает что текстура(или ребра) идут по крайней мере двух отдельных направлениях вокруг такой точки, так же как реальные углы имеют по крайней мере два ребра встречающиеся в точке. Вторые производные хороши в применении так как не обращаются к постоянным градиентам. Градиент происходит от первых производных. Если первые производные постоянны (constant), то вторые производные равны 0. Это определение имеет еще одно преимущество, когда мы рассматриваем только собственные значения матрицы автокорреляции, мы рассматриваем количества которые инвариантны к поворотам, это очень важно потому что объект может поворачиваться в процессе своего движения. Отметим что эти два собственных значения больше чем просто определяют хорошую область для трекинга; они предоставляют идентифицирующую сигнатуру для точки.

В оригинальном определении Харриса берется определитель (determinant)  от H(p), вычитается trace от H(p) (с некоторым весовым коэффициентом) и сравнивается разница с предопределенным порогом (threshold). Ши и Томаси нашли что хорошие результаты в поиске углов получаются когда меньшее из двух собственных значений больше минимального порога. Метод Ши-Томаси дает достаточно хорошие, а иногда и лучшие результаты чем метод Харриса.

Функция cvGoodFeaturesToTrack() реализует метод Ши-Томаси. Эта функция вычисляет необходимые вторые производные (используя операторы Sobel’a)  и из них вычисляет необходимые собственные значения. Потом возвращает список указателей отвечающий нашему определению хорошей точки(области) для слежения.

void  cvGoodFeaturesToTrack(
    const CvArr*    image,
    CvArr*          eigImage,
    CvArr*          tempImage,
    CvPoint2D32f*   corners,
    int*            corner_count,
    double          quality_level,
    double          min_distance,
    const CvArr*    mask          = NULL,
    int             block_size    = 3,
    int             use_harris    = 0,
    double          k             = 0.4
);

В этом случае входное изображение должно быть 8- или 32-битным (т.е.,  IPL_DEPTH_8U или  IPL_DEPTH_32F) и одноканальным. Следующие два аргумента одноканальные изображения одинакового размера. Оба tempImage и eigImage используются алгоритмом как scratch («чиркалка»). Но результирующее содержание eigImage имеет ценность. В частности, каждый вход содержит минимальное собственное значение для соответствующей точки на входном изображении.

Здесь corners это массив 32-битных точек (CvPoint2D32f) который содержит результирующие точки после работы алгоритма. Нужно выделить память под этот массив перед запуском cvGoodFeaturesToTrack(). Естественно производится выделение конечного объема памяти. corner_countуказывает макс. количество точек которые будут возвращены. После выхода из функции corner_count перезаписывается числом найденных углов (точек). Параметр quality_level минимальное собственное значение чтобы точка принялась как угловая. Фактически минимальное собственное значение используется для обрезания произведения от quality_level на самое большое нижнее собственное значение найденное на изображении. Следовательно quality_level не должен превышать 1 (типичное значение 0,10 или 0,01). min_distance гарантирует что не будет двух точек которые бы стояли ближе (считается в пикселях) указанного значения.

Опция mask это обычное изображение, интерпретируемое как Boolean значения, определяющие точки которые должны/не должны рассматриваться как углы. Если устанавливается в NULL то маска не используется. block_size это регион вокруг данного пикселя который используется для вычисления матрицы автокорреляции производных. Оказывается что лучше считать эти производные для небольшого окна чем для одной точки(block_size = 1). Если use_harris != 0 то определение Харриса используется чаще чем Ши-Томаси. Если установить use_harris в ненулевое значение то значение k (весовой коэффициент) используется для определения удельного веса данной trace’у

автокорреляционной матрицы Гессе (Hessian) по сравнению с определителем той же матрицы.

Раз вы вызвали cvGoodFeaturesToTrack() то результатом будет массив pixel locations которые вы надеетесь найти на другой подобной картинке. Аналогичный метод может быть использован при попытке связать несколько снимков, сделанных с несколько различных точек зрения. Подобные методы применяются в стереозрении (stereo vision).

Subpixel Corners

Invariant Features

Оптический поток

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





Оптический поток: целевые области (вверху слева) для слежения во времени чьи движения конвертируются в векторы скорости (вверху справа); нижние панели показывают как корридор (слева) и векторы потоков (справа) по мере того как камера продвигается в гулбь корридора.

Как работает метод Лукас-Канаде

Основная идея держится на 3 предположениях.


  1. Постоянство яркости. Пиксель не может в момент поменять яркость. Для grayscale это означает что пиксель не меняет яркость от фрейма к фрейму.
  2. «Малое перемещение»
  3. Пространственной когерентности.  Соседние точки имеют похожее движение и