※このメモの前提となる環境
- 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月現在)
OpenCV documentation index には、「Doxygen HTML」版と「Sphinx HTML」版 の二つのドキュメントがある。
「Doxygen HTML」版の方は、今後の主流のようで、現時点での最新版 (3.2.0) のドキュメントも用意されている。
ただし、Pythonバインディングについての記載が見当たらない。
例: 「Doxygen HTML」版 (3.2.0) のcv::resize()
「Sphinx HTML」版の方は、3.0-last-rst で更新が止まっているようにも見えるが、
Pythonバインディングについての記載が併記されている。
例: 「Sphinx HTML」版 (3.0-last-rst) のcv2.resize()
※APIリファレンス「以外」の部分、たとえばチュートリアル (OpenCV-Python Tutorials) については、この限りではない。(= 今後も更新されていくと思われる「Doxygen HTML」系統の最新版を見たほうがよい)
0 件のコメント :
コメントを投稿