web-dev-qa-db-ja.com

Python - ビデオフレームの抽出と保存

それで私は このチュートリアル に従ったが、何もしないようだ。単に何もない。数秒待ってからプログラムを閉じます。このコードの何が問題になっていますか

import cv2
vidcap = cv2.VideoCapture('Compton.mp4')
success,image = vidcap.read()
count = 0
success = True
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

また、コメントでそれはこれがフレームを1000に制限すると言っていますか?どうして?

編集:私は最初にsuccess = Trueをやってみたが、それは助けにはならなかった。 0バイトの画像を1つだけ作成しました。

70
GShocked

それで、これがうまくいった最後のコードでした:

import cv2
print(cv2.__version__)
vidcap = cv2.VideoCapture('big_buck_bunny_720p_5mb.mp4')
success,image = vidcap.read()
count = 0
success = True
while success:
  cv2.imwrite("frame%d.jpg" % count, image)     # save frame as JPEG file
  success,image = vidcap.read()
  print 'Read a new frame: ', success
  count += 1

したがって、これが機能するには、いくつかのものを入手する必要があります。まず、 OpenCV2をダウンロードします 。それから これをPythonにインストールしてください 2.7.x。サードパーティのフォルダ内のffmpegフォルダに移動します(C:\OpenCV\3rdparty\ffmpegのようなものですが、よくわかりません)。 opencv_ffmpeg.dll(またはあなたのPythonバージョンがx64の場合はx64バージョン)をコピーしてあなたのPythonフォルダ(おそらくC:\Python27)に貼り付けてください。 opencvのバージョンが3.0.0の場合はopencv_ffmpeg300.dllという名前に変更し(ここで 見つけることができ )、それに応じて自分のバージョンに変更します。ところで、あなたはあなたの環境パスにあなたの pythonフォルダがなければなりません

34
GShocked

こちら から こちら の動画 をダウンロードしてください。テスト。あなたのPythonコードの同じディレクトリにそのmp4ファイルを持っていることを確認してください。それからまた同じディレクトリからPythonインタプリタを実行するようにしてください。

それから、コードを修正してください、ウィンドウなしでは時間を無駄にしているwaitKeyはキーボードイベントをキャプチャすることができません。また、フレームを正常に読み取っていることを確認するためにsuccess値を出力します。

import cv2
vidcap = cv2.VideoCapture('big_buck_bunny_720p_5mb.mp4')
success,image = vidcap.read()
count = 0
while success:
  cv2.imwrite("frame%d.jpg" % count, image)     # save frame as JPEG file      
  success,image = vidcap.read()
  print('Read a new frame: ', success)
  count += 1

それはどうですか?

130
fireant

誰かがすべてのフレームを抽出するのではなく、1秒ごとにフレームを抽出したい場合、この質問(および@ user2700065による回答)をわずかに異なる場合に拡張します。 1分のビデオで60フレーム(画像)になります。

import sys
import argparse

import cv2
print(cv2.__version__)

def extractImages(pathIn, pathOut):
    count = 0
    vidcap = cv2.VideoCapture(pathIn)
    success,image = vidcap.read()
    success = True
    while success:
      vidcap.set(cv2.CAP_PROP_POS_MSEC,(count*1000))    # added this line 
      success,image = vidcap.read()
      print ('Read a new frame: ', success)
      cv2.imwrite( pathOut + "\\frame%d.jpg" % count, image)     # save frame as JPEG file
      count = count + 1

if __name__=="__main__":
    print("aba")
    a = argparse.ArgumentParser()
    a.add_argument("--pathIn", help="path to video")
    a.add_argument("--pathOut", help="path to images")
    args = a.parse_args()
    print(args)
    extractImages(args.pathIn, args.pathOut)
19
Bhushan Babar

フレームをビデオに変換する方法に関する多くの研究の後、私はこの機能を作成しましたこれが助けになることを願います。これにはopencvが必要です。

import cv2
import numpy as np
import os

def frames_to_video(inputpath,outputpath,fps):
   image_array = []
   files = [f for f in os.listdir(inputpath) if isfile(join(inputpath, f))]
   files.sort(key = lambda x: int(x[5:-4]))
   for i in range(len(files)):
       img = cv2.imread(inputpath + files[i])
       size =  (img.shape[1],img.shape[0])
       img = cv2.resize(img,size)
       image_array.append(img)
   fourcc = cv2.VideoWriter_fourcc('D', 'I', 'V', 'X')
   out = cv2.VideoWriter(outputpath,fourcc, fps, size)
   for i in range(len(image_array)):
       out.write(image_array[i])
   out.release()


inputpath = 'folder path'
outpath =  'video file path/video.mp4'
fps = 29
frames_to_video(inputpath,outpath,fps)

ローカルの場所に応じて、fps(フレーム/秒)、入力フォルダパス、および出力フォルダパスの値を変更します。

6
Puja Sharma

これは、@ GShockedのpython 3.xに対する前回の回答からの微調整です。コメントに投稿しますが、十分な評判は得られません。

import sys
import argparse

import cv2
print(cv2.__version__)

def extractImages(pathIn, pathOut):
    vidcap = cv2.VideoCapture(pathIn)
    success,image = vidcap.read()
    count = 0
    success = True
    while success:
      success,image = vidcap.read()
      print ('Read a new frame: ', success)
      cv2.imwrite( pathOut + "\\frame%d.jpg" % count, image)     # save frame as JPEG file
      count += 1

if __name__=="__main__":
    print("aba")
    a = argparse.ArgumentParser()
    a.add_argument("--pathIn", help="path to video")
    a.add_argument("--pathOut", help="path to images")
    args = a.parse_args()
    print(args)
    extractImages(args.pathIn, args.pathOut)
6
XRarach

このコードはビデオからフレームを抽出し、.jpg形式でフレームを保存します

import cv2
import numpy as np
import os

# set video file path of input video with name and extension
vid = cv2.VideoCapture('VideoPath')


if not os.path.exists('images'):
    os.makedirs('images')

#for frame identity
index = 0
while(True):
    # Extract images
    ret, frame = vid.read()
    # end of frames
    if not ret: 
        break
    # Saves images
    name = './images/frame' + str(index) + '.jpg'
    print ('Creating...' + name)
    cv2.imwrite(name, frame)

    # next frame
    index += 1
5
Rejoice T J

前の答えは最初のフレームを失いました。そして、それはフォルダーに画像を保存するのはいいでしょう。

# create a folder to store extracted images
import os
folder = 'test'  
os.mkdir(folder)
# use opencv to do the job
import cv2
print(cv2.__version__)  # my version is 3.1.0
vidcap = cv2.VideoCapture('test_video.mp4')
count = 0
while True:
    success,image = vidcap.read()
    if not success:
        break
    cv2.imwrite(os.path.join(folder,"frame{:d}.jpg".format(count)), image)     # save frame as JPEG file
    count += 1
print("{} images are extacted in {}.".format(count,folder))

ちなみに、VLCでフレームラットeを確認できます。ウィンドウに移動します - >メディア情報 - >コーデックの詳細

5
Yuchao Jiang

これは、ほとんどのビデオフォーマットをビデオにあるフレーム数に変換する関数です。 Python3OpenCV 3+で動作します。

import cv2
import time
import os

def video_to_frames(input_loc, output_loc):
    """Function to extract frames from input video file
    and save them as separate frames in an output directory.
    Args:
        input_loc: Input video file.
        output_loc: Output directory to save the frames.
    Returns:
        None
    """
    try:
        os.mkdir(output_loc)
    except OSError:
        pass
    # Log the time
    time_start = time.time()
    # Start capturing the feed
    cap = cv2.VideoCapture(input_loc)
    # Find the number of frames
    video_length = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) - 1
    print ("Number of frames: ", video_length)
    count = 0
    print ("Converting video..\n")
    # Start converting the video
    while cap.isOpened():
        # Extract the frame
        ret, frame = cap.read()
        # Write the results back to output location.
        cv2.imwrite(output_loc + "/%#05d.jpg" % (count+1), frame)
        count = count + 1
        # If there are no more frames left
        if (count > (video_length-1)):
            # Log the time again
            time_end = time.time()
            # Release the feed
            cap.release()
            # Print stats
            print ("Done extracting frames.\n%d frames extracted" % count)
            print ("It took %d seconds forconversion." % (time_end-time_start))
            break

if __name__=="__main__":

    input_loc = '/path/to/video/00009.MTS'
    output_loc = '/path/to/output/frames/'
    video_to_frames(input_loc, output_loc)

.mts.mp4.aviのような通常のファイルをサポートします。試してみて.mtsファイルをテストしました。チャームのように機能します。

4
Harsh Patel

この関数は1 fpsでビデオから画像を抽出します。さらに、最後のフレームを識別して読み取りを停止します。

import cv2
import numpy as np

def extract_image_one_fps(video_source_path):

    vidcap = cv2.VideoCapture(video_source_path)
    count = 0
    success = True
    while success:
      vidcap.set(cv2.CAP_PROP_POS_MSEC,(count*1000))      
      success,image = vidcap.read()

      ## Stop when last frame is identified
      image_last = cv2.imread("frame{}.png".format(count-1))
      if np.array_equal(image,image_last):
          break

      cv2.imwrite("frame%d.png" % count, image)     # save frame as PNG file
      print '{}.sec reading a new frame: {} '.format(count,success)
      count += 1
3
Bence Kővári

私はAnacondaのSpyderソフトウェア経由でPythonを使っています。このスレッドの質問に@Gshockedでリストされている元のコードを使用すると、コードは機能しません(pythonはmp4ファイルを読みません)。そこで、OpenCV 3.2をダウンロードして、 "bin"フォルダから "opencv_ffmpeg320.dll"と "opencv_ffmpeg320_64.dll"をコピーしました。私はこれらのdllファイルの両方をAnacondaの "Dlls"フォルダに貼り付けました。

Anacondaには「pckgs」フォルダーもあります。ダウンロードした「OpenCV 3.2」フォルダー全体をAnacondaの「pckgs」フォルダーにコピーして貼り付けました。

最後に、Anacondaは "bin"サブフォルダーを持つ "Library"フォルダーを持っています。そのフォルダに "opencv_ffmpeg320.dll"と "opencv_ffmpeg320_64.dll"ファイルを貼り付けました。

Spyderを閉じて再起動した後、コードは機能しました。私は3つの方法のどれがうまくいったのかわからないので、戻ってそれを理解するのが面倒すぎます。しかし、それはうまくいきます、歓声!

2
SpaceFarmer2020