Edited at

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」にリネームしてスクリプトと同じディレクトリに置いて実行してください。


実行結果

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


コーデックの指定方法

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カメラ/ビデオカメラの動画をリアルタイムに変換してみる