2017-04-06 15 views
0

QMediaPlayerでビデオ入力を取得した後、フレームを1つずつ読み込んで、他の視覚アルゴリズムですべてのフレームを処理したかったのです。しかし、私はビデオからフレームを1つずつ取得し、フレームの各ピクセルにアクセスする方法を知らなかった。Qtフレームワークのビデオからフレームを1枚ずつ取得するにはどうすればよいですか?

cv :: VideoCaptureでこの問題を簡単に解決できるcv :: Mat。

cv::VideoCapture capture(filename); 
cv::Mat img; 

capture >> img; // 'img' contains the first frame of the video. 
capture >> img; // 'img' contains the second frame of the video. 

誰かがこの種の問題を既に処理している場合は、私を助けてください。

ありがとうございます。

+0

OpenCVがあなたのためにうまくいく場合、何も問題はありません:) –

答えて

2

QAbstractVideoSurfaceの独自の実装を作成し、フレーム単位でビデオを処理するには、その presentメソッドをオーバーライドすることができます。 のビデオ出力をsetVideoOutputで設定する必要があります。

フレームデータにアクセスする方法の詳細については、QVideoFrameのドキュメントを参照してください。

1

提案:あなたはOpenCVを使うことができます。そうすれば、QImage-> Mat変換なしで簡単にビデオを再生して処理することができます。

OpenCV + Qtでビデオを処理するには、QTimer信号に接続されたQThreadを作成する必要があります。 QTimer信号は、数ミリ秒ごとの信号をワーカースレッドのスロットに送り、VideoCaptureから次のビデオフレームを取り出し、そのデータを処理します。

+1

['QVideoFrame :: bits()'](https://doc.qt.io/qt-5/qvideoframe.html#bits )あなたは 'QImage'を取得するのではなく、生データを取得するので、OpenCVコードをオーバーライドされた' QAbstractVideoSurface :: present 'メソッドに差し込み、' QTimer'を回避することができます。 –

関連する問題