Jump to content
Compvision.ru
2expres

Детектор движения на FFMPEG

Recommended Posts

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

Share this post


Link to post
Share on other sites

Можно написать декодер ручками на fmpeg и подключить фильтр для получения motion vectors: пример.

Только кажется, что игра не стоит свеч: есть работы по детектору движения и трекингу на основе этих векторов, мы сами в АМД пробовали их использовать. Но их качество очень плохое для применения именно в этих целях. И очевидно почему: цельку кодека является не поиск истинного движения или изменений в кадре, а минимизация сжимаемой информации. То есть ему выгодней найти ложные вектора движения блоков, если они в результате дадут меньше передаваемой информации.

  • Like 1

Share this post


Link to post
Share on other sites
В 30.03.2019 at 11:55, Nuzhny сказал:

подключить фильтр для получения motion vectors

Nuzhny спасибо!!! Для получения motion vectors нужно использовать av_frame_get_side_data. Работает ли фильтр, если кадры декодированы аппаратно с dxva2? Я подключил dxva2 для декодирования h.264 (Загрузка процессора близка к 0). Но копирование из памяти dxva2  в память процессора av_hwframe_transfer_data занимает много процессорного времени (до 70% INTEL ATOM Z8350 на Full HD). Занимает ли этот фильтр много времени? Для меня основной смысл в применения motion vectors - это высокое быстродействие детектора движения. Я хочу применить его для обнаружения движущегося автомобиля в кадре.

P.S. Можно из dxva2 переписывать не весь кадр, а часть кадра?

Share this post


Link to post
Share on other sites

Да, должно работать.

Утверждать ничего не буду, но обычно копируется весь кадр. Посмотри, как это делается в ffmpeg: функция dxva2_transfer_data. Там лочится поверхность, что означает копирование всего содержимого из видео в системную память (указатель в LockedRect содержится). А потом уже из системной памяти копируется куда надо.

Трудно сказать, что будет происходить на Атоме, почему там такая высокая загрузка на этой операции. Когда лочится поверхность, находящаяся в видеопамяти дискретной видеокарты, то память копируется с помощью DMA, минуя процессор. То есть мы получаем задержку, но процессор остаётся свободен. Тут же дискретной видеокарты нет и память просто копируется из системной в системную? Я не знаю.

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


  • Recently Browsing   0 members

    No registered users viewing this page.

×