0

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最初の数フレームを読み取った後 にエラーメッセージが表示されることに注意することも重要だと思います。たとえば、スクリプトを開始すると、ほぼ瞬時にこれらのエラーがトリガーされますが、スクリプトは「無限」の時間、エラー メッセージなしで正常に実行されます。

4

1 に答える 1