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の質問をいくつか見つけましたが、それらは私の正確な状況に完全には反映されていません。
その3番目のポイントについては、引用符がinappropriate ioctl for device
である他の質問がかなりありますが、それらのいずれかがこの問題に直接関連しているかどうかを確認するのは困難です。
部分的には別として、これとまったく同じopencv3 condaパッケージをmacOSマシンにインストールしました。ここに貼り付けたコードは、Ubuntuマシンで試したのとまったく同じ.movファイルで問題なく動作します。
何か案は?
それを完全に回避することによって問題を解決しました。
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エラーメッセージはもうありません。上記のスクリプトは問題なく機能しました。