OpenCVでは、ビデオキャプチャからの動画入力が、カメラであろうと動画ファイルであろうと同じように扱えるはず。
## !/usr/bin/python
# -*- coding: utf-8 -*-
import cv2
cap = cv2.VideoCapture('2017_0706_082809_003.MOV')
while(cap.isOpened()):
ret,frame = cap.read()
print("ret=",ret)
gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',gray)
if cv2.waitKey(1)&0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
ところが、
Failed to query video capabilities: Invalid argument
libv4l2: error getting capabilities: Invalid argument
VIDEOIO ERROR: V4L: device 2017_0717_114442_006.MOV: Unable to query number of channels
となり読み込めない。C++で記述しても同様なので、バインディングの問題ではなさそう。
環境
Ubuntu Linux 16.04
OpenCV 3.3.0
Python は2.7系
調査
OpenCVをソースから再コンパイル。そもそもコーデックがちゃんと入っているのかを見ると、FFMPEGもGStreamerも入っていない。。
-- Video I/O:
-- DC1394 1.x: NO
-- DC1394 2.x: NO
-- FFMPEG: NO
-- avcodec: NO
-- avformat: NO
-- avutil: NO
-- swscale: NO
-- avresample: NO
-- GStreamer: NO
解決策
根本的にはFFMPEGをcmakeの時に見つけられていないことが原因と思われる。が、これの直し方がよくわからない。代わりに、gstreamerで試してみると、なぜかうまく行った。
sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
cmake (略) ..
make & make install
-- Video I/O:
-- DC1394 1.x: NO
-- DC1394 2.x: NO
-- FFMPEG: NO
-- avcodec: NO
-- avformat: NO
-- avutil: NO
-- swscale: NO
-- avresample: NO
-- GStreamer:
-- base: YES (ver 1.8.3)
-- video: YES (ver 1.8.3)
-- app: YES (ver 1.8.3)
-- riff: YES (ver 1.8.3)
-- pbutils: YES (ver 1.8.3)