↓もし、良かったらSNSでの紹介よろしくお願いします。

Pythonでの動画の取り扱い(OpenCVで再生とキャプチャ生成)

bootstrap

本記事はPythonでの動画データの取り扱いについて解説します。

もし、動画を見ながらPythonを学習したい場合は
本記事ではなく以下の記事を参考にしてください。

無料でも良い動画はたくさんある プログラミング入門者向けの講義が無料で聞ける MITの講義が無料で公開されている動画です。 コンピュ...

準備

PythonにOpenCVを入れる

Pythonで動画を取り扱うにはOpenCVが必要です。OpenCVは画像処理や動画処理において最も著名なライブラリです。OpenCVのPython向けのパッケージがあるのでPythonに入っていない場合、次の記事を参考にOpenCVを入れてみてください。

https://www.tech-tech.xyz/python-opencv-pip-install/

opencv_ffmpeg.dllを用意する。

pipでOpenCVを入れた場合、この作業は不要です。
ここは読み飛ばして大丈夫です。

OpenCVで動画ファイルを扱う場合、opencv_ffmpeg”数字”.dllが必要になります。”数字”のところはOpenCVのバージョンから.を取り除いた数字です。dllはOpenCVをインストールするときに展開したフォルダに含まれています。(例”opencv\build\x86\vc14\bin\ffmpeg2413.dll”)

このdllを作業ディレクトリかPythonのパスが通ってるディレクトリにコピーしておきましょう。ちなみにffmpegとは動画再生するソフトです。

動画を再生する(音無し)

OpenCVで音声の再生は無いので無音です。Python2でも3でも動くように書いてます。

# -*- coding: utf-8 -*-
import cv2
#動画ファイルを読み込む
file_name = u"video.mp4"
video = cv2.VideoCapture(file_name)
#フレーム数を取得
frame_count = int(video.get(7))
#フレームレート(1フレームの時間単位はミリ秒)の取得
frame_rate = int(video.get(5))
#ウィンドウの名前を設定
cv2.namedWindow('player',  cv2.WINDOW_AUTOSIZE)
for i in range(frame_count):
    is_read, frame = video.read()
    #フレームレートのミリ秒数待つ
    k = cv2.waitKey(frame_rate)
    if k == 27 or not is_read:
        break
    cv2.imshow("player", frame)

動画を1フレームごとに画像へ変換

# -*- coding: utf-8 -*-
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の使い方をまとめてます。video.get(5)はフレームレートの取得。

is_read, frame = video.read()

video.read()で動画を1フレームごとに読み込みます。is_readはフレームが読み込まれているかどうかを表してます。読み込むと次のフレームに移ります。フレーム位置を指定したい場合はvideo.setを使います。

OpenCV(Python)video.getvideo.setのフラグ一覧

video.get

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

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に変換されるか否かを表す、ブール値のフラグ