Как ускорить opencv python

Захват потокового видео в реальном времени OpenCV идет медленно. Как отбрасывать кадры или синхронизироваться с реальным временем?

Я хотел бы настроить систему opencv для обработки потоков HLS или потоков RMTP, однако я сталкиваюсь со странной проблемой, связанной с уменьшением частоты кадров и накоплением задержки. Как будто видео становится все дальше и дальше от того места, где оно должно быть в потоке.

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

Текущий подход

Я проверил качество потока на VLC, и он, кажется, работает нормально там.

Скорость cv2

Реалистичная / ожидаемая скорость

Как ускорить opencv python. Смотреть фото Как ускорить opencv python. Смотреть картинку Как ускорить opencv python. Картинка про Как ускорить opencv python. Фото Как ускорить opencv python

Вопросов:

2 ответа

Как ускорить opencv python. Смотреть фото Как ускорить opencv python. Смотреть картинку Как ускорить opencv python. Картинка про Как ускорить opencv python. Фото Как ускорить opencv python

Моя гипотеза состоит в том, что дрожание, скорее всего, связано с сетевыми ограничениями и возникает при отбрасывании пакета кадра. Когда кадр отбрасывается, это приводит к тому, что программа отображает последний «хороший» кадр, что приводит к зависанию дисплея. Вероятно, это проблема с аппаратным обеспечением или пропускной способностью, но некоторые из них можно решить с помощью программного обеспечения. Вот некоторые возможные изменения:

В настоящее время я считаю, что read() читает слишком быстро, даже если он находится в отдельном потоке. Это может быть одной из причин, по которой все кадры появляются и объединяются в следующем кадре. Например, скажем, в течение одного секунды, он может произвести 15 новых кадров, но в течение следующего интервала в одну секунду возвращаются только 3 кадра. Это может быть связано с потерей кадров сетевого пакета, поэтому для обеспечения получения постоянной частоты кадров мы просто добавляем задержку в поток поиска кадров. Задержка для получения примерно

30 FPS делает хорошую работу по «нормализации» частоты кадров и сглаживанию перехода между кадрами в случае потери пакетов.

Примечание. Мы должны попытаться сопоставить частоту кадров в потоке, но я не уверен, что такое FPS веб-камеры, поэтому я только предположил 30 FPS. Кроме того, обычно вместо прямого промежуточного веб-сервера используется прямая ссылка на поток, что может значительно повысить производительность.

Попытка потоков

Я пытался это решение Натанси с небольшим успехом.

Это включает в себя:

Нервный, но результаты в реальном времени

Потоковое работает. Он поддерживает в режиме реального времени. Однако создается впечатление, что все кадры объединяются и внезапно врываются в видео. Я хотел бы, чтобы кто-нибудь объяснил это.

Возможности для совершенствования

Поток в реальном времени можно найти здесь.

Возможность того, что потоки читаются неправильно.

Источник

How to change frame rate FPS of an existing video using openCV python

I am trying to change the Frame rate i.e., FPS of an existing video using openCV library in python. Below is the code that I am trying to execute. Even after setting the FPS property using cv2.CAP_PROP_FPS the video is not playing faster in the cv2.imshow() method. Even After setting the FPS property the getter returns the older FPS value. So how do I set the FPS value higher and make the video play faster?

Как ускорить opencv python. Смотреть фото Как ускорить opencv python. Смотреть картинку Как ускорить opencv python. Картинка про Как ускорить opencv python. Фото Как ускорить opencv python

1 Answer 1

If you’re only trying to play the video in the displayed window, the limiting factor is not the fps of the video but the time spent waiting with the code waitKey(10) which makes the program wait for 10ms between each frame.

The read() method of the VideoCapture class simply returns the next frame with no concept of waiting or frame rate. The only thing preventing this code running as fast as it can is the waitKey(10) section, which is thus the main factor determining speed. To change the frame rate as seen through the imshow() method, you’d need to edit the time spent waiting. This is likely the dominant factor, but not the only one as the reading of a frame does take time.

As an alternative you could investigate using something like FFMPEG which supports this relatively easily. If you want to stick with OpenCV I know from personal experience you can do this with the VideoWriter class. In this method you would read in the video frame by frame using the VideoCapture class, and then save it at the desired frame rate with VideoWriter. I suspect FFMPEG will likely meet your needs however!

Источник

OpenCV в Python. Часть 1

Привет, Хабр! Запускаю цикл статей по библиотеке OpenCV в Python. Кому интересно, добро пожаловать под кат!

Как ускорить opencv python. Смотреть фото Как ускорить opencv python. Смотреть картинку Как ускорить opencv python. Картинка про Как ускорить opencv python. Фото Как ускорить opencv python

Введение

OpenCV — это open source библиотека компьютерного зрения, которая предназначена для анализа, классификации и обработки изображений. Широко используется в таких языках как C, C++, Python и Java.

Установка

Будем считать, что Python и библиотека OpenCV у вас уже установлены, если нет, то вот инструкция для установки python на windows и на ubuntu, установка OpenCV на windows и на ubuntu.

Немного про пиксели и цветовые пространства

Перед тем как перейти к практике, нам нужно разобраться немного с теорией. Каждое изображение состоит из набора пикселей. Пиксель — это строительный блок изображения. Если представить изображение в виде сетки, то каждый квадрат в сетке содержит один пиксель, где точке с координатой ( 0, 0 ) соответствует верхний левый угол изображения. К примеру, представим, что у нас есть изображение с разрешением 400×300 пикселей. Это означает, что наша сетка состоит из 400 строк и 300 столбцов. В совокупности в нашем изображении есть 400*300 = 120000 пикселей.

В большинстве изображений пиксели представлены двумя способами: в оттенках серого и в цветовом пространстве RGB. В изображениях в оттенках серого каждый пиксель имеет значение между 0 и 255, где 0 соответствует чёрному, а 255 соответствует белому. А значения между 0 и 255 принимают различные оттенки серого, где значения ближе к 0 более тёмные, а значения ближе к 255 более светлые:

Как ускорить opencv python. Смотреть фото Как ускорить opencv python. Смотреть картинку Как ускорить opencv python. Картинка про Как ускорить opencv python. Фото Как ускорить opencv python

Цветные пиксели обычно представлены в цветовом пространстве RGB(red, green, blue — красный, зелёный, синий), где одно значение для красной компоненты, одно для зелёной и одно для синей. Каждая из трёх компонент представлена целым числом в диапазоне от 0 до 255 включительно, которое указывает как «много» цвета содержится. Исходя из того, что каждая компонента представлена в диапазоне [0,255], то для того, чтобы представить насыщенность каждого цвета, нам будет достаточно 8-битного целого беззнакового числа. Затем мы объединяем значения всех трёх компонент в кортеж вида (красный, зеленый, синий). К примеру, чтобы получить белый цвет, каждая из компонент должна равняться 255: (255, 255, 255). Тогда, чтобы получить чёрный цвет, каждая из компонент должна быть равной 0: (0, 0, 0). Ниже приведены распространённые цвета, представленные в виде RGB кортежей:
Как ускорить opencv python. Смотреть фото Как ускорить opencv python. Смотреть картинку Как ускорить opencv python. Картинка про Как ускорить opencv python. Фото Как ускорить opencv python

Импорт библиотеки OpenCV

Теперь перейдём к практической части. Первое, что нам необходимо сделать — это импортировать библиотеку. Есть несколько путей импорта, самый распространённый — это использовать выражение:

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

Загрузка, отображение и сохранение изображения

Для загрузки изображения мы используем функцию cv2.imread(), где первым аргументом указывается путь к изображению, а вторым аргументом, который является необязательным, мы указываем, в каком цветовом пространстве мы хотим считать наше изображение. Чтобы считать изображение в RGB — cv2.IMREAD_COLOR, в оттенках серого — cv2.IMREAD_GRAYSCALE. По умолчанию данный аргумент принимает значение cv2.IMREAD_COLOR. Данная функция возвращает 2D (для изображения в оттенках серого) либо 3D (для цветного изображения) массив NumPy. Форма массива для цветного изображения: высота x ширина x 3, где 3 — это байты, по одному байту на каждую из компонент. В изображениях в оттенках серого всё немного проще: высота x ширина.

С помощью функции cv2.imshow() мы отображаем изображение на нашем экране. В качестве первого аргумента мы передаём функции название нашего окна, а вторым аргументом изображение, которое мы загрузили с диска, однако, если мы далее не укажем функцию cv2.waitKey(), то изображение моментально закроется. Данная функция останавливает выполнение программы до нажатия клавиши, которую нужно передать первым аргументом. Для того, чтобы любая клавиша была засчитана передаётся 0. Слева представлено изображение в оттенках серого, а справа в формате RGB:

Как ускорить opencv python. Смотреть фото Как ускорить opencv python. Смотреть картинку Как ускорить opencv python. Картинка про Как ускорить opencv python. Фото Как ускорить opencv python

И, наконец, с помощью функции cv2.imwrite() записываем изображение в файл в формате jpg(данная библиотека поддерживает все популярные форматы изображений:png, tiff,jpeg,bmp и т. д., поэтому можно было сохранить наше изображение в любом из этих форматов), где первым аргументом передаётся непосредственно само название и расширение, а следующим параметром изображение, которое мы хотим сохранить.

Доступ к пикселям и манипулирование ими

Для того, чтобы узнать высоту, ширину и количество каналов у изображения можно использовать атрибут shape:

Важно помнить, что у изображений в оттенках серого img.shape[2] будет недоступно, так как данные изображения представлены в виде 2D массива.

Чтобы получить доступ к значению пикселя, нам просто нужно указать координаты x и y пикселя, который нас интересует. Также важно помнить, что библиотека OpenCV хранит каналы формата RGB в обратном порядке, в то время как мы думаем в терминах красного, зеленого и синего, то OpenCV хранит их в порядке синего, зеленого и красного цветов:

Cначала мы берём пиксель, который расположен в точке (0,0). Данный пиксель, да и любой другой пиксель, представлены в виде кортежа. Заметьте, что название переменных расположены в порядке b, g и r. В следующей строке выводим значение каждого канала на экран. Как можно увидеть, доступ к значениям пикселей довольно прост, также просто можно и манипулировать значениями пикселей:

В первой строке мы устанавливаем значение пикселя (0, 0) равным (255, 0, 0), затем мы снова берём значение данного пикселя и выводим его на экран, в результате мне на консоль вывелось следующее:

На этом у нас конец первой части. Если вдруг кому-то нужен исходный код и картинка, то вот ссылка на github. Всем спасибо за внимание!

Источник

Шпаргалка по OpenCV — Python

Что такое OpenCV?

Библиотека компьютерного зрения и машинного обучения с открытым исходным кодом. В неё входят более 2500 алгоритмов, в которых есть как классические, так и современные алгоритмы для компьютерного зрения и машинного обучения. Эта библиотека имеет интерфейсы на различных языках, среди которых есть Python (в этой статье используем его), Java, C++ и Matlab.

Содержание

Установка

Инструкцию по установке на Windows можно посмотреть здесь, а на Linux — здесь.

Импорт и просмотр изображения

Примечание При чтении способом выше изображение находится в цветовом пространстве не RGB (как все привыкли), а BGR. Возможно, в начале это не так важно, но как только вы начнёте работать с цветом — стоит знать об этой особенности. Есть 2 пути решения:

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

На протяжении статьи для вывода изображений будет использоваться следующий код:

Кадрирование

Как ускорить opencv python. Смотреть фото Как ускорить opencv python. Смотреть картинку Как ускорить opencv python. Картинка про Как ускорить opencv python. Фото Как ускорить opencv python

Как ускорить opencv python. Смотреть фото Как ускорить opencv python. Смотреть картинку Как ускорить opencv python. Картинка про Как ускорить opencv python. Фото Как ускорить opencv python

Пёсик после кадрирования

Изменение размера

Как ускорить opencv python. Смотреть фото Как ускорить opencv python. Смотреть картинку Как ускорить opencv python. Картинка про Как ускорить opencv python. Фото Как ускорить opencv python

Как ускорить opencv python. Смотреть фото Как ускорить opencv python. Смотреть картинку Как ускорить opencv python. Картинка про Как ускорить opencv python. Фото Как ускорить opencv python

После изменения размера на 20 %

Эта функция учитывает соотношение сторон оригинального изображения. Другие функции изменения размера изображений можно увидеть здесь.

Поворот

Как ускорить opencv python. Смотреть фото Как ускорить opencv python. Смотреть картинку Как ускорить opencv python. Картинка про Как ускорить opencv python. Фото Как ускорить opencv python

Как ускорить opencv python. Смотреть фото Как ускорить opencv python. Смотреть картинку Как ускорить opencv python. Картинка про Как ускорить opencv python. Фото Как ускорить opencv python

Пёсик после поворота на 180 градусов

Перевод в градации серого и в чёрно-белое изображение по порогу

Как ускорить opencv python. Смотреть фото Как ускорить opencv python. Смотреть картинку Как ускорить opencv python. Картинка про Как ускорить opencv python. Фото Как ускорить opencv python

Как ускорить opencv python. Смотреть фото Как ускорить opencv python. Смотреть картинку Как ускорить opencv python. Картинка про Как ускорить opencv python. Фото Как ускорить opencv python

Пёсик в градациях серого

Как ускорить opencv python. Смотреть фото Как ускорить opencv python. Смотреть картинку Как ускорить opencv python. Картинка про Как ускорить opencv python. Фото Как ускорить opencv python

gray_image — это одноканальная версия изображения.

Функция threshold возвращает изображение, в котором все пиксели, которые темнее (меньше) 127 заменены на 0, а все, которые ярче (больше) 127, — на 255.

Для ясности другой пример:

Здесь всё, что темнее, чем 150, заменяется на 10, а всё, что ярче, — на 200.

Остальные threshold-функции описаны здесь.

Размытие/сглаживание

Как ускорить opencv python. Смотреть фото Как ускорить opencv python. Смотреть картинку Как ускорить opencv python. Картинка про Как ускорить opencv python. Фото Как ускорить opencv python

Как ускорить opencv python. Смотреть фото Как ускорить opencv python. Смотреть картинку Как ускорить opencv python. Картинка про Как ускорить opencv python. Фото Как ускорить opencv python

Функция GaussianBlur (размытие по Гауссу) принимает 3 параметра:

Больше про размытие здесь.

Рисование прямоугольников

Как ускорить opencv python. Смотреть фото Как ускорить opencv python. Смотреть картинку Как ускорить opencv python. Картинка про Как ускорить opencv python. Фото Как ускорить opencv python

Как ускорить opencv python. Смотреть фото Как ускорить opencv python. Смотреть картинку Как ускорить opencv python. Картинка про Как ускорить opencv python. Фото Как ускорить opencv python

Обводим прямоугольником мордочку пёсика

Эта функция принимает 5 параметров:

Рисование линий

Как ускорить opencv python. Смотреть фото Как ускорить opencv python. Смотреть картинку Как ускорить opencv python. Картинка про Как ускорить opencv python. Фото Как ускорить opencv python

Как ускорить opencv python. Смотреть фото Как ускорить opencv python. Смотреть картинку Как ускорить opencv python. Картинка про Как ускорить opencv python. Фото Как ускорить opencv python

2 пёсика, разделённые линией

Функция line принимает 5 параметров:

Текст на изображении

Как ускорить opencv python. Смотреть фото Как ускорить opencv python. Смотреть картинку Как ускорить opencv python. Картинка про Как ускорить opencv python. Фото Как ускорить opencv python

Как ускорить opencv python. Смотреть фото Как ускорить opencv python. Смотреть картинку Как ускорить opencv python. Картинка про Как ускорить opencv python. Фото Как ускорить opencv python

Изображение с текстом

Функция putText принимает 7 параметров:

Распознавание лиц

На этот раз без пёсиков.

Как ускорить opencv python. Смотреть фото Как ускорить opencv python. Смотреть картинку Как ускорить opencv python. Картинка про Как ускорить opencv python. Фото Как ускорить opencv python

Как ускорить opencv python. Смотреть фото Как ускорить opencv python. Смотреть картинку Как ускорить opencv python. Картинка про Как ускорить opencv python. Фото Как ускорить opencv python

detectMultiScale — общая функция для распознавания как лиц, так и объектов. Чтобы функция искала именно лица, мы передаём ей соответствующий каскад.

Функция detectMultiScale принимает 4 параметра:

Contours — распознавание объектов

В этой статье детально описано обнаружение объектов с помощью цветовой сегментации. Всё, что вам нужно для неё, находится там.

Сохранение изображения

Заключение

OpenCV — отличная библиотека с лёгкими алгоритмами, которые могут использоваться в 3D-рендере, продвинутом редактировании изображений и видео, отслеживании и идентификации объектов и людей на видео, поиске идентичных изображений из набора и для много-много чего ещё.

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

Источник

Как быстро поднять OpenCV with CUDA для Python и С++ без компиляции 2.5 часа

Как ускорить opencv python. Смотреть фото Как ускорить opencv python. Смотреть картинку Как ускорить opencv python. Картинка про Как ускорить opencv python. Фото Как ускорить opencv python

Маленькая предыстория … хотя СТОП, нет времени, надо дальше «пилить» :).

Задачи руководства:

Ускорить внедрения поддержки NVIDIA CUDA для OpenCV и использования с Python или С++.

Решаема проблема:

Компиляция OpenCV с CUDA, может занимать более 2.5 часов.

Решение

Версии пакетов:

Данная реализация проверялась на следующих версиях пакетов:

Таблица версий пакетов:

ПакетВерсия
1ОСWin 7 x64 SP1, Win 10
2NVIDIA CUDA, cuDNN9.2, 10.x 9.2
3OpenCV4.4.x
4Python3.7

1. Сделать архив папки pythonsite-package/cv2 ( просто чтобы был на всякий)

Содержит следующие файлы:

1. opencv_world440.dll

2. opencv_img_hash440.dll

3. cv2.cp37-win_amd64.pyd

Как ускорить opencv python. Смотреть фото Как ускорить opencv python. Смотреть картинку Как ускорить opencv python. Картинка про Как ускорить opencv python. Фото Как ускорить opencv python

Рис. 1. Содержание архива rls_python_opencv_cuda.7z

Удивляет размер библиотеки, но что удивительно всё это добро жмётся в

3. Распаковать CUDA_bin_v9.2.7z в любую папку и прописать в PATH системы

К папке CUDA/bin и CUDA/libvnn

Примечание: Важно, CUDA_bin_v9.2.7z можно и не качать, если у вас установлена одна из версий CUDA( проверить какая версия подходит для какой карты можно по [3]). Содержит в себе папку к откомпилированными библиотеками CUDA, качать релизы других версий можно по ссылке [4] .

Поэтому данный шаг можно и пропустить

4. Затем прописать в вашем коде, там где открывается модель сети следующее:

net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)

net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)

или качаем готовый пример [5]

Возможные трудности:

На нескольких машинах была такая ошибка при запуске python приложения

«CUDA driver version is insufficient for CUDA runtime version….».

Которая решалась установкой новых драйверов NVIDIA по ссылке [4].

Ссылки на ресурсы для скачивания откомпилированной сборки:

Так же понятно, что данная библиотека подходить не только для программирования для Python? Но так же может быть использована для программирования на С++

Ссылки на литературу, где описывается процесс компиляции:

(Очень подробно описан процесс, по нему и делал)

ЗЫ : Если кто то подобное сделал уже или тоже есть откомпилированные библиотеки под Linux, дайте знать.

ЗЗЫ: Так же рад буду любой критике (хотя не люблю её, шутка без неё саморазвития нету), только будьте добрее.

О песочнице

Это «Песочница» — раздел, в который попадают дебютные посты пользователей, желающих стать полноправными участниками сообщества.

Если у вас есть приглашение, отправьте его автору понравившейся публикации — тогда её смогут прочитать и обсудить все остальные пользователи Хабра.

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

О модерации

Не надо пропускать:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *