目次
準備
opencv_ffmpeg.dllを用意する。
pipでOpenCVを入れた場合(OpenCV-Python)、「opencv_ffmpeg.dllを用意する」は飛ばして大丈夫です。
Pythonで動画ファイルを扱う場合、opencv_ffmpeg数字.dllが必要になります。数字のところはOpenCVのバージョンから.を取り除いた数字です。dllはOpenCVをインストールするときに展開したフォルダに含まれています。(例"opencv\build\x86\vc14\bin\ffmpeg2413.dll")
このdllを作業ディレクトリかPythonのパスが通ってるディレクトリにコピーしておきましょう。
動画を再生する(音無し)
OpenCVで音声の再生は無いので無音です。フレームレートを考慮していないので早送りになってます。
import cv2
import os
#動画ファイルを読み込む
file_name = u"video.mp4"
video = cv2.VideoCapture(file_name)
#フレーム数を取得
frame_count = int(video.get(7))
#ウィンドウの名前を設定
cv2.namedWindow('player', cv2.WINDOW_AUTOSIZE)
for i in range(frame_count):
_, frame = video.read()
cv2.imshow("player", frame)
cv2.waitKey(1)
動画を1フレームごとに画像へ変換
import cv2
import os
#動画ファイルを読み込む
file_name = u"video.mp4"
video = cv2.VideoCapture(file_name)
#スクリーンキャプチャを保存するディレクトリ
dir_name = "screen_caps"
if not os.path.exists(dir_name):
os.mkdir(dir_name)
#フレーム数を取得
frame_count = int(video.get(7))
for i in range(frame_count):
_, frame = video.read()
cv2.imwrite(dir_name+ "/" + str(i) + ".png", frame)
コードの解説
#フレーム数を取得
frame_count = int(video.get(7))
video.get(7)で動画のフレーム数を取得します。7は何を意味しているのかというとcv2.CAP_PROP_FRAME_COUNTというOpenCVのフラグの値を示しています。video.get(7)の代わりにvideo.get(cv2.CAP_PROP_FRAME_COUNT)としてもOpenCV3では動きます。
しかし、OpenCV2だとvideo.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT)としないと動かないので 、OpenCV2と3共通の値である7にしました。
video.getを使うと他にも様々な情報を取得できます(動画の幅や高さなど)。後ろにvideo.getの使い方をまとめてます。
_, frame = video.read()
video.read()で動画を1フレームごとに読み込みます。_は読み込みが成功しているかのフラグです。読み込むと次のフレームに移ります。フレーム位置を指定したい場合はvideo.setを使います。
video.get、video.set
video.get(flag)
flagに様々なフラグを指定することで動画の情報を取得できます。
フラグの一覧(OpenCV2の場合は"cv2."=>"cv2.cv.CV_")- cv2.CAP_PROP_POS_MSEC フィルム中の現在位置ミリ秒単位
- cv2.CAP_PROP_POS_FRAMES 現在のフレームのインデックス
- cv2.CAP_PROP_POS_AVI_RATIO 現在のフレームの相対的な位置
- cv2.CAP_PROP_FRAME_WIDTH フレームの幅
- cv2.CAP_PROP_FRAME_HEIGHT フレームの高さ
- cv2.CAP_PROP_FPS フレームレート
- cv2.CAP_PROP_FOURCC コーデックを表す4文字コード
- cv2.CAP_PROP_FRAME_COUNT ビデオファイル中のフレーム数
- cv2.CAP_PROP_FORMAT retrieve() によって返されるMat オブジェクトのフォーマット
- cv2.CAP_PROP_MODE 現在のキャプチャモードを表す、バックエンド固有の値
- cv2.CAP_PROP_BRIGHTNESS 画像の明るさ(カメラの場合のみ)
- cv2.CAP_PROP_CONTRAST 画像のコントラスト(カメラの場合のみ)
- cv2.CAP_PROP_SATURATION 画像の彩度(カメラの場合のみ)
- cv2.CAP_PROP_HUE 画像の色相(カメラの場合のみ)
- cv2.CAP_PROP_GAIN 画像のゲイン(カメラの場合のみ)
- cv2.CAP_PROP_EXPOSURE 露出(カメラの場合のみ)
- cv2.CAP_PROP_CONVERT_RGB 画像がRGBに変換されるか否かを表す、ブール値のフラグ
video.set(flag, value)
video.setで再生位置などの値をセットすることができます。
フラグの一覧(OpenCV2の場合は"cv2."=>"cv2.cv.CV_")- cv2.CAP_PROP_POS_MSEC フィルム中の現在位置ミリ秒
- cv2.CAP_PROP_POS_FRAMES 次にデコード/キャプチャされるフレームのインデックス
- cv2.CAP_PROP_POS_AVI_RATIO ビデオファイル内の相対的な位置
- cv2.CAP_PROP_FRAME_WIDTH ビデオストリーム中のフレームの幅
- cv2.CAP_PROP_FRAME_HEIGHT ビデオストリーム中のフレームの高さ
- cv2.CAP_PROP_FPS フレームレート
- cv2.CAP_PROP_FOURCC コーデックを表す4文字コード
- cv2.CAP_PROP_FRAME_COUNT ビデオファイル中のフレーム数
- cv2.CAP_PROP_FORMAT retrieve() によって返されるMat オブジェクトのフォーマット
- cv2.CAP_PROP_MODE 現在のキャプチャモードを表す、バックエンド固有の値
- cv2.CAP_PROP_BRIGHTNESS 画像の明るさ(カメラの場合のみ)
- cv2.CAP_PROP_CONTRAST 画像のコントラスト(カメラの場合のみ)
- cv2.CAP_PROP_SATURATION 画像の彩度(カメラの場合のみ)
- cv2.CAP_PROP_HUE 画像の色相(カメラの場合のみ)
- cv2.CAP_PROP_GAIN 画像のゲイン(カメラの場合のみ)
- cv2.CAP_PROP_EXPOSURE 露出(カメラの場合のみ)
- cv2.CAP_PROP_CONVERT_RGB 画像がRGBに変換されるか否かを表す、ブール値のフラグ
コメント