OpenCV3错误:"无法停止流:设备的不适当的ioctl"

Mag*_*sol 8 python opencv anaconda conda

我正在尝试使用OpenCV 3.2(来自menpo conda频道)读取.mov文件的帧.我在Ubuntu 16.04 64位设置上使用Python 3.5.3通过Anaconda.

问题是,当我遇到cap.read()调用时,我从OpenCV得到以下错误消息,并且循环立即中断并捕获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()
Run Code Online (Sandbox Code Playgroud)

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$
Run Code Online (Sandbox Code Playgroud)

我在这个主题上发现了其他几个StackOverflow问题,但它们并没有完全转化为我的确切情况:

  • 这个问题建议重建OpenCV(也使用Python 2).这对我来说不是一个选择,因为我正在尝试用Anaconda做这件事.
  • OpenCV论坛上的这两个问题(这里这里)没有任何令人满意的答案.
  • 这个有一个生动的讨论和一个彻底的答案,但它是perl特有的.

至于第三点 - 这里有很多其他问题都有引用,inappropriate ioctl for device但很难看出它们中的任何一个是否与这个问题直接相关.

暂时不说:我已经在我的macOS机器上安装了这个完全相同的opencv3 conda软件包,我在这里粘贴的代码工作正常,并且在我尝试过的Ubuntu机器上完全相同的.mov文件.

有任何想法吗?

Mag*_*sol 3

通过完全绕过它解决了这个问题。

将OpenCV 的opencv-feedstock配方用于 conda-forge。该recipe文件夹中是 conda 的构建信息。我修改了该build.sh文件,更改了以下选项:

-DBUILD_PNG=1
-DBUILD_JPEG=1
-DWITH_CUDA=1
-DWITH_FFMPEG=1
Run Code Online (Sandbox Code Playgroud)

从父目录运行conda build --numpy 1.12 recipe(必须指定 NumPy 版本,因为构建脚本要求列出了numpy x.x,这意味着您必须在运行时提供版本),然后等待。

花了很长时间(说真的,在一台非常强大的机器上花了几个小时——时间消耗是 CUDA),但构建最终成功完成。

然后只需安装本地构建的 bz2 存档 ( conda install --use-local opencv) 即可。不再有奇怪的 ioctl 错误消息,上面的脚本工作得很好。