はじめに
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フレーム読み込みます
- カラーのフレームをグレースケールのフレームに変換します
- フレームをウィンドウに表示します
- フレームをファイルに書き込みます
# -*- 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
がありません。
下記のように自作メソッドで対応する方法もあるので紹介しておきます。
# 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)
プログラム内で決まったコーデックで動作すればよいのであれば、定数定義のところでこのように定義する方法もあります。
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カメラ/ビデオカメラの動画をリアルタイムに変換してみる