Поддерживается ли CAP_PROP_BUFFERSIZE
, это вполне зависит от операционной системы и серверной части.Например, 2.4 docs заявляет, что «в настоящее время поддерживается только бэкэндом DC1394 [Firewire] v 2.x», а для бэкэнда V4L, согласно коду , добавлена только поддержка9 марта 2018 года.
Самый простой нехрупкий способ отключить буфер - использовать отдельный поток;подробности см. в моих комментариях под ответом Петра Куровского.Вот код Python, который использует отдельный поток для реализации VideoCapture без буфера: (У меня не было среды opencv4nodejs.)
import cv2, Queue, threading, time
# bufferless VideoCapture
class VideoCapture:
def __init__(self, name):
self.cap = cv2.VideoCapture(name)
self.q = Queue.Queue()
t = threading.Thread(target=self._reader)
t.daemon = True
t.start()
# read frames as soon as they are available, keeping only most recent one
def _reader(self):
while True:
ret, frame = self.cap.read()
if not ret:
break
if not self.q.empty():
try:
self.q.get_nowait() # discard previous (unprocessed) frame
except Queue.Empty:
pass
self.q.put(frame)
def read(self):
return self.q.get()
cap = VideoCapture(0)
while True:
frame = cap.read()
time.sleep(.5) # simulate long processing
cv2.imshow("frame", frame)
if chr(cv2.waitKey(1)&255) == 'q':
break
Поток устройства чтения кадров инкапсулирован внутри пользовательского класса VideoCapture
и взаимодействует сосновной поток проходит через очередь.
Этот ответ предлагает использовать cap.grab()
в потоке читателя, но документы не гарантируют, что grab()
очистит буфер, поэтому это может сработатьв некоторых случаях, но не в других.