web-dev-qa-db-ja.com

OpenCV3エラー:「ストリームを停止できません:デバイスに不適切なioctl」

OpenCV 3.2を使用して.movファイルのフレームを読み取ろうとしています( menpo conda channel から)。 Ubuntu 16.0464ビットセットアップでAnacondaを介してPython 3.5.3を使用しています。

問題は、OpenCVがcap.read()呼び出しにヒットすると、次のエラーメッセージが表示され、ループがすぐに中断してif num == 0条件をキャッチすることです。

これが私が実行しているコード全体です:

import cv2
import numpy as np
import sys

f = sys.argv[1]
cap = cv2.VideoCapture(f)

frames = []
num = 0
while cap.isOpened():
    ret, frame = cap.read()
    if not ret: break
    gframe = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    frames.append(gframe)
    num += 1
    if num % 100 == 0:
        frames.append(gframe)
    if num % 1000 == 0:
        print(num)

if num == 0:
    print("Something went wrong: no frames found.")
    exit(0)

cap.release()

user@ubuntu:/data$ python read.py movie.mov 
Unable to stop the stream: Inappropriate ioctl for device
Something went wrong: no frames found.
user@ubuntu:/data$

このトピックに関する他のStackOverflowの質問をいくつか見つけましたが、それらは私の正確な状況に完全には反映されていません。

  • この質問 OpenCVの再構築を提案します(Python 2も使用します)。Anacondaでこれを実行しようとしているため、これはオプションではありません。
  • OpenCVフォーラムでのこれらの2つの質問( ここここ )は、満足のいく答えがないまま残されました。
  • これ 活発な議論と徹底的な答えがありますが、それはPerlに固有のものです。

その3番目のポイントについては、引用符がinappropriate ioctl for deviceである他の質問がかなりありますが、それらのいずれかがこの問題に直接関連しているかどうかを確認するのは困難です。

部分的には別として、これとまったく同じopencv3 condaパッケージをmacOSマシンにインストールしました。ここに貼り付けたコードは、Ubuntuマシンで試したのとまったく同じ.movファイルで問題なく動作します。

何か案は?

8
Magsol

それを完全に回避することによって問題を解決しました。

Conda-forgeにOpenCVの opencv-feedstock レシピを使用しました。 recipeフォルダーには、condaのビルド情報があります。 build.shファイルを変更し、次のオプションを変更しました。

-DBUILD_PNG=1
-DBUILD_JPEG=1
-DWITH_CUDA=1
-DWITH_FFMPEG=1

親ディレクトリからconda build --numpy 1.12 recipeを実行し(ビルドスクリプトの要件にnumpy x.xがリストされているため、NumPyのバージョンを指定する必要がありました。これは、実行時にバージョンを提供する必要があることを意味します)、待機しました。

forever(真剣に、非常に強力なマシンで数時間-タイムシンクはCUDAです)を取りましたが、ビルドは最終的に正常に完了しました。

次に、ローカルに構築されたbz2アーカイブ(conda install --use-local opencv)をインストールするだけでした。奇妙なioctlエラーメッセージはもうありません。上記のスクリプトは問題なく機能しました。

3
Magsol