Jump to content
Compvision.ru
Sign in to follow this  
Smorodov

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

Recommended Posts

MotionTemplates.jpg

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

682ca71b8348.gif

Share this post


Link to post
Share on other sites
Спасибо)) Классный пример!

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

Эта программа после обработки каждых 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 записывать (правда может не очень точно получится), зато ошибка копиться не будет.

Share this post


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

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

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

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

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

Share this post


Link to post
Share on other sites
Что нам даст запись по x, y?

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

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


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

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

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

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

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

SIGGRAPH2001_CoursePack_08.pdf и SIGGRAPH2001_Slides_08.pdf.

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


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

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

Share this post


Link to post
Share on other sites
Есть предположения, как этого можно добиться? Просто исходников этого примера там нет.

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

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

Share this post


Link to post
Share on other sites
В книге написано что это делается с помощью моментов (CvMoments), только к сожалению, я не понял тему про моменты, что это такое и с чем его едят(

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
Фильтр Кальмана - это прежде всего фильтр.

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

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

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

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

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

Share this post


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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

MN0zDi4UTW.gif4B04s0PHBk.gif

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


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

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

Share this post


Link to post
Share on other sites
Поясни! Каким образом?

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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 под линухом. Мечтаю с её помощью распознавать динамические жесты с помощью шаблонов движения.

Всем привет!

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

Share this post


Link to post
Share on other sites

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

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, и что Вы под этим понимаете?

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×