Python
画像処理
OpenCV

OpenCVで動画をリアルタイムに変換してみる

More than 1 year has passed since last update.

はじめに

OpenCV(Open Source Computer Vision Library)はBSDライセンスの映像/画像処理ライブラリ集です。画像のフィルタ処理、テンプレートマッチング、物体認識、映像解析、機械学習などのアルゴリズムが多数用意されています。

OpenCVを使った動体追跡の例 (OpenCV Google Summer of Code 2015)
https://www.youtube.com/watch?v=OUbUFn71S4s

インストールと簡単な使い方はこちら
http://qiita.com/olympic2020/items/d5d475a446ec9c73261e

静止画像のフィルター処理についてはこちら
OpenCVでエッジ検出してみる

今回は、動画をリアルタイムに変換してみます。

プログラム

while文のループの中で以下を行っています。

  1. 元のカラー動画を1フレーム読み込みます
  2. カラーのフレームをグレースケールのフレームに変換します
  3. フレームをウィンドウに表示します
  4. フレームをファイルに書き込みます
movie.py
# -*- coding: utf-8 -*-
import cv2


# 定数定義
ESC_KEY = 27     # Escキー
INTERVAL= 33     # 待ち時間
FRAME_RATE = 30  # fps

ORG_WINDOW_NAME = "org"
GRAY_WINDOW_NAME = "gray"

ORG_FILE_NAME = "org_768x576.avi"
GRAY_FILE_NAME = "gray_768x576.avi"

# 元ビデオファイル読み込み
org = cv2.VideoCapture(ORG_FILE_NAME)

# 保存ビデオファイルの準備
end_flag, c_frame = org.read()
height, width, channels = c_frame.shape
rec = cv2.VideoWriter(GRAY_FILE_NAME, \
                      cv2.VideoWriter_fourcc(*'XVID'), \
                      FRAME_RATE, \
                      (width, height), \
                      False)
# ウィンドウの準備
cv2.namedWindow(ORG_WINDOW_NAME)
cv2.namedWindow(GRAY_WINDOW_NAME)

# 変換処理ループ
while end_flag == True:
    # グレースケール変換
    g_frame = cv2.cvtColor(c_frame, cv2.COLOR_BGR2GRAY)

    # フレーム表示
    cv2.imshow(ORG_WINDOW_NAME, c_frame)
    cv2.imshow(GRAY_WINDOW_NAME, g_frame)

    # フレーム書き込み
    rec.write(g_frame)

    # Escキーで終了
    key = cv2.waitKey(INTERVAL)
    if key == ESC_KEY:
        break

    # 次のフレーム読み込み
    end_flag, c_frame = org.read()

# 終了処理
cv2.destroyAllWindows()
org.release()
rec.release()

動画のサンプルはこちらから。
ダウンロード
「768x576.avi」を「org_768x576.avi」にリネームしてスクリプトと同じディレクトリに置いて実行してください。

実行結果

カラー動画とグレースケールの動画が同時に表示され、グレースケールの動画はファイルにも保存されました。

window.png

コーデックの指定方法

OpenCV3.1には、OpenCV2.4まで存在していた、cv2.cv.CV_FOURCCがありません。
下記のように自作メソッドで対応する方法もあるので紹介しておきます。

CV_FOURCC.py
# cv2.cv.CV_FOURCC
def cv_fourcc(c1, c2, c3, c4):
    return (ord(c1) & 255) + ((ord(c2) & 255) << 8) + \
        ((ord(c3) & 255) << 16) + ((ord(c4) & 255) << 24)

プログラム内で決まったコーデックで動作すればよいのであれば、定数定義のところでこのように定義する方法もあります。

opencv3.1.py
XVID = 0x44495658

よく使うコーデックについてまとめておきます。

コーデック 文字列 定数
MPEG-1 PIM1 0x314D4950
MPEG-4 MPG4 0x3447504D
MPEG-4.2 MP42 0x3234504D
MPEG-4.3 DIV3 0x33564944
DivX DIVX 0x58564944
DivX 5.0 DX50 0x30355844
Xvid XVID 0x44495658
H.263 U263 0x33363255
H.263I I263 0x33363249
H.264 H264 0x34363248
FLV1 FLV1 0x31564C46
Motion JPEG MJPG 0x47504A4D
非圧縮 零(0) 0x00000000

コーデック一覧はこちら(リンク

つづく

次は、OpenCVでWebカメラ/ビデオカメラの動画をリアルタイムに変換してみます。
OpenCVでWebカメラ/ビデオカメラの動画をリアルタイムに変換してみる