はじめに
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でエッジ検出してみる
動画ファイルの処理についてはこちら
OpenCVで動画をリアルタイムに変換してみる
今回は、Webカメラ、ビデオカメラのようにリアルタイムに入力がある動画の処理をしてみます。
平滑化
平滑化は、文字の領域を判定したり、追跡する動体の領域を判定したりする際に使うフィルターです。
例としては、下記ような流れの中で平滑化を行い領域判定につなげます。
OpenCVでは、以下の平滑化がサポートされています。
- ガウシアン平滑化:cv2.GaussianBlur
- 平均化フィルタを用いた平滑化:cv2.blur
- メディアン(中央値)を用いた平滑化:cv2.medianBlur
- バイラテラルフィルタを用いた平滑化:cv2.bilateralFilter
プログラム
今回は、ビデオ入力に対してリアルタイムにガウシアン平滑化を行い、ウィンドウ表示およびファイル保存を行うプログラムを作ってみます。
import cv2
# 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)
if __name__ == '__main__':
# 定数定義
ESC_KEY = 27 # Escキー
INTERVAL= 33 # 待ち時間
FRAME_RATE = 30 # fps
ORG_WINDOW_NAME = "org"
GAUSSIAN_WINDOW_NAME = "gaussian"
GAUSSIAN_FILE_NAME = "gaussian.avi"
DEVICE_ID = 0
# カメラ映像取得
cap = cv2.VideoCapture(DEVICE_ID)
# 保存ビデオファイルの準備
end_flag, c_frame = cap.read()
height, width, channels = c_frame.shape
rec = cv2.VideoWriter(GAUSSIAN_FILE_NAME, \
cv_fourcc('X', 'V', 'I', 'D'), \
FRAME_RATE, \
(width, height), \
True)
# ウィンドウの準備
cv2.namedWindow(ORG_WINDOW_NAME)
cv2.namedWindow(GAUSSIAN_WINDOW_NAME)
# 変換処理ループ
while end_flag == True:
# ガウシアン平滑化
g_frame = cv2.GaussianBlur(c_frame, (15, 15), 10)
# フレーム表示
cv2.imshow(ORG_WINDOW_NAME, c_frame)
cv2.imshow(GAUSSIAN_WINDOW_NAME, g_frame)
# フレーム書き込み
rec.write(g_frame)
# Escキーで終了
key = cv2.waitKey(INTERVAL)
if key == ESC_KEY:
break
# 次のフレーム読み込み
end_flag, c_frame = cap.read()
# 終了処理
cv2.destroyAllWindows()
cap.release()
rec.release()
スクリプトの動作確認は以下の環境で行いました。
- Windows 10
- Python 3.5.1
- OpenCV 3.1.0
動画ファイルとカメラからの入力は、プログラムではほぼ同じように扱うことができます。
カメラからの入力を扱う場合は、ファイル名のところをデバイスIDを指定してあげればOKです。
cv2.VideoCapture(DEVICE_ID)
カメラが1台しかない場合は、DEVICE_ID = 0
を指定します。
実行結果
-
実行環境
- 5年前に買ったノートPC
- CPU: Intel Core i5-2410M
- メモリ:4GB
- カメラ:ノートPC前面に組み込まれているカメラ
-
撮影対象
- 床にカボチャを転がしたところ
-
撮影方法
2回撮影を行いました- 通常の撮影(フィルター処理なし)
- OpenCVでガウシアン平滑化を行いながら録画
動画を見たい方はこちら。
「古いノートPCだし、PythonでOpenCVってパフォーマンス的に耐えられるの?」
と半信半疑で実行してみましたが、問題なく動作しました(^^)v