web-dev-qa-db-ja.com

OpenCVを使用して特定の時間にビデオから画像を抽出する

私の仕事は、ビデオと時間を秒単位で取得できるユーティリティを作成することです。

ユーティリティは、指定された入力を使用してビデオからjpeg画像を書き出す必要があります。

例えば。ビデオ名をabc.mpegとし、時間を20秒としてツールに指定します。ユーティリティは、20秒でビデオから画像を書き出す必要があります。

    # Import the necessary packages
    import argparse
    import cv2

    vidcap = cv2.VideoCapture('Wildlife.mp4')
    success,image = vidcap.read()
    count = 0;
    while success:
      success,image = vidcap.read()
      cv2.imwrite("frame%d.jpg" % count, image)     # save frame as JPEG file
      if cv2.waitKey(10) == 27:                     # exit if Escape is hit
          break
      count += 1

上記のコードはビデオ全体のすべてのフレームを提供しますが、私の懸念は、どのように時間を渡して、指定された時間にフレームを取得できるかということです。

9
venpo045

@mickaが提案したことを、あなたはただやってみませんか?

import cv2

vidcap = cv2.VideoCapture('d:/video/keep/Le Sang Des Betes.mp4')
vidcap.set(cv2.CAP_PROP_POS_MSEC,20000)      # just cue to 20 sec. position
success,image = vidcap.read()
if success:
    cv2.imwrite("frame20sec.jpg", image)     # save frame as JPEG file
    cv2.imshow("20sec",image)
    cv2.waitKey()                    
14
berak
import cv2

cap = cv2.VideoCapture('bunny.mp4')
cap.set(cv2.CAP_PROP_POS_MSEC,1000)      # Go to the 1 sec. position
ret,frame = cap.read()                   # Retrieves the frame at the specified second
cv2.imwrite("image.jpg", frame)          # Saves the frame as an image
cv2.imshow("Frame Name",frame)           # Displays the frame on screen
cv2.waitKey()                            # Waits For Input

ここで、cap.set(cv2.CAP_PROP_POS_MSEC、1000)は、ビデオの最初の秒に直接スキップする責任があります( 1000ミリ秒)。お好みの値でお気軽にご利用ください。

OpenCV3.1.0でコードをテストしました。

0
John
# Import the necessary packages
import cv2

vidcap = cv2.VideoCapture('Wildlife.mp4')
success,image = vidcap.read()
print success
#cv2.imwrite("frame.jpg", image) 

count = 0
framerate = vidcap.get(5)
print "framerate:", framerate
framecount = vidcap.get(7)
print "framecount:", framecount
vidcap.set(5,1)
newframerate = vidcap.get(5)
print "newframerate:", newframerate  

while success:
  success,image = vidcap.read()
  #cv2.imwrite("frame%d.jpg" % count, image) 

  getvalue = vidcap.get(0)
  print getvalue
  if getvalue == 20000:
    cv2.imwrite("frame%d.jpg" % getvalue, image)  

  #if cv2.waitKey(10) == 27:                     
      #break
  count += 1

出力は次のとおりです

framerate: 29.97002997
framecount: 901.0
newframerate: 29.97002997

フレームレートが変わらない理由フレームレートを1に変更して、ユーザーが指定した時間値に関係なく、画像フレームを取得できるようにします。

0
venpo045