Одна потенциальная причина может быть из-за задержки ввода / вывода при чтении кадров. Поскольку cv2.VideoCapture().read()
является операцией блокировки, основная программа останавливается до тех пор, пока кадр не будет считан с устройства камеры и не возвращен. Метод повышения производительности - создание другого потока для обработки захвата кадров в параллельно вместо того, чтобы полагаться на один поток для захвата кадров в последовательном порядке. Мы можем повысить производительность, создав новый поток, который опрашивает только новые кадры, в то время как основной поток обрабатывает / отображает самый последний кадр.
Ваш текущий подход (последовательный):
Тема 1: Захват кадра ->
Обработка кадра ->
Участок
Предлагаемый подход (параллельный):
Тема 1: Схватить кадр
from threading import Thread
import time
def get_frames():
while True:
ret, frame = cap.read()
time.sleep(.01)
thread_frames = Thread(target=self.get_frames, args=())
thread_frames.daemon = True
thread_frames.start()
Тема 2: Технологическая рамка ->
График
def process_frames():
while True:
# Grab most recent frame
# Process/plot frame
...
Имея отдельные потоки, ваша программа будет параллельной, поскольку всегда будет кадр, готовый для обработки, вместо того, чтобы ждать, пока кадр будет прочитан, прежде чем можно будет выполнить обработку.
Примечание: Этот метод даст вам повышение производительности на основе уменьшения задержки ввода / вывода. Это не является истинным увеличением FPS, так как это резкое снижение задержки (кадр всегда доступен для обработки; нам не нужно опрашивать устройство камеры и ждать, пока ввод / вывод полный).