Error de OpenCV3: “No se puede detener la transmisión: ioctl inadecuado para el dispositivo”

Estoy tratando de leer los marcos de un archivo .mov usando OpenCV 3.2 (del canal menpo conda ). Estoy usando Python 3.5.3 a través de Anaconda en una configuración de Ubuntu 16.04 de 64 bits.

El problema es que recibo el siguiente mensaje de error de OpenCV cuando llega a la llamada cap.read() , y el bucle se interrumpe y atrapa el condicional if num == 0 inmediatamente.

Aquí está la totalidad del código que estoy ejecutando:

 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$ 

He encontrado un par de otras preguntas de StackOverflow sobre este tema, pero no se traducen en mi circunstancia exacta:

  • Esta pregunta propone reconstruir OpenCV (también usa Python 2). Esa no es una opción para mí, ya que estoy tratando de hacer esto con Anaconda.
  • Estas dos preguntas ( aquí y aquí ) en los foros de OpenCV se quedaron sin ninguna respuesta satisfactoria.
  • Esta tiene una discusión animada y una respuesta completa, pero es específica de perl.

A ese tercer punto, hay muchas otras preguntas aquí que tienen la cita inappropriate ioctl for device pero es difícil ver si alguna de ellas es directamente relevante para este problema.

Como parte parcial: he instalado este mismo paquete opdav3 conda en mi máquina macOS, y el código que he pegado aquí funciona bien y exactamente en el mismo archivo .mov que he probado en la máquina Ubuntu.

¿Algunas ideas?

Resolvió el problema evitándolo por completo.

Se utilizó la receta de OpenCV de material de alimentación opencv para conda-forge. En la carpeta de recipe está la información de comstackción para conda. build.sh archivo build.sh , cambiando las siguientes opciones:

 -DBUILD_PNG=1 -DBUILD_JPEG=1 -DWITH_CUDA=1 -DWITH_FFMPEG=1 

conda build --numpy 1.12 recipe de conda build --numpy 1.12 recipe desde el directorio principal (tuvo que especificar la versión NumPy, ya que el requisito del script de comstackción muestra numpy xx que significa que debe proporcionar la versión en tiempo de ejecución), y esperó.

Tomó una eternidad (en serio, un par de horas en una máquina muy poderosa, el tiempo es CUDA), pero la comstackción se completó con éxito.

Luego solo fue cuestión de instalar el archivo bz2 construido localmente ( conda install --use-local opencv ). No más mensajes de error extraños de ioctl, y el script anterior funcionó bien.

Me enfrenté al mismo problema con Anaconda private env & Python 3.5 en Ubuntu 16.04.

Inicialmente instalado Opencv3 utilizando

 conda install -c menpo opencv3 

Solución:

  1. Eliminar Opencv3 conda remove opencv3

  2. Instale Opencv3 usando pip install opencv-contrib-python

Si el problema aún persiste:

  1. Desinstalar OpenCV
  2. Dependencias de instalación sudo apt-get install ffmpeg sudo apt-get install libavcodec-dev libavformat-dev libavdevice-dev
  3. Reinstale Opencv usando el paso 2.