目次

film-1668918_640

準備

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.getvideo.set

video.get(flag)

flagに様々なフラグを指定することで動画の情報を取得できます。

フラグの一覧(OpenCV2の場合は"cv2."=>"cv2.cv.CV_")
  1. cv2.CAP_PROP_POS_MSEC フィルム中の現在位置ミリ秒単位
  2. cv2.CAP_PROP_POS_FRAMES 現在のフレームのインデックス
  3. cv2.CAP_PROP_POS_AVI_RATIO 現在のフレームの相対的な位置
  4. cv2.CAP_PROP_FRAME_WIDTH フレームの幅
  5. cv2.CAP_PROP_FRAME_HEIGHT フレームの高さ
  6. cv2.CAP_PROP_FPS フレームレート
  7. cv2.CAP_PROP_FOURCC コーデックを表す4文字コード
  8. cv2.CAP_PROP_FRAME_COUNT ビデオファイル中のフレーム数
  9. cv2.CAP_PROP_FORMAT retrieve() によって返されるMat オブジェクトのフォーマット
  10. cv2.CAP_PROP_MODE 現在のキャプチャモードを表す、バックエンド固有の値
  11. cv2.CAP_PROP_BRIGHTNESS 画像の明るさ(カメラの場合のみ)
  12. cv2.CAP_PROP_CONTRAST 画像のコントラスト(カメラの場合のみ)
  13. cv2.CAP_PROP_SATURATION 画像の彩度(カメラの場合のみ)
  14. cv2.CAP_PROP_HUE 画像の色相(カメラの場合のみ)
  15. cv2.CAP_PROP_GAIN 画像のゲイン(カメラの場合のみ)
  16. cv2.CAP_PROP_EXPOSURE 露出(カメラの場合のみ)
  17. cv2.CAP_PROP_CONVERT_RGB 画像がRGBに変換されるか否かを表す、ブール値のフラグ
video.set(flag, value)

video.setで再生位置などの値をセットすることができます。

フラグの一覧(OpenCV2の場合は"cv2."=>"cv2.cv.CV_")
  1. cv2.CAP_PROP_POS_MSEC フィルム中の現在位置ミリ秒
  2. cv2.CAP_PROP_POS_FRAMES 次にデコード/キャプチャされるフレームのインデックス
  3. cv2.CAP_PROP_POS_AVI_RATIO ビデオファイル内の相対的な位置
  4. cv2.CAP_PROP_FRAME_WIDTH ビデオストリーム中のフレームの幅
  5. cv2.CAP_PROP_FRAME_HEIGHT ビデオストリーム中のフレームの高さ
  6. cv2.CAP_PROP_FPS フレームレート
  7. cv2.CAP_PROP_FOURCC コーデックを表す4文字コード
  8. cv2.CAP_PROP_FRAME_COUNT ビデオファイル中のフレーム数
  9. cv2.CAP_PROP_FORMAT retrieve() によって返されるMat オブジェクトのフォーマット
  10. cv2.CAP_PROP_MODE 現在のキャプチャモードを表す、バックエンド固有の値
  11. cv2.CAP_PROP_BRIGHTNESS 画像の明るさ(カメラの場合のみ)
  12. cv2.CAP_PROP_CONTRAST 画像のコントラスト(カメラの場合のみ)
  13. cv2.CAP_PROP_SATURATION 画像の彩度(カメラの場合のみ)
  14. cv2.CAP_PROP_HUE 画像の色相(カメラの場合のみ)
  15. cv2.CAP_PROP_GAIN 画像のゲイン(カメラの場合のみ)
  16. cv2.CAP_PROP_EXPOSURE 露出(カメラの場合のみ)
  17. cv2.CAP_PROP_CONVERT_RGB 画像がRGBに変換されるか否かを表す、ブール値のフラグ