Smorodov 578 Report post Posted May 7, 2009 Пример программки определяющей движение в кадре по шаблонам движения. Архив проекта здесь:MotionTemplates.rar Описание на русском языке здесь: MotionTemplates.pdf Share this post Link to post Share on other sites
RinOS 16 Report post Posted August 31, 2009 Спасибо)) Классный пример! Возник вопрос... Эта программа после обработки каждых 4 кадров, возвращает нам CvRect, Есть ли какой ни будь достаточно простой способ, узнать всю траеткторию движения объекта? То есть проследить его путь. Share this post Link to post Share on other sites
Smorodov 578 Report post Posted August 31, 2009 Спасибо)) Классный пример! Возник вопрос... Эта программа после обработки каждых 4 кадров, возвращает нам CvRect, Есть ли какой ни будь достаточно простой способ, узнать всю траеткторию движения объекта? То есть проследить его путь. // при первом проходе присвоить 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
RinOS 16 Report post Posted August 31, 2009 Можно просто x и y записывать (правда может не очень точно получится), зато ошибка копиться не будет. Что нам даст запись по x, y? По моему это не вариант... К примеру на рисунке 2 объекта, или более, взяли мы первые 4 кадра и обработали как нам узнать где на следующих 4 кадрах, находится каждый из этих объектов. По просту говоря нужно составить массив CvRect для каждого объекта, это и будет его путь. Share this post Link to post Share on other sites
Smorodov 578 Report post Posted August 31, 2009 Что нам даст запись по x, y? По моему это не вариант... К примеру на рисунке 2 объекта, или более, взяли мы первые 4 кадра и обработали как нам узнать где на следующих 4 кадрах, находится каждый из этих объектов. По просту говоря нужно составить массив CvRect для каждого объекта, это и будет его путь. Конечно, если нам надо отслеживать несколько объектов, то можно запоминать где какие объекты в последний раз были и их скорости, если мы знаем скорости, то мы примерно можем прикинуть, где ожидать появления этого объекта на следующем кадре. Даже если траектории пересекаются, учитывая инерционность движения, можно достаточно устойчиво трекать каждый из объектов. Естественно нужен фильтр, т.к. может быть много помех. Фильтровать можно по положению и скорости (тоже меняется не мгновенно), если знать направление и величину скорости, то если объект отклонился больше чем на значение заданного порогового значения, его не учитывать (или считать новым объектом). Неплохо работает в таких случаях фильтр Калмана. Share this post Link to post Share on other sites
RinOS 16 Report post Posted August 31, 2009 Фильтр Калмана должен вычисляется для каждого объекта предыдущем шаге, чтобы спрогнозировать его местоположение в следующем шаге? Правильно я понял? В OpenCV я так думаю нет такой функции? Share this post Link to post Share on other sites
Smorodov 578 Report post Posted August 31, 2009 Фильтр Калмана должен вычисляется для каждого объекта предыдущем шаге, чтобы спрогнозировать его местоположение в следующем шаге? Правильно я понял? В 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
RinOS 16 Report post Posted August 31, 2009 Эх)) пример и в правду есть... Я даже его видел раньше, только не понял... там какая то змейка по кругу движется)) За доки спасибо) почитаю) Неправильно думаете есть даже пример правда там для кругового движения (одномерный случай), у Вас будет двумерный C:\Program Files\OpenCV\samples\c\kalman.c Скорее многомерный) Share this post Link to post Share on other sites
RinOS 16 Report post Posted September 22, 2009 Как я отписался в другом топике Кальман не подходит) тк для того что бы запустить предсказание нужно знать уже где будет объект в следующем кадре, а это и есть задача... Share this post Link to post Share on other sites
Smorodov 578 Report post Posted September 24, 2009 Как я отписался в другом топике Кальман не подходит) тк для того что бы запустить предсказание нужно знать уже где будет объект в следующем кадре, а это и есть задача... Фильтр Кальмана - это прежде всего фильтр. Он не может предсказывать, но за то, может откорректировать то что Вы намеряли (рассчитали). Вы же определяете координаты объектов в текущий момент времени. Так-же можно определить положения и в следующий момент. Потом скорректировать значения координат используя фильтр. Разделение объектов можно производить по признаку максимальной схожести свойств объекта на предыдущем и следующем кадре. В качестве такого свойства можно принять скорость, можно добавить еще что нибудь допустим, координаты и цвет. Share this post Link to post Share on other sites
Alexxey593 0 Report post Posted October 4, 2009 на картинке в книге О'Релли, человек двигает руками и программа выдает сообщение, когда тот примет положение Y. Интересно, что человек и его руки там отображаются целиком (как бы залитыми), а не только границы движущихся объектов. Есть предположения, как этого можно добиться? Просто исходников этого примера там нет. Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted October 4, 2009 на картинке в книге О'Релли, человек двигает руками и программа выдает сообщение, когда тот примет положение Y. Интересно, что человек и его руки там отображаются целиком (как бы залитыми), а не только границы движущихся объектов. Есть предположения, как этого можно добиться? Просто исходников этого примера там нет. Возможно, что это делается с помощью CamShift'a. В последнем OpenCV есть интересный пример camshiftdemo.exe. Как раз на эту тему. Share this post Link to post Share on other sites
Alexxey593 0 Report post Posted October 5, 2009 Пример в книге по теме шаблонов... А с камшифтом пока не разбирался... Share this post Link to post Share on other sites
RinOS 16 Report post Posted October 16, 2009 Есть предположения, как этого можно добиться? Просто исходников этого примера там нет. В книге написано что "распознование" Y, делается с помощью моментов (CvMoments), только к сожалению, я не понял тему про моменты, что это такое и с чем его едят( Если кто то напишет хоть маленький либез по ним буду очень благодарен. Share this post Link to post Share on other sites
Smorodov 578 Report post Posted October 16, 2009 В книге написано что это делается с помощью моментов (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
Cfr 1 Report post Posted October 17, 2009 Фильтр Кальмана - это прежде всего фильтр. Он не может предсказывать, но за то, может откорректировать то что Вы намеряли (рассчитали). Вы же определяете координаты объектов в текущий момент времени. Так-же можно определить положения и в следующий момент. Потом скорректировать значения координат используя фильтр. Как-то я запутался. Фильтр Калмана может предсказывать (экстраполировать), это одна из фаз его работы (предсказание текущего (или следующего) состояния, затем коррекция). Share this post Link to post Share on other sites
Smorodov 578 Report post Posted October 17, 2009 Как-то я запутался. Фильтр Калмана может предсказывать (экстраполировать), это одна из фаз его работы (предсказание текущего (или следующего) состояния, затем коррекция). Да, предсказание учитывается при поступлении данных, филитр просто следит, чтобы полученное значение не сильно отклонялась от ожидаемого. Но предсказание, в случае движения твердого тела, на требует наличия такого сложного фильтра, как фильтр кальмана, достаточно просто знать, что твердые тела обладают массой, которая не позволяет меняться координате скачкообразно, как, собственно и скорости. Отсюда формулы предсказания: x=x0+v*dt и v=v0+a*dt. Линейная интерполяция, в данном случае, вполне годится. Как видите, фильтра тут никакого не нужно Share this post Link to post Share on other sites
RinOS 16 Report post Posted October 19, 2009 В общем есть проблемка... Предположим 2 объекта движутся друг за другом, но шаблоны движения распознают их как один движущийся объект, а это не есть гуд (( Для наглядности см анимацию: Как сделать так что бы, различичать что это не 1 объект движется, а 2? Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted October 20, 2009 Можно попробовать уменьшить количество циклических буферов до 2 (в примере обозначается как N). Share this post Link to post Share on other sites
RinOS 16 Report post Posted October 20, 2009 Не поможет, тк в этом случае лишь градиент короче, а 2 движущихся объекта с примерно одинаковой скоростью, так и будут казаться одним целым... тут нужно другое решение... только вот какое? Share this post Link to post Share on other sites
Cfr 1 Report post Posted October 20, 2009 Не поможет, тк в этом случае лишь градиент короче, а 2 движущихся объекта с примерно одинаковой скоростью, так и будут казаться одним целым... тут нужно другое решение... только вот какое? Надо строить модель движения. Share this post Link to post Share on other sites
RinOS 16 Report post Posted October 21, 2009 Надо строить модель движения. Поясни! Каким образом? Share this post Link to post Share on other sites
Smorodov 578 Report post Posted October 22, 2009 Поясни! Каким образом? Есть такой вариант. 1. для начала укоротить хвосты 2. после получения картинки провести бинаризацию. (может быть этот шаг и не нужен) 3. Выделить контуры. 4. Каждый контур на отдельный слой. 5. Дальше стандартный подход. Share this post Link to post Share on other sites
bgp-router 0 Report post Posted February 17, 2010 Здравствуйте, товарищи! Для тех, кто интересуется шаблонами движения, а не фильтром Кальмана могу порекомендовать исходники товарища Кима по адресу: 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
Smorodov 578 Report post Posted February 18, 2010 Думаю Вам стоит посмотреть эти темы: 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