Ubuntu
OpenCV

OpenCV3.3で動画ファイルのリードができない(Ubuntu16.04)

More than 1 year has passed since last update.

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)