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

时间:2017-03-02 18:14:12

标签: python opencv anaconda conda

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

问题是,当我遇到src/sql/sql.ts has no exported member "Sql"调用时,我从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()

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

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

至于第三点 - 这里有很多其他问题都有引用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$ ,但很难看出它们中是否有任何与这个问题直接相关。

作为一个局部的一边:我已经在我的macOS机器上安装了这个完全相同的opencv3 conda包,我在这里粘贴的代码工作得很好,并且在我尝试过的Ubuntu机器上完全相同的.mov文件

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

通过彻底解决问题来解决问题。

使用OpenCV的opencv-feedstock配方进行conda-forge。在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错误消息,上面的脚本运行得很好。

答案 1 :(得分:-1)

我遇到了与Anaconda私人环境相同的问题。 Ubuntu 16.04上的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。