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 问题,但它们并不能完全转化为我的具体情况:
- This question 提议重建 OpenCV(也使用 Python 2)。这对我来说不是一个选择,因为我正试图用 Anaconda 做到这一点。
- OpenCV论坛上的这两个问题(here and here)都没有满意的答案。
- This one 有热烈的讨论和彻底的回答,但它是特定于 perl 的。
关于第三点——这里还有很多其他问题引用 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
解决方案:
删除 Opencv3 conda remove opencv3
使用pip install opencv-contrib-python
安装Opencv3
如果问题仍然存在:
- 卸载 OpenCV
- 安装依赖
sudo apt-get install ffmpeg
sudo apt-get install libavcodec-dev libavformat-dev libavdevice-dev
- 使用步骤 2 重新安装 Opencv。
我正在尝试使用 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 问题,但它们并不能完全转化为我的具体情况:
- This question 提议重建 OpenCV(也使用 Python 2)。这对我来说不是一个选择,因为我正试图用 Anaconda 做到这一点。
- OpenCV论坛上的这两个问题(here and here)都没有满意的答案。
- This one 有热烈的讨论和彻底的回答,但它是特定于 perl 的。
关于第三点——这里还有很多其他问题引用 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 相同的问题。
最初使用
安装Opencv3conda install -c menpo opencv3
解决方案:
删除 Opencv3
conda remove opencv3
使用
pip install opencv-contrib-python
安装Opencv3
如果问题仍然存在:
- 卸载 OpenCV
- 安装依赖
sudo apt-get install ffmpeg
sudo apt-get install libavcodec-dev libavformat-dev libavdevice-dev
- 使用步骤 2 重新安装 Opencv。