2017年6月17日土曜日

OpenCV-Python 動画再生メモ for Windows

※このメモの前提となる環境

  • OpenCV 3.2.0
  • Python 2.7.13 (x64)
  • Windows 7 (Professional) SP1, 64bit

cv2.VideoCapture で mp4ファイル等が再生できない場合の解決方法。

※前提: サンプルデータのaviファイルは再生できること。

  • 原因: OpenCV に同梱されている ffmpegのDLL (opencv_ffmpeg*_*.dll) に、パスが通っていない。 パスを通すか、カレントディレクトリにコピーすることで、ffmpeg が対応している動画であれば、 OpenCV でも開けるようになる。

  • ffmpegのDLL は、「opencv\build\bin」直下 に格納されている。


cv2.VideoCapture で開いている動画のコーデック(FourCC)を特定する方法。

import cv2

def decode_fourcc(v):
  v = int(v)
  return "".join([chr((v >> 8 * i) & 0xFF) for i in range(4)])

cap = cv2.VideoCapture("input.mp4")
print decode_fourcc(cap.get(cv2.CAP_PROP_FOURCC))
  • FourCC の取得自体は簡単で、cv2.VideoCapture のインスタンス cap に対して
    cap.get(cv2.CAP_PROP_FOURCC)」 するだけである。

  • ただし、この戻り値は float 値 (FourCC バイト列のint表現をfloat化したもの) になっている。

  • そのため、文字列として FourCC を得るためには、デコードする必要がある。
    FourCC のバイト列をデコードするための API は用意されていないため、上記の「decode_fourcc()」のような関数を自作して対応する。(元ネタ: video_v4l2.py)

  • なお、FourCC をエンコードするための API (ヘルパ関数) は用意されている。
    cv2.VideoWriter_fourcc(c1,c2,c3,c4)

    使用例: cv2.VideoWriter_fourcc('a', 'v', 'c', '1')

参考: ビデオコーデック に対する FourCC の一覧


画像の寸法 (縦や横方向のピクセル数) を調べる方法。

  • np.ndarray.shape の第1要素が「縦」、第2要素が「横」方向のピクセル数である。

  • 動画のフレーム画像の場合でも、全く同じ。

import cv2
import numpy as np

img = cv2.imread(filename)  # type: np.ndarray
height, width = img.shape[:2]

OpenCV の ドキュメント(APIリファレンス) について

Python で OpenCV をする場合、少し古いかもしれないが、
Sphinx HTML」の方を参照したほうがよさそう。(2017年6月現在)

※APIリファレンス「以外」の部分、たとえばチュートリアル (OpenCV-Python Tutorials) については、この限りではない。(= 今後も更新されていくと思われる「Doxygen HTML」系統の最新版を見たほうがよい)

0 件のコメント :

コメントを投稿