cv2 показать видеопоток и добавить оверлей после завершения другой функции

В настоящее время я работаю над проектом по обнаружению лиц в реальном времени.

Что я сделал, так это то, что я захватываю кадр с помощью cv2, выполняю обнаружение, а затем показываю результат с помощью cv2.imshow (), что приводит к низкому fps.

Я хочу, чтобы на экране отображалось видео с высокой частотой кадров без задержек, а также наложение ограничивающей рамки с низкой частотой кадров.

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

Любая помощь приветствуется!

Спасибо!


person Wenbin Xu    schedule 01.11.2018    source источник


Ответы (1)


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

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

Другой подход может заключаться в добавлении слоя отслеживания объекта. Запустите свой тяжелый алгоритм, чтобы найти ROI, а затем используйте библиотеку отслеживания объектов, чтобы удерживать их до следующего запуска алгоритма обнаружения.

Надеюсь, это имело смысл.

person Rupaksh Paul    schedule 01.11.2018
comment
Спасибо за ответ, Рупакш :) Я сам рассмотрел первый подход, проблема в том, что время обработки алгоритма обнаружения может колебаться, в результате чего частота кадров может варьироваться от 15 до 30 кадров в секунду в зависимости от того, сколько лиц находится в кадре. Если я использую первый подход, мне, возможно, придется установить частоту каждые 15 кадров, что является самой низкой производительностью. - person Wenbin Xu; 01.11.2018
comment
Мое идеальное решение - запустить два разных потока, первый просто просто покажет видеопоток с камеры, второй будет выполнять обнаружение и после получения результата добавить ограничивающую рамку в качестве наложения на видеопоток. Но я не знаю, как это реализовать. А не могли бы вы разработать свой второй подход? Спасибо! - person Wenbin Xu; 01.11.2018
comment
Я новичок во всем этом. Когда вы говорите, что рассматриваете возможность многопоточности, как бы вы добавили новые блоки во фрейм? Возможно, это действительно простой вопрос, но у меня нет опыта работы с потоками. - person Rupaksh Paul; 01.11.2018
comment
Хорошо, я нашел здесь второй подход - pyimagesearch.com/2018/07/23/simple-object-tracking-with-opencv Я не мог заставить его работать на себя, но, возможно, вам повезет больше. Ваше здоровье! Дай мне знать, как дела. - person Rupaksh Paul; 01.11.2018
comment
Мне удалось это сделать, используя потоки, мьютекс и глобальную переменную. Я создал несколько глобальных переменных, которые используются в двух функциях. Первая функция считывает кадр с камеры, а затем проверяет ограничивающий прямоугольник глобальной переменной, если он не равен None, добавляет ограничивающий прямоугольник в кадр, а затем распечатывает кадр. Вторая функция получает рамку глобальной переменной (полученную первой функцией), выполняет обнаружение и распознавание и изменяет ограничивающий прямоугольник и идентичность глобальных переменных. Я добавляю мьютекс к операциям, связанным с ограничивающей рамкой и переменной идентичности на случай сбоя. - person Wenbin Xu; 02.11.2018
comment
Спасибо за идеи и вдохновение :) - person Wenbin Xu; 02.11.2018
comment
Интересный подход! Большое спасибо за помощь. Не могли бы вы указать мне правильное направление для изучения многопоточности и мьютексов в Python? У меня нет опыта работы в CS, так что мои знания в этих областях очень приблизительны. - person Rupaksh Paul; 05.11.2018
comment
Я тоже новичок в многопоточности. Я узнал лишь некоторые базовые знания и концепцию многопоточности и мьютексов. Если вы новичок в этой области, я бы посоветовал потратить некоторое время на ознакомление с основными концепциями. Затем, если вы хотите реализовать концепции, вы можете сначала решить, какой язык вы хотите использовать, потому что реализация на разных языках может быть совершенно разной. Затем вы просто ищете в Интернете, как реализовать некоторые функции, кодировать и решать одну проблему за другой. Удачи на этом поприще :) - person Wenbin Xu; 06.11.2018