我正在尝试使用 OpenCV 3.2 读取 .mov 文件的帧(来自门波康达频道)。我在 Ubuntu 16.04 64 位设置上通过 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 上发现了几个关于这个主题的问题,但它们并不能完全反映我的具体情况:
-
这个问题建议重建 OpenCV(也使用 Python 2)。这对我来说不是一个选择,因为我正在尝试用 Anaconda 来做到这一点。
- 这两个问题(here and here)在OpenCV论坛上没有得到任何令人满意的答案。
-
This one有热烈的讨论和彻底的答案,但它是特定于 perl 的。
对于第三点——这里还有很多其他问题引用了这句话inappropriate ioctl for device
但很难看出其中是否有任何一个与这个问题直接相关。
顺便说一句:我已经在我的 macOS 机器上安装了这个完全相同的 opencv3 conda 包,并且我在此处粘贴的代码工作得很好,并且在我在 Ubuntu 机器上尝试过的完全相同的 .mov 文件上运行得很好。
有任何想法吗?
通过完全绕过它解决了这个问题。
使用了opencv-原料conda-forge 的 OpenCV 配方。在里面recipe
文件夹是 conda 的构建信息。我修改了build.sh
文件,更改以下选项:
-DBUILD_PNG=1
-DBUILD_JPEG=1
-DWITH_CUDA=1
-DWITH_FFMPEG=1
ran conda build --numpy 1.12 recipe
来自父目录(必须指定 NumPy 版本,因为构建脚本要求列出了numpy x.x
这意味着您必须在运行时提供版本),然后等待。
Took forever(说真的,在一台非常强大的机器上花了几个小时——时间消耗是 CUDA),但构建最终成功完成。
然后只需安装本地构建的 bz2 存档即可(conda install --use-local opencv
)。不再有奇怪的 ioctl 错误消息,上面的脚本工作得很好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)