OpenCVを使用してウェブカメラをキャプチャする簡単なPythonスクリプトがあります。私のウェブカメラは 30 FPS をストリーミングできる可能性がありますが、私のRaspberry Piは十分に強力ではないため、〜 20 FPS しか読み取ることができません。スクリプトを実行すると、CPU の 1 つのコアが 100% に最大化されますが、残りのコアは変更されないため、CPU を最大限に使用するために、読み取りを可能な限り多くのスレッドに分割しようとしています。可能性があり、簡単に 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 回)。スリープ値が大きいほど、エラー メッセージが少なくなります。たとえば、 I の場合time.sleep(0.1)
、4 ではなく 2 ~ 3 のエラー メッセージが表示される可能性があります。
スクリプトの 2 番目の部分 (ここには掲載されていません) で生成された結果のビデオ ファイルが破損しているため、これは問題です。このエラーは、Web カメラ フィードを並行して読み取る場合にのみ発生します。すべてを順番に実行すると、ビデオ ファイルは良好で、まったく問題なく読み取ることができます。
どんな洞察も大歓迎です。乾杯!
編集:VIDIOC_QBUF: Invalid argument
最初の数フレームを読み取った後
にエラーメッセージが表示されることに注意することも重要だと思います。たとえば、スクリプトを開始すると、ほぼ瞬時にこれらのエラーがトリガーされますが、スクリプトは「無限」の時間、エラー メッセージなしで正常に実行されます。