それで私は このチュートリアル に従ったが、何もしないようだ。単に何もない。数秒待ってからプログラムを閉じます。このコードの何が問題になっていますか
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つだけ作成しました。
それで、これがうまくいった最後のコードでした:
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フォルダがなければなりません 。
こちら から こちら の動画 をダウンロードしてください。テスト。あなたの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
それはどうですか?
誰かがすべてのフレームを抽出するのではなく、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)
フレームをビデオに変換する方法に関する多くの研究の後、私はこの機能を作成しましたこれが助けになることを願います。これには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(フレーム/秒)、入力フォルダパス、および出力フォルダパスの値を変更します。
これは、@ 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)
このコードはビデオからフレームを抽出し、.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
前の答えは最初のフレームを失いました。そして、それはフォルダーに画像を保存するのはいいでしょう。
# 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を確認できます。ウィンドウに移動します - >メディア情報 - >コーデックの詳細
これは、ほとんどのビデオフォーマットをビデオにあるフレーム数に変換する関数です。 Python3
とOpenCV 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
ファイルをテストしました。チャームのように機能します。
この関数は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
私は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つの方法のどれがうまくいったのかわからないので、戻ってそれを理解するのが面倒すぎます。しかし、それはうまくいきます、歓声!