Можно ли читать кадры веб-камеры параллельно?

У меня простойпитон скрипт, который захватывает веб-камеру, используяOpenCV. Моя веб-камера имеет потенциал для потоковой передачи 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.

Это проблематично, потому что результирующий видеофайл, который создается во второй части моего скрипта (который здесь не опубликован), поврежден. Эта ошибка возникает только при параллельном чтении канала веб-камеры. Когда все выполняется последовательно, видеофайл хорош, и я могу читать его без проблем.

Любое понимание очень ценится. Ура!

Редактировать: Я думаю, что также важно отметить, чтоVIDIOC_QBUF: Invalid argument Сообщения об ошибках появляются после прочтения первой пары кадров. Например, я мог запустить свой сценарий, который почти мгновенно вызвал бы эти ошибки, но затем мой сценарий мог нормально работать в течение «бесконечного» промежутка времени без каких-либо сообщений об ошибках.

Ответы на вопрос(1)

Ваш ответ на вопрос