2015-10-02 2 views
0

У меня есть простой сценарий 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 сообщения об ошибках произойдет после прочтения первой пары кадров. Например, я мог бы запустить свой скрипт, который почти мгновенно инициировал бы эти ошибки, но тогда мой скрипт мог бы работать отлично для «бесконечного» количества времени без сообщений об ошибках.

ответ

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.