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

У меня есть простой скрипт Python, который захватывает веб-камеру с помощью Открыть резюме. Моя веб-камера может вести потоковую передачу 30 кадров в секунду, но поскольку мой Raspberry Pi недостаточно мощный, я могу читать только ~ 20 кадров в секунду. При запуске сценария одно ядро ​​​​моего процессора максимально загружено до 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 появляются после чтения первых нескольких кадров. Например, я мог бы запустить свой сценарий, который почти мгновенно вызвал бы эти ошибки, но тогда мой сценарий мог бы нормально работать в течение «бесконечного» времени без каких-либо сообщений об ошибках.


person maximedupre    schedule 02.10.2015    source источник


Ответы (1)


При ожидании полного чтения первого кадра перед запуском большого количества потоков VIDIOC_QBUF: Invalid argument исчезает!

...
try: 
    ret, frame = cap.read()
    while(cap.isOpened()):
        thread = MyThread()
        thread.start()
        threads.append(thread)
        time.sleep(0.035)
...

Обратите внимание, что даже если все ядра ЦП используются с этим алгоритмом, максимальный FPS, которого я смог достичь, составляет 24.

person maximedupre    schedule 12.10.2015