как сделать cv2.videoCapture.read () быстрее? - PullRequest
1 голос
/ 14 января 2020

Мой вопрос:

Я работал над проектом по компьютерному зрению. Я использую opencv (4.1.2) и python для его реализации.

Мне нужен более быстрый способ передачи рамки считывания в обработку изображений на моем компьютере (Ubuntu 18.04, 8 ядер, i7, 3,00 ГГц, память 32 ГБ). cv2.VideoCapture.read() рамка считывания (размер кадра: 720x1280) займет около 120 ~ 140 мс. , что слишком медленно. мой модуль обработки занимает около 40 мс за цикл. И нам нужно 25 ~ 30 FPS.

Вот мой демонстрационный код:

import cv2
from collections import deque
from time import sleep, time
import threading


class camCapture:
    def __init__(self, camID, buffer_size):
        self.Frame = deque(maxlen=buffer_size)
        self.status = False
        self.isstop = False
        self.capture = cv2.VideoCapture(camID)


    def start(self):
        print('camera started!')
        t1 = threading.Thread(target=self.queryframe, daemon=True, args=())
        t1.start()

    def stop(self):
        self.isstop = True
        print('camera stopped!')

    def getframe(self):
        print('current buffers : ', len(self.Frame))
        return self.Frame.popleft()

    def queryframe(self):
        while (not self.isstop):
            start = time()
            self.status, tmp = self.capture.read()
            print('read frame processed : ', (time() - start) *1000, 'ms')
            self.Frame.append(tmp)

        self.capture.release()

cam = camCapture(camID=0, buffer_size=50)
W, H = 1280, 720
cam.capture.set(cv2.CAP_PROP_FRAME_WIDTH, W)
cam.capture.set(cv2.CAP_PROP_FRAME_HEIGHT, H)


# start the reading frame thread
cam.start()

# filling frames
sleep(5)

while True:
  frame = cam.getframe() # numpy array shape (720, 1280, 3)

  cv2.imshow('video',frame)
  sleep( 40 / 1000) # mimic the processing time

  if cv2.waitKey(1) == 27:
        cv2.destroyAllWindows()
        cam.stop()
        break

Что я пробовал:

  1. multiThread - one нить просто читает кадр, другие занимаются обработкой изображений. Это НЕ то, что я хочу. , потому что я мог бы установить буферную деку, сохраняя, например, 50 кадров. но поток чтения кадров работал со скоростью ~ frame / 130ms. мой поток обработки изображений работал со скоростью ~ frame / 40ms. тогда deque просто уходит. поэтому я попробовал решение. но не то, что мне нужно.

  2. this topi c - это дискуссия, которую я выяснил и которая наиболее близка к моему вопросу. но, к сожалению, я попробовал принятые решения (оба из двух ниже обсуждения).

Одно из решений (6 шесть больших пальцев вверх) указывает на то, что он мог читать и сохранять 100 кадров с 1 се c интервалами на его ма c. почему моя машина не может справиться с работой по чтению кадров? Я что-то пропустил? моя установка использовала conda и pip conda install -c conda-forge opencv, pip install opencv-python (да, я пробовал оба.)

Другой вариант решения (1 палец вверх) с использованием решения ffmpeg. но, похоже, работает с видеофайлом, а не с камерой?

Adjust c2.waitKey (): параметр просто контролирует частоту при отображении видео. не решение.

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

приведенный выше код - это мой демонстрационный код, я хочу, чтобы какой-то метод или руководство ускорили мой videoCapture.read (). может быть, способ использовать многопоточность внутри объекта videoCapture или другого модуля чтения камеры.

Есть предложения?

1 Ответ

0 голосов
/ 15 января 2020

Long.

Я проверил, используя следующие настройки и каким-то образом, если вы увеличите размер кадра, opencv уменьшит общее количество кадров в секунду. Может быть, это ошибка.

1920x1080: FPS: 5,0, ширина: 1920,0, высота: 1080,0, задержка = 150 мс

https://imgur.com/Vab61cF

1280x720: FPS: 10,0, Ширина: 1280,0, Высота: 720,0, задержка = 60 мс

https://imgur.com/QN6tsAO

640x480: FPS: 30,0, ширина: 640,0, высота: 480,0, задержка = 5 мс

https://imgur.com/RqkWSdK

Но при использовании других приложений, таких как cheese , мы по-прежнему получаем полные 30 кадров в секунду при разрешении 1920x1080. Пожалуйста, обратите внимание, что установка значения CAP_PROP_BUFFERSIZE также не поможет.

Так что возникнет вопрос: «Как мы можем преодолеть это?». На этом этапе у вас есть только 2 варианта:

  1. Уменьшить разрешение кадра до 640x480
  2. Использовать другой фреймворк

Надеюсь, это поможет.

...