-
Количество публикаций
102 -
Зарегистрирован
-
Посещение
-
Days Won
3
Сообщения, опубликованные пользователем 2expres
-
-
Я использовал dxva2. Работает и с потоком и с файлами h264. Ты сам собирал ffmpeg или брал готовую сборку?
-
В 28.08.2019 at 21:11, Nuzhny сказал:а для начала просто поиграть со встроенными функциями из OpenCV
Пытался разобраться с методами, искал коэффициент, который отвечает за меру похожести. Например, при 0 коэффициенте должно быть абсолютное совпадение, при 1 очень приблизительное совпадение. Такого коэффициента в формулах нет.
Проверил практически, создал картинку из 2-х цветов. Затем осветлил и затемнил, получив еще 2 картинки. Результаты:
Method 0 Perfect, Base-Half, Base-Test(1), Base-Test(2) : 1 / 0.974776 / -0.000545 / -0.000545
Method 1 Perfect, Base-Half, Base-Test(1), Base-Test(2) : 0 / 0.221103 / 1.3576 / 1.3576
Method 2 Perfect, Base-Half, Base-Test(1), Base-Test(2) : 1.3576 / 1.3576 / 0 / 0
Method 3 Perfect, Base-Half, Base-Test(1), Base-Test(2) : 0 / 0.0956222 / 1 / 1Т.е. гистограммы картинок абсолютно не похожи, но картинки то похожи по цвету!
Я сделал вывод, что сравнение на подобие картинок с помощью гистограмм в OpenCV не работает, можно сравнивать, только абсолютно одинаковые картинки.
Буду проверять свою следующую методику:
Полученную гистограмму, буду размывать по методу Гаусса. Это и будет коэффициентом на подобие, малая размывка гистограммы - проверка на одинаковость, сильная размывка гистограммы - проверка на подобие. Затем применяю любой метод расстояний, даже Евклидово расстояние. Если при сравнении цвета находятся в соседних корзинах, то размывка перебросит часть значений по соседним корзинам и гистограммы начнут совпадать. Может я не вижу подводных камней?
-
В 24.08.2019 at 22:50, Nuzhny сказал:Самый простой и быстрый способ, который используется в том числе в particle filter - это сравнение гистограмм.
Нужный, спасибо за развернутый ответ. Заинтересовала работа с гистограммами цветов. На практике столкнулся с трудностями, даже правильное определение цвета авто не такое простое дело.
Честно, запутался в интегралах, расстояниях Кульбака-Лейблера и Бхатачарья. Интересует сравнение двух гистограмм на подобие. Беру примитивный пример: картинка из двух цвета. Из первой картинки делаю вторую, меняя контрастность (можно яркость). Их гистограммы приведены на рисунке.
Если при сравнении применить Евклидово расстояние, то получаю, что картинки сильно отличаются. А мне нужно получить расстояние, близкое к 0. Выше перечисленные методы дадут результат, близкий к 0 и как?
-
16 часов назад, Smorodov сказал:Используется еще вектор скорости. Предполагается что объекты инертны, и векторы скорости быстро не меняют.
Ну еще копайте разные фильтры Кальмана и иже с ними.
Фильтры Калмана также исходят из этого предположения. Для авто это может и подходит, для людей нет. Пример: спортсмен под номером 2 догоняет номер 1 и два объекта некоторое время находятся вместе, затем один обгоняет другого. Фильтр Калмана даст однозначный результат, что это номер 2. А это не всегда так, номер 1 мог ускорится.
Другой пример у меня в видео по теме. Сцена на которой артисты или танцоры. Их траектории движений абсолютно не предсказуемы.
Нужны признаки объекта по которым их можно различать. -
Тема старая, но интересная. Сейчас продолжаю тему "Трекинг человека".
На всех видео выше камера закреплена, поэтому можно применить детектор движения, в котором кадры сравниваются с предварительно вычисленным задним фоном - BackGround. Фон адаптируется сравнением с кадром, если интенсивность кадра больше фона, то к фону добавляем константу, меньше - отнимаем. Чем больше константа, тем быстрее обновляется фон. Я выбрал 0,5 и при 25 кадрах в секунду у меня фон полностью обновляется через 10-20 сек (зависит от контрастности кадров).Если изображение 3-канальное (R,G,B), то и BackGround также должен иметь 3 канала.
Каждый поступающий кадр вычитаю с фоном, возвожу в квадрат и суммирую по 3 составляющим. Суммарную разницу сравниваю с константой-порогом, больше порога - объект, меньше - фон. Получаю бинарное черно-белое изображение, которое сегментирую. При сегментации использую третью константу-минимальное количество точек в сегменте, которая зависит от поставленной задачи. Хотя для слежения за пешеходами можно дополнительно применять и размеры сегмента, причем высота должна быть больше, чем ширина.
Выполняю привязку полученных сегментов к объектам. Для этого сравниваю таблицу объектов с таблицей сегментов и по минимальному расстоянию делаю назначения. Все просто, если объекты разделены и не пересекаются. Сложности начинаются, когда объекты сходятся в один объект, а затем расходятся, при этом путается нумерация объектов.
Получается, что нужно предварительно вычислить какие-то признаки объектов, по которым я их мог бы различать. Как это можно сделать, желательно примитивным способом и с высоким быстродействием? -
4 часа назад, Nuzhny сказал:Также можно в каждом объекте хранить его модель движения: в простейшем виде это просто скорость: сколько пикселей за 1 кадр он проходит по Х и по У.
Многое стало понятно, введу максимальную скорость перемещения объекта, что позволит отсекать глюки.
Возникли новые технические трудности: информация с потоков может поступать не по-порядку. Вначале информация о настоящем кадре, а затем о предыдущем. Необходимо еще реализовать буфер для выравнивания последовательности поступающих кадров.
-
28 минут назад, Smorodov сказал:во время трекинга синтезировать фоновое изображение, сложением изображений включенных в данный момент прожекторов ( предполагаем известным)
Рад Вас видеть!
Хорошая идея зная какие ветки люстры включены подставлять нужный фон, заранее сформированный.
Проблема в том что мы выполняем часть работы: даем команду какую ветку включать в соответствии с перемещаемыми людьми. Другие ребята делают еще какие то эффекты (меняют цвета, освещенность) и у меня нет информации о фоне.
3 часа назад, Nuzhny сказал:Ну, результаты детекции выглядят очень неплохо. Просто применить классический венгерский алгоритм разве не получится? В качестве метрики между объектами использовать расстояние Жаккарда (IoU) - отношение пересечения прямоугольников к объединению. Кажется, что работать будет и быстро, и точно
Спасибо Nuzhny за Ваши ответы!
Можно для меня разжевать? Мне действительно не понятно. Венгерский алгоритм - это задача о оптимизации. После обработки кадра из 3 МБайт(Full HD) информации я получаю массив не более 256 байт (1 объект 16 байт), поэтому могу позволить сделать не оптимально. Хочу понять суть. Получается я должен сравнить 2 соседних кадра. Предположим на 1-кадре 4 сегмента, а на 2 кадре тоже 4 сегмента. Я должен назначить назначить привязку сегментов к объектам. На первом кадре назначаю номер сегмента равным номеру объекта. На втором кадре допустим для простоты (выбор метрики сейчас не важен можно площадь пересечения или как предлагают по ссылке искать коэффициенты https://cyberleninka.ru/article/v/algoritm-trekinga-obektov-v-realnom-vremeni-s-obrabotkoy-oshibok) ищу минимальное расстояние между центрами сегментов и объектов. Далее присваиваю сегменту номер ближайшего объекта. С этим понятно. Понятно, если появился или исчез объект на краях кадра. А что делать, если появился или исчез сегмент в центре кадра? Как определить это глюк, или 2 человека рядом дошли до середины сцены и разделились? Или наоборот зашли с разных концов сцены и объединились?
-
Выполнил включение освещение сцены чисто по детектору движения, без трекинга. Камера работает в ИК-диапазоне. Для управления освещением использовал midi-протокол (библиотека rtmidi), виртуальный драйвер midi, который управляет освещением сцены (стандартная программа QLC+). На видео Вы можете видеть квадрат на полу, который имитирует размеры люстры. Вот что получилось:
Обрабатываются все 25 кадров в секунду.
В 04.06.2019 at 14:00, Nuzhny сказал:популярнее сейчас поиск максимального потока в графе, например.
Хотелось бы реализовать трекинг. Но приведенная ссылка является научной статьей, у которой еще 50 ссылок на другие статьи. Мне необходимо усреднять 5 соседних кадров для устранения дерганий и пропадания объекта. Как правильно это сделать?
-
1 час назад, LexaP сказал:Обучил сетку искать головы, адаптировал под железо. Обучение на разных цветовых моделях.
Это видео облегченные условия. Здесь прекрасно работает мой детектор движения. Но значительно быстрее, обрабатывает 25 кадров с загрузкой 15%. Но с резким изменением освещенности он не работает.
- 1
-
8 минут назад, Nuzhny сказал:Очевидно, что классическое вычитание фона тут не справится, потому что оно смотрит на изменение интенсивности пикселей. Первая мысль - избавиться от цвета, то есть перейти в цветовое пространство типа HSV или Lab, а далее работать исключительно с каналом интенсивности (V или L). Далее использовать dense optical flow, например Farneback, получить поле векторов. Далее это поле уже сегментировать (kmeans или что-то сложнее). Результатом сегментации должны стать уже блобы и фон.
Интенсивность, к сожалению будет тоже разной (интенсивность подсветки разная). На мой взгляд нужно сравнивать 2 соседних кадра и каким то образом не сравнивать кадры с большими изменениями. Но как будет работать при большом количестве людей?
kmeans - тормознутый алгоритм, а нужен реал-тайм.
5 минут назад, LexaP сказал:К сожалению скачать ролик с ютуба не могу, пишет запрещен доступ.
Могу сбросить на почту. Напишите в личку.
-
12 минуты назад, LexaP сказал:я бы поступил банальным образом.
Обучил сетку искать головы, адаптировал под железо. Обучение на разных цветовых моделях.
Пример как это у меня работает (на arm)
А можно ли вашу программу запустить на этом видео? Если работает - могу дать Вам контакты заказчика.
-
1 час назад, Nuzhny сказал:То есть никакого детектора нет? Есть возможность снимать камерой с датчиком глубины? Или камерой в ИК диапазоне?
Я не знаю, как построить детектор движения с обычной камерой в условиях резкого изменения освещения.
Я сам пришел к выводу, что нужна камера в ИК-диапазоне, но нужно несколько дней доставка/установка/запись видео. Но остается теоретический вопрос, можно ли построить детектор движения с обычной камерой в таких условиях?
-
Потолок этого помещения состоит из множества разноцветных люстр и прожекторов. Когда человек перемещается необходимо управлять освещением и подсвечивать человека. Трудность состоит в том, что для детектора движения невозможно создать background из-за постоянно изменяющегося освещения. Для любого объекта, который перемещается в кадре, нужно вычислять координаты и управлять освещением. Людей может быть много, они могут уходить и приходить.
-
Добрый день!
Необходимо отслеживать перемещения людей (идеально головы человека), при постоянно изменяющемся освещении. Цвет может быть красным, зеленым, синим, дневное освещение и может постоянно меняться. Можно ли стандартными методами и какими решить данную задачу?
-
6 минут назад, Nuzhny сказал:Кстати, а какая частота I-frames? Обычно он идёт раз в 1-2 fps, то есть у тебя каждый 25-50 кадры.
1 раз в секунду.
-
1. Это студенческая задача?
2. Это одно изображение или есть множество таких изображений?
3. Если есть множество таких изображений, то эту задачу решается применением нейронных сетей, т.к. быстродействие здесь не требуется.
-
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 обработчиков. По окончании обработки обработчик передает сообщение в управляющий поток.
-
В 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 этих глюков там как бы не больше. С чем это может быть связано?
-
Основная проблема у Вас - неравномерное освещение. Вам нужно использовать бестеневую лампу, чтобы на изображении не было бликов. Далее нужно бинаризировать изображение с помощью адаптивного порога (я использовал 17х17 -8). После удаления мелких сегментов можно по вертикальным линиям определить масштаб (сколько пикселей в одном мм) изображения. Зная масштаб можно определить размеры измеряемой детали. Результат после бинаризации.:
-
В 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 переписывать не весь кадр, а часть кадра?
-
Для создания потока h.264 внутри камеры работает кодер на основе детектора движения, который отлавливает изменения между кадрами. Декодер восстанавливает кадры. Как можно получить информацию с декодера об изменениях в кадре?
-
11 час назад, Nuzhny сказал:Например, команда "ffmpeg -hwaccels" выведен список доступных аппаратных кодеков.
Мне для аппаратного декодирования нужен qsv (Intel Quick Sync Video). Но на сайте ffmpeg читаю:
- Ensure the target machine has a supported CPU. Current versions only support gen8/gen9 graphics on expensive CPUs ("Xeon"/"Core i" branding). The same graphics cores on cheaper CPUs ("Pentium"/"Celeron"/"Atom" branding) are explicitly disabled, presumably for commercial reasons.
Т.е. для Pentium и процессоров ниже отключена аппаратная поддержка по коммерческим причинам.
cv::CAP_MSMF - не работает с rtsp потоком (Хотя Microsoft Media Foundation вроде ж должна поддерживать).
Что применить???
-
В 29.01.2019 at 09:25, Nuzhny сказал:Попробуй принудительно изменить backend у capture: CAP_FFMPEG, CAP_DSHOW или CAP_VFW. Они выбираются по очереди, какой первый подойдёт. Возможно, что у тебя первый в списке как раз не аппаратный.
У меня процессор Intel Pentium n3710 с графическим ядром INTEL HD GRAPHICS. Если верить данной таблице https://www.wikizero.com/en/Intel_Graphics_Technology, то данное графическое ядро позволяет декодировать 2k 30 кадров в секунду.
Открываю файл 1080p, кодек h264 с принудительно заданным backend ffmpeg:cv::VideoCapture cam( "2.mp4", cv::CAP_FFMPEG);Загрузка процессора от 25 до 60%.Открываю данный файл, используя Microsoft Media Foundation:cv::VideoCapture cam( "2.mp4", cv::CAP_MSMF);Загрузка процессора от 10 до 25%. Почему так происходит?! Насколько я читал ffmpeg использует аппаратное декодирование. -
10 минут назад, Nuzhny сказал:Слишком всё это в отрыве от современных тенденций в индустрии.
Я понимаю, что сейчас в моде применение нейронных сетей и обучение. Но любой метод имеет свои плюсы и недостатки. Так же и мой подход (сегментация+контурный анализ) имеет свои плюсы и минусы. Мне требуются качественные кадры не хуже чем в папке Короля. Но я на этой папке тестировал https://www.openalpr.com/cloud-api.html
Это современная программа на нейронных сетях. Очень классно определяет едва видимые номера (высота символов до 6 пикселей). Но на папке Короля, она хватило сил проверить только по букве А (~634 фото) она правильно определила 87%. Со средним временем определения 600 мс на их сервере. Создалось впечатление, что она может видеть едва различимые номера и пропустить явный номер.
Применение своего метода вижу в 3-х вариантах:
1) Дополнение к "серьезной" программе для улучшения показателей.
2) Распознавание номера внутри камеры (Смарт-камера), например, на Intel Atom Z8350.
3) Недорогое решение для парковок, моек, стоянок с камерой за 50 баксов и сервером за 80 баксов https://ru.aliexpress.com/item/Z83II-Mini-PC-Windows-10-Intel-Atom-X5-Z8350-Quad-Core-2-4G-5-8G-WiFi/32843080625.html?spm=a2g0v.search0302.3.10.3dc52b62XmAJcN&ws_ab_test=searchweb0_0,searchweb201602_0_10084_10083_10887_10307_321_453_322_454_10902_10618_536_10065_317_537_10068_319_10059_10103_10884_10696,searchweb201603_0,ppcSwitch_0&algo_pvid=fb3d334a-aa48-40f5-a05c-df0e49103814&algo_expid=fb3d334a-aa48-40f5-a05c-df0e49103814-1
VideoCapture аппаратное декодирование
в OpenCV
Опубликовано · Report reply
Возьми сборку зераное https://ffmpeg.zeranoe.com/builds/
качаешь 2 архива shared и dev перед этим выбрав 32 или 64 бит. В архиве dev хранятся библиотеки (.lib) и include. Архив shared содержит необходимые .dll которые необходимо будет переписать в папку с вашей будущей программой - это для Windows.