OpenCV3 error: "Unable to stop the stream: Inappropriate ioctl for device"

OpenCV3 error: "Unable to stop the stream: Inappropriate ioctl for device"

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

问题是,当它命中 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()

<pre> 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$ </pre>

我发现了其他几个关于这个主题的 Whosebug 问题,但它们并不能完全转化为我的具体情况:

关于第三点——这里还有很多其他问题引用 inappropriate ioctl for device 但很难看出它们是否与这个问题直接相关。

顺便说一句:我已经在我的 macOS 机器上安装了这个完全相同的 opencv3 conda 包,我在这里粘贴的代码工作得很好,而且在我试过的完全相同的 .mov 文件上Ubuntu 机.

有什么想法吗?

通过完全绕过问题解决了问题。

为 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 版本,因为构建脚本要求列出 numpy x.x 这意味着您必须在运行时提供版本),并等待。

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

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

我在 Ubuntu 16.04 上遇到了与 Anaconda private env & Python 3.5 相同的问题。

最初使用

安装Opencv3
conda install -c menpo opencv3

解决方案:

  1. 删除 Opencv3 conda remove opencv3

  2. 使用pip install opencv-contrib-python

  3. 安装Opencv3

如果问题仍然存在:

  1. 卸载 OpenCV
  2. 安装依赖 sudo apt-get install ffmpeg sudo apt-get install libavcodec-dev libavformat-dev libavdevice-dev
  3. 使用步骤 2 重新安装 Opencv。