web-dev-qa-db-ja.com

pythonでcv2を使用してファイル内のフレームの総数を知る方法

オープンcvモジュールを使用してPythonを介してファイル(.avi)内のフレームの総数を知る方法。

可能であれば、すべての情報(解像度、fps、期間など)を使用して、ビデオファイルを取得できます。

46
Niraj

新しいOpenCVバージョン(3.1.0を使用)では、次のように機能します。

import cv2

cap = cv2.VideoCapture("video.mp4")
length = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
print( length )

他の動画プロパティでも同様ですcv2.CAP_PROP_*

74
phev8
import cv2

cap = cv2.VideoCapture(fn)

if not cap.isOpened(): 
    print "could not open :",fn
    return

length = int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT))
width  = int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT))
fps    = cap.get(cv2.cv.CV_CAP_PROP_FPS)

詳細は here をご覧ください。

また、すべてが塩の粒で、すべてのそれらの小道具が必須ではなく、キャプチャ/ビデオコーデックで利用できないものもあります

31
berak

Python 3.6.5(Anaconda))およびOpenCV 3.4.2での動作方法は次のとおりです。公式のOpenCV website に記載されています。

import cv2
cap = cv2.VideoCapture("video.mp4")
property_id = int(cv2.CAP_PROP_FRAME_COUNT) 
length = int(cv2.VideoCapture.get(cap, property_id))
print( length )
9
MGLondon

時々バグのあるCV_CAP_PROPゲッターに依存しない別の解決策は、ループでビデオファイル全体をトラバースすることです。

  • 有効なフレームが検出されるたびにフレームカウンター変数を増やし、無効なフレームが来ると停止します(ビデオファイルの終わり)。
  • 解像度に関する情報の収集は、一部のコーデックが可変解像度をサポートしているため、複雑です(ビットレートが一定ではなく、事前定義された範囲をカバーするオーディオファイルのVBRと同様)。

    • 一定の解像度-この場合、ビデオファイル全体の解像度を決定するために最初のフレームのみが必要なので、ビデオ全体をトラバースする必要はありません。
    • 可変解像度-すべての単一フレームの解像度(幅と高さ)を取得し、平均を計算してビデオの平均解像度を取得する必要があります
  • [〜#〜] fps [〜#〜]は計算できますが、ここでは解像度と同じ問題があります-定数(CFR)対変数(VFR)。これは、マルチスレッドの問題です。個人的には、有効なフレームごとに増加するフレームカウンターを使用しますが、1秒の間隔でタイマー(バックグラウンドスレッドで実行)が現在のカウンターの値を保存してリセットします。ビデオに含まれるフレームの合計数もわかる場合、最後に平均/一定のフレームレートを計算するために、値をリストに保存できます。

このやや単純な方法の欠点は、ファイル全体をスキャンする必要があることです。ファイルが数時間かかる場合は、ユーザーが確実に認識できます。この場合、アプリケーションがロードされたビデオファイルに関するこの情報を収集している間、ユーザーに他のことをさせながら、それについて賢く、バックグラウンドプロセスでそれを行うことができます。

利点は、OpenCVが読み取れる限り、どのビデオファイルを使用しても、期待どおりに動作する場合と動作しない場合があるCV_CAP_PROPとは異なり、非常に正確な結果が得られることです。

4
rbaleksandar