Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Видеофайл->вектора движения  (Прочитано 3198 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн moonstruck

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Видеофайл->вектора движения
« : 06 Августа 2009, 11:46:41 »
Здравствуйте. У меня есть вопрос по теме, связанной с декодированием видео.

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

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

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Видеофайл->вектора движения
« Ответ #1 : 06 Августа 2009, 16:40:17 »
FFmpeg.
Причем, лучше скачать из SVN, компилируется легко.

Для использования три библиотеки линкуют: -lavcodec -lavformat -lavutil
pkg-config --cflags ffmpeg или pkg-config --lflags ffmpeg  выдадут все нужные флаги.

В исходниках есть примеры, на сайте ffmpeg есть ссылки на обучающие материалы.
Хотя, документация довольно бедна, и лучший источник информации - исходники.

Что-то типа такого должно получиться:

av_open_input_file(...)
av_find_stream_info(..)
codec=avcodec_find_decoder(...)
avcodec_open()
while(!is_exit()){
  AVFrame *frame;
  av_read_frame(input)
  avcodec_decode_video2(   )

}

В итоге, в frame появляется декодированная картинка, там же есть поля
uint8_t *mbskip_table;
int16_t (*motion_val[2])[2];
uint32_t *mb_type;

Вероятно, это то, что нужно.

Использование IPP мне представляется стрельбой из пушки по воробьям.
Тогда уж стоит взглянуть в сторону OpenCV, где эта библиотека широко используется.

FFmpeg можно на этапе ./configure оптимизировать под свои нужды, отключив все ненужные кодеки, форматы и девайсы - это уменьшит размер библиотек.
« Последнее редактирование: 06 Августа 2009, 16:45:21 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн moonstruck

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Видеофайл->вектора движения
« Ответ #2 : 06 Августа 2009, 17:32:31 »
Большое спасибо за ответ, сижу разбираюсь. Действительно, в motion_val записываются вектора движения, только надо установить специальную опцию для декодера AVCodecContext.debug_mv = 1.

У меня сейчас как раз таки используется в программе OpenCV для работы с видео, но она в свою очередь использует функции FFMpeg для декодирования. Просто мне необходимо вытащить из видео вектора движения, видимо для этого придется написать свои функции для декодирования, на основе примеров, имеющихся в исходниках FFmpeg.

Правда пока не совсем понятно, в каком виде лежат виктора движения в таблице motion_val.
« Последнее редактирование: 06 Августа 2009, 21:56:28 от moonstruck »

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Видеофайл->вектора движения
« Ответ #3 : 06 Августа 2009, 18:48:57 »
Я думаю, что можно взять уже готовые векторы из внутренних структур OpenCV - там же есть доступ ко всему.

Есть архивированные списки рассылки FFmpeg (один из архивов я запустил :) ), можно там поискать информацию.

http://www.nabble.com/libav-users-f35196.html
http://dir.gmane.org/index.php?prefix=gmane.comp.video.ffmpeg

Там же где-то есть ссылки на исходную страницу этих списков.
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн moonstruck

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Видеофайл->вектора движения
« Ответ #4 : 06 Августа 2009, 20:42:40 »
Спасибо за ссылки :)

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

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Видеофайл->вектора движения
« Ответ #5 : 07 Августа 2009, 11:24:14 »
Я имею в виду вот что.
Когда OpenCV использует FFmpeg для открытия файла и декодирования видео, где-то в памяти при этом должны быть созданы FFmpeg-овские структуры AVFormatContext, AVCodecContext, AVPacket  и AVFrame, и указатели на них должны храниться где-то внутри OpenCV-шных структур. Соответственно, ничто не сможет помешать вставить в программу код типа
AVFormatContext *input;
// blah-blah-blah, инициализация, открытие файла, чтение данных
input=(AVFormatContext *)(opencv_structure->private->private_again->data);

И вуаля, у нас все есть. :)
Поможет RTFS.
Главное - отловить, где эта структура разрушается функцией free (или av_close_input_stream), чтобы не работать с повисшим указателем.
« Последнее редактирование: 07 Августа 2009, 11:39:52 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн moonstruck

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Видеофайл->вектора движения
« Ответ #6 : 07 Августа 2009, 12:45:26 »
У меня уже от RTFS голова болит если честно :)

А в OpenCV, как известно, для выхватывания кадров из видео используются функциии cvGrabFrame и cvRetriveFrame.Функции эти не имеют однозначного определения :)
То есть,  в качестве параметра они получают указатель, полученный, например, при помощи CvCreateFileCapture. Этот указатель определяет какие версии этих функций будут использоваться  для работы (например, использующие ffmpeg, gstreamer, qt  и т.п.) Каждая такая пара функций   (cvGrabFrame и cvRetriveFrame) определена в своем классе, у которого среди параметров действительно есть нужный нам AVFrame, из которого можно вытянуть таблицу векторов движения (по крайней мере для версии, работающей с ffmpeg это так). Однако это поле закрытое. То есть, как вариант можно немного переписать исходники, чтобы получить к нему доступ.

Но я тут еще поисследовал таблицу векторов движения, ее еще надо корректно интерпретировать, что вообщето нетривиальная задача. Для этого вроде можно задействовать функцию ff_print_debug_info, объявленную в mpegvideo.h, но опять же ее надо будет подправить (она просто рисует вектора движения поверх декодированного фрейма).

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Видеофайл->вектора движения
« Ответ #7 : 07 Августа 2009, 19:12:08 »
А высчитать смещение от начала класса не получится? ;) (dirty hack, he-he!)
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн moonstruck

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Видеофайл->вектора движения
« Ответ #8 : 10 Августа 2009, 08:38:09 »
Так, ну вроде более-менее разобрался :)

Просто высчитать смещения то можно, но я имел ввиду немного другое. Во первых, видеокадры в видеопоследовательностях кодируются по разному. Например, есть так называемые ключевые кадры (I-frame), которые слабо сжимаются и служат опорными для остальных. Для этих кадров вектора движения вообще не считаются :).
Кроме того, в таблицы содержатся вектора движения не для отдельных пикселей, а для макроблоков, которые в зависимости от кодека могут иметь размер 16х16, 8х8 или 4х4, или же вообще иметь переменный размер :)

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

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Видеофайл->вектора движения
« Ответ #9 : 10 Августа 2009, 15:24:36 »
Просто высчитать смещения-то можно,

Я о другом.
Я вот о чем:

AVFormatContext *input;
cvCapture *capture;
int offset;
...
capture=cvCreate ... Capture( ... );
input=(AVFormatContext *)(capture + offset);

А уже потом этот input можно подсовывать функции ff_print_debug_info или (почти) любой другой из libav*

Значение offset можно высчитать руками на бумажке, просуммировав sizeof() того, что находится до input.

Понятно, что тогда программа, весьма вероятно, будет привязана строго к определенной версии OpenCV, но это не страшно. :)
« Последнее редактирование: 10 Августа 2009, 17:48:09 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн moonstruck

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Видеофайл->вектора движения
« Ответ #10 : 10 Августа 2009, 15:35:41 »
Интересный способ.
Можно будет попробовать :)
Правда программа должна работать и под Linux и под Windows, не думаю что offset будет совпадать.

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Видеофайл->вектора движения
« Ответ #11 : 10 Августа 2009, 17:49:42 »
Тоже нет проблем

#ifdef WIN32
int offset =  ...
#else
int offset = ...
#endif
Но, вроде бы, не с чего оффсету разному быть.
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн moonstruck

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Видеофайл->вектора движения
« Ответ #12 : 12 Августа 2009, 11:51:28 »
Хм, еще одна проблемка возникла.

Для того, чтобы при работе декодера заполнялся массив motion_val необходимо задать параметр AVCodecContext.debug_mv = 1. Однако в этом случае вектора всегда рисуются на изображении, а мне нужно всего лишь их считать. Если не задавать параметр AVCodecContext.debug_mv = 1, то в motion_val ничего не записывается.



Пользователь решил продолжить мысль 13 Августа 2009, 12:39:13:
Разобрался :)

Если написать AVCodecContext.debug_mv = FF_DEBUG_MV, то массив motion_val заполняется, а вектора не рисуются :)
« Последнее редактирование: 13 Августа 2009, 12:39:13 от moonstruck »

Оффлайн snable

  • Новичок
  • *
  • Сообщений: 3
  • (код ffmpeg) == (зло)
    • Просмотр профиля
Re: Видеофайл->вектора движения
« Ответ #13 : 14 Сентября 2009, 19:06:32 »
А никто не расскажет как эти вектора там хранятся?
Или хотя-бы подскажите где есть информация по этой теме  ;)
Ато я уже неделю пытаюсь найти хоть какую-то нормальную инфу... и все время натыкаюсь не туда... :-[
Расп... Студент я :-)

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Видеофайл->вектора движения
« Ответ #14 : 15 Сентября 2009, 14:32:21 »
Или хотя-бы подскажите где есть информация по этой теме  ;)
Ато я уже неделю пытаюсь найти хоть какую-то нормальную инфу... и все время натыкаюсь не туда... :-[

Хха! Неделя - это тьфу!  :coolsmiley:
Я уже почти два года с этим работаю - не могу сказать, что досконально во всем разобрался.
В 2008 году авторы FFmpeg собрались организовать Book of Wisdom, но, похоже, потрендели и разошлись - там всего пара страниц текста.
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

 

Страница сгенерирована за 0.02 секунд. Запросов: 21.