Мой вопрос:
Я работал над проектом по компьютерному зрению. Я использую 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
Что я пробовал:
multiThread - one нить просто читает кадр, другие занимаются обработкой изображений. Это НЕ то, что я хочу. , потому что я мог бы установить буферную деку, сохраняя, например, 50 кадров. но поток чтения кадров работал со скоростью ~ frame / 130ms. мой поток обработки изображений работал со скоростью ~ frame / 40ms. тогда deque просто уходит. поэтому я попробовал решение. но не то, что мне нужно.
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 или другого модуля чтения камеры.
Есть предложения?