Перейти к содержимому
Compvision.ru
Smorodov

Шаблоны движения (motion templates)

Recommended Posts

MotionTemplates.jpg

Пример программки определяющей движение в кадре по шаблонам движения.

Архив проекта здесь:MotionTemplates.rar

Описание на русском языке здесь: MotionTemplates.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо)) Классный пример!

Возник вопрос...

Эта программа после обработки каждых 4 кадров, возвращает нам CvRect,

Есть ли какой ни будь достаточно простой способ, узнать всю траеткторию движения объекта?

То есть проследить его путь.

682ca71b8348.gif

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Спасибо)) Классный пример!

Возник вопрос...

Эта программа после обработки каждых 4 кадров, возвращает нам CvRect,

Есть ли какой ни будь достаточно простой способ, узнать всю траеткторию движения объекта?

То есть проследить его путь.

682ca71b8348.gif

// при первом проходе присвоить X и Y равными x и y а дальше по циклу.

// Центр прямоугольника

x = comp_rect.x + comp_rect.width/2;

y= comp_rect.y + comp_rect.height/2;

// Вектор скорости

vx = cvRound( magnitude*cos(angle*CV_PI/180));

vy = cvRound( magnitude*sin(angle*CV_PI/180));

X+=vx;

// Ось перевернута

Y-=vy;

Можно просто x и y записывать (правда может не очень точно получится), зато ошибка копиться не будет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Можно просто x и y записывать (правда может не очень точно получится), зато ошибка копиться не будет.

Что нам даст запись по x, y?

По моему это не вариант... К примеру на рисунке 2 объекта, или более, взяли мы первые 4 кадра и обработали

как нам узнать где на следующих 4 кадрах, находится каждый из этих объектов.

По просту говоря нужно составить массив CvRect для каждого объекта, это и будет его путь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Что нам даст запись по x, y?

По моему это не вариант... К примеру на рисунке 2 объекта, или более, взяли мы первые 4 кадра и обработали

как нам узнать где на следующих 4 кадрах, находится каждый из этих объектов.

По просту говоря нужно составить массив CvRect для каждого объекта, это и будет его путь.

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

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

Естественно нужен фильтр, т.к. может быть много помех.

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

Неплохо работает в таких случаях фильтр Калмана.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Фильтр Калмана должен вычисляется для каждого объекта предыдущем шаге, чтобы спрогнозировать его местоположение в следующем шаге? Правильно я понял?

В OpenCV я так думаю нет такой функции?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Фильтр Калмана должен вычисляется для каждого объекта предыдущем шаге, чтобы спрогнозировать его местоположение в следующем шаге? Правильно я понял?

В OpenCV я так думаю нет такой функции?

Неправильно думаете есть даже пример :) правда там для кругового движения (одномерный случай), у Вас будет двумерный

C:\Program Files\OpenCV\samples\c\kalman.c

Вот лучшие материалы которые у меня есть по этой теме:

SIGGRAPH2001_CoursePack_08.pdf и SIGGRAPH2001_Slides_08.pdf.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Эх)) пример и в правду есть... Я даже его видел раньше, только не понял... там какая то змейка по кругу движется))

За доки спасибо) почитаю)

Неправильно думаете есть даже пример правда там для кругового движения (одномерный случай), у Вас будет двумерный

C:\Program Files\OpenCV\samples\c\kalman.c

Скорее многомерный)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


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

Фильтр Кальмана - это прежде всего фильтр.

Он не может предсказывать, но за то, может откорректировать то что Вы намеряли (рассчитали).

Вы же определяете координаты объектов в текущий момент времени.

Так-же можно определить положения и в следующий момент.

Потом скорректировать значения координат используя фильтр.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

на картинке в книге О'Релли, человек двигает руками и программа выдает сообщение, когда тот примет положение Y. Интересно, что человек и его руки там отображаются целиком (как бы залитыми), а не только границы движущихся объектов. Есть предположения, как этого можно добиться? Просто исходников этого примера там нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
на картинке в книге О'Релли, человек двигает руками и программа выдает сообщение, когда тот примет положение Y. Интересно, что человек и его руки там отображаются целиком (как бы залитыми), а не только границы движущихся объектов. Есть предположения, как этого можно добиться? Просто исходников этого примера там нет.

Возможно, что это делается с помощью CamShift'a. В последнем OpenCV есть интересный пример camshiftdemo.exe. Как раз на эту тему.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Есть предположения, как этого можно добиться? Просто исходников этого примера там нет.

В книге написано что "распознование" Y, делается с помощью моментов (CvMoments), только к сожалению, я не понял тему про моменты, что это такое и с чем его едят(

Если кто то напишет хоть маленький либез по ним буду очень благодарен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В книге написано что это делается с помощью моментов (CvMoments), только к сожалению, я не понял тему про моменты, что это такое и с чем его едят(

Если кто то напишет хоть маленький либез по ним буду очень благодарен.

Маленький (совсем) ликбез :)

PDF: О_моментах_контура.pdf

DOC (для жаждущих творчества :) ): MyDocs.rar

Пример проекта здесь: http://www.compvision.ru/forum/index.php?showtopic=4

другой проект здесь: http://www.compvision.ru/forum/index.php?showtopic=6

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Фильтр Кальмана - это прежде всего фильтр.

Он не может предсказывать, но за то, может откорректировать то что Вы намеряли (рассчитали).

Вы же определяете координаты объектов в текущий момент времени.

Так-же можно определить положения и в следующий момент.

Потом скорректировать значения координат используя фильтр.

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

Поделиться сообщением


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

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

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

Отсюда формулы предсказания: x=x0+v*dt и v=v0+a*dt.

Линейная интерполяция, в данном случае, вполне годится.

Как видите, фильтра тут никакого не нужно :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В общем есть проблемка...

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

Для наглядности см анимацию:

MN0zDi4UTW.gif4B04s0PHBk.gif

Как сделать так что бы, различичать что это не 1 объект движется, а 2?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно попробовать уменьшить количество циклических буферов до 2 (в примере обозначается как N).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


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

Надо строить модель движения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Надо строить модель движения.

Поясни! Каким образом?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Поясни! Каким образом?

Есть такой вариант.

1. для начала укоротить хвосты :)

2. после получения картинки провести бинаризацию. (может быть этот шаг и не нужен)

3. Выделить контуры.

4. Каждый контур на отдельный слой.

5. Дальше стандартный подход.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Здравствуйте, товарищи!

Для тех, кто интересуется шаблонами движения, а не фильтром Кальмана могу порекомендовать исходники товарища Кима по адресу:

http://cs-people.bu.edu/bk518/hw2-Kim/

Русская объяснялка шаблонов движения лежит на:

http://blog.vidikon.com/?p=55

Кто-нибудь может, пожалуйста, порекомендовать ещё исходники с примерами записи HMI в файлы или XML файлы и вычислением махаланобисовой дистанции Ху моментов как у Бобика, Дэвиса и Брадского?

В моём распоряжении находится 360° камера fish eye

http://www.mobotix.com/rus_RU/%D0%9F%D1%80...Hemispheric-Q24

Привинтил её через ffmpeg к OpenCV под линухом. Мечтаю с её помощью распознавать динамические жесты с помощью шаблонов движения.

Всем привет!

Роман Ауслендер

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Думаю Вам стоит посмотреть эти темы:

http://www.compvision.ru/forum/index.php?showtopic=74

http://www.compvision.ru/forum/index.php?showtopic=6

http://www.compvision.ru/forum/index.php?showtopic=84

http://www.compvision.ru/forum/index.php?showtopic=16

http://www.compvision.ru/forum/index.php?showtopic=52

Есть вопрос, а зачем записывать MHI, и что Вы под этим понимаете?

И еще вопрос, какие жесты Вы собираетесь распознавать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×