У меня есть простой сценарий Python, который захватывает веб-камеру, используя OpenCV. My webcam имеет потенциал для потока 30 FPS, но так как мой Raspberry Pi не достаточно мощный, я могу читать только ~ 20 FPS. При запуске скрипта одно ядро моего процессора достигает 100%, но остальные ядра нетронуты, поэтому я пытаюсь разделить показания на большинство потоков, которые я могу, чтобы максимально использовать мой процессор потенциал и легко достигать 30 FPS.Можно ли параллельно просматривать рамки веб-камеры?
Так можно ли параллельно просматривать рамки веб-камеры?
Это моя попытка:
import numpy as np
import cv2
import time
from threading import Thread
CV_CAP_PROP_FPS = 5
cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
out = cv2.VideoWriter('output.avi', fourcc, cap.get(CV_CAP_PROP_FPS), (640, 480))
threads = []
class MyThread(Thread):
def run(self):
ret, frame = cap.read()
if __name__ == '__main__':
try:
while(cap.isOpened()):
thread = MyThread()
thread.start()
threads.append(thread)
time.sleep(0.035)
except KeyboardInterrupt:
for thread in threads:
thread.join()
cap.release()
out.release()
При выполнении этого сценария, я получаю пару VIDIOC_QBUF: Invalid argument
в моем терминале (обычно 4 раза). Чем больше значение сна, тем меньше сообщений об ошибках я получаю. Например, если я time.sleep(0.1)
, я могу получить 2-3 сообщения об ошибках вместо 4.
Это проблематично, потому что полученный видеофайл, который генерируется во второй части моего скрипта (который не размещен здесь), поврежден. Эта ошибка возникает только при параллельном чтении веб-камеры. При выполнении всего последовательно видеофайл хорош, и я могу читать его без проблем.
Любое понимание очень ценится. Ура!
Edit: Я думаю, что это также важно отметить, что VIDIOC_QBUF: Invalid argument
сообщения об ошибках произойдет после прочтения первой пары кадров. Например, я мог бы запустить свой скрипт, который почти мгновенно инициировал бы эти ошибки, но тогда мой скрипт мог бы работать отлично для «бесконечного» количества времени без сообщений об ошибках.