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