13

CV_CAP_PROP_POS_FRAMESプロパティを設定し、次のようにフレームを読み取ることで、特定のフレームにジャンプしようとしています。

cvSetCaptureProperty( input_video, CV_CAP_PROP_POS_FRAMES, current_frame );
frame = cvQueryFrame( input_video );

私が直面している問題は、OpenCV 2.1が12個の連続する値に対して同じフレームを返すのcurrent_frameに対し、キーフレームだけでなく個々のフレームを読み取りたいということです。誰か教えてもらえますか?


調査を行ったところ、問題の原因は解凍アルゴリズムであることがわかりました。

MPEGのようなアルゴリズム(HDなどを含む)は、各フレームを個別に圧縮しませんが、キーフレームを時々保存し、最後のフレームと後続のフレームの違いのみを保存します。

あなたが報告した問題は、フレームを選択すると、デコーダー(ffmpeg、可能性が高い)が自動的に次のキーフレームに進むという事実が原因です。

それで、これを回避する方法はありますか?キーフレームだけでなく、個々のフレームも必要です。

4

5 に答える 5

3

OpenCV のこの制限により、代わりに FFMPEG を使用するのが賢明な場合があります。Moviepyは素晴らしいラッパー ライブラリです。

# Get nth frame from a video
from moviepy.video.io.ffmpeg_reader import FFMPEG_VideoReader
cap = FFMPEG_VideoReader("movie.mov",True)
cap.initialize()
cap.get_frame(n/FPS)

パフォーマンスも素晴らしいです。n 番目のフレームへのシークget_frameは O(1) であり、(ほぼ) 連続するフレームが要求された場合はスピードアップが使用されます。3 つの 720p ビデオを同時に読み込むと、リアルタイムよりも優れた結果が得られました。

于 2015-08-20T13:54:09.853 に答える
3

CV_CAP_PROP_POS_FRAMES はキー フレームにジャンプします。私は同じ問題を抱えていて、この(python-)コードを使用して回避しました。おそらく完全に効率的ではありませんが、仕事は完了です:

def seekTo(cap, position):
  positiontoset = position
  pos = -1
  cap.set(cv.CV_CAP_PROP_POS_FRAMES, position)
  while pos < position:
    ret, image = cap.read()
    pos = cap.get(cv.CV_CAP_PROP_POS_FRAMES)
    if pos == position:
      return image
    elif pos > position:
      positiontoset -= 1
      cap.set(cv.CV_CAP_PROP_POS_FRAMES, positiontoset)
      pos = -1
于 2013-03-07T15:47:03.417 に答える
0

私はOpenCV 3 / Python 3で以下をうまく使用しました:

 # Skip to 150 frame then read the 151th frame
 cap.set(cv2.CAP_PROP_POS_FRAMES, 150))
 ret, frame = cap.read()
于 2016-11-07T01:25:40.433 に答える