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

Recommended Posts

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

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


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

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

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

  • Like 1

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


Ссылка на сообщение
Поделиться на других сайтах
В 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 переписывать не весь кадр, а часть кадра?

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


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

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

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

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

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


Ссылка на сообщение
Поделиться на других сайтах
В 30.03.2019 at 11:55, Nuzhny сказал:

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

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

Вы оказались правы получается много векторов и смысла их использовать для детектора движения нет, потому что это получается не быстро. Следуя заветам Смородова резко сократил объем информации, проредив кадр в 4 раза по высоте и 4 раза по ширине. Причем, прореживаю по ширине методом суммирования пикселей, чтобы иметь максимальную информацию о кадре (на быстродействии это не сказывается). Из последовательности сокращенных в 16 раз кадров формирую фон. Фон формируется за ~ 25 сек (600 кадров). Каждый кадр сравнивается с фоном, производится корректировка фона и получаю изображение разницы с фоном. Разница сегментируется. Если в сегменте меньше 1000 пикселей (исходное 16 000 пикселей), то такой сегмент отбрасывается. Для больших сегментов получаем прямоугольники, которые рисую на картинке. В этих прямоугольниках в дальнейшем буду искать автомобильные номера, что резко сократит объем обрабатываемой информации. Так как у меня примитивный детектор движения, получаю ложные срабатывания когда ветер качает ветки деревьев. Можно ли простыми методами от этого избавится?

 

Изображение с FFmpeg я получаю (почему то?) в формате NV12. Преобразовывать в RGB это все время. Поэтому я использую для детектора движения интенсивность (оттенки серого) и таблицу цветов, для быстрого вывода на экран использую только интенсивность. Для определения номеров цветность не нужна.

Итого: Intel Atom Z8350 загрузка процессора около 15%!

Камера Full HD иногда дает глюки, на видео видно (1 мин 16 сек). Я думал что это из-за моих преобразований на FFmpeg. Подключив VLC этих глюков там как бы не больше. С чем это может быть связано?

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


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

Неплохо получилось.

1. Ложные срабатывания на качающихся деревьях и проводах можно легко отбросить с помощью простой оценки плотности:

N_pix / A_bb > alpha, где

  * N_pix - число пикселей переднего плана внутри прямоугольника;

* A_bb - площадь прямоугольника (width * height);

* 0 < alpha < 1, например alpha = 0.3.

Физический смысл очень просто: когда качается ветка или провод, то прямоугольник получается большим, а самого объекта в нём очень мало. Если плотность больше некоторого небольшого alpha, то объект реальный. Иначе отбрасывать.

 

2. NV12, YUV420, YUV422, YUV444 - это нормально для h.264, RGB там не бывавет.

 

3. Глюки сигнализируют о том, что потерялся кадр. Причин может быть много:

- потерялся в сети, тут можно уменьшить битрейт, можно снизить частоту ключевых кадров;

- не успевает декодер - можно попробовать другой, лучше аппаратный;

- у тебя однопоточное приложение и все действия (декодирование, детекция, отображение) в сумме занимают больше 1000 / fps млсек. Тогда кадры будут время от времени отбрасываться.

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


Ссылка на сообщение
Поделиться на других сайтах
53 минуты назад, Nuzhny сказал:

Физический смысл очень просто: когда качается ветка или провод, то прямоугольник получается большим, а самого объекта в нём очень мало. Если плотность больше некоторого небольшого alpha, то объект реальный. Иначе отбрасывать.

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

58 минут назад, Nuzhny сказал:

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

Я выбрал максимальный битрейд 15 000 кбит/сек и 25 кадров в секунду для FULL HD, так как хочу получить максимальное качество. Реально в диспетчере задач вижу загрузку ~1000 кбит/сек.

1 час назад, Nuzhny сказал:

не успевает декодер - можно попробовать другой, лучше аппаратный;

Я использую DXVA2. Еще могу d3d11. Разницы между ними не увидел. Чем они отличаются?

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

1 час назад, Nuzhny сказал:

у тебя однопоточное приложение

Я запускаю 6 потоков: декодер, управляющий поток и 4 потока обработки кадров, т.к. в Intel Atom Z8350 имеет 4 ядра. Декодер заполняет одну из 4 областей памяти и передает сообщение (setenent) управляющему потоку. Управляющий поток дает разрешение на обработку в один из 4 обработчиков. По окончании обработки обработчик передает сообщение в управляющий поток.

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


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

Тогда так просто с дивана трудно сказать в чём причина. Реально так и происходит, когда некоторых ресурсов не хватает или есть просадки по времени: в кадре появляется большой объект или движение самой камеры, поток с камеры резко возрастает на P или B frames и они не успевают декодироваться либо теряются. Ведь битрейт - это что-то среднее в секунду, а тут резкое в 1-2 кадра увеличение изменений. Можешь ещё поставить fixed bitrate, если камера это умеет.

Кстати, а какая частота I-frames? Обычно он идёт раз в 1-2 fps, то есть у тебя каждый 25-50 кадры.

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


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

 

6 минут назад, Nuzhny сказал:

Кстати, а какая частота I-frames? Обычно он идёт раз в 1-2 fps, то есть у тебя каждый 25-50 кадры.

1 раз в секунду.

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×