Kivy: Pantalla blanca en OpenCV3, pero funciona en OpenCV2

Creado en 25 sept. 2017  ·  10Comentarios  ·  Fuente: kivy/kivy

Versiones

  • Python: v2.7.12
  • SO: Linux (Gentoo)
  • Kivy: 1.10.0
  • Método de instalación de Kivy: pip install kivy == 1.10.0

Descripción

Quiero usar mi cámara en Kivy usando el código de ejemplo oficial de aquí:
https://github.com/kivy/kivy/blob/1.10.0/examples/camera/main.py
Sin embargo, solo obtengo una pantalla en blanco cuando uso cv2.so de opencv-3.3.0|. If I compile opencv-2.4.13.3` funciona.
Es interesante notar que en ambos casos la cámara parece inicializarse (el led se enciende), pero con opencv-2 se muestra el video, mientras que la pantalla permanece blanca con opencv-3.
También probé con un ejemplo más minimalista a continuación:

import kivy

from kivy.app import App
from kivy.uix.camera import Camera

class MainApp(App):
    def build(self):
        return Camera(play=True, resolution=(640, 480))

if __name__== "__main__":
    MainApp().run()

Y obtengo el mismo resultado, es decir, funciona con opencv-2.4.13.3 no con opencv-3.3.0 .

Descargué ambas versiones de https://github.com/opencv/opencv/releases.
Y ambos fueron compilados con indicadores predeterminados (simplemente cmake y luego make -j4 ).
También para ambos, el ejemplo de OpenCV puro a continuación está funcionando.

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Display the resulting frame
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

Así que realmente parece un problema con su integración en Kivy.

Comentario más útil

Resuelto. Busque en el archivo .../lib/python3.6/site-packages/kivy/core/camera/camera_opencv.py
línea 121:

        if self.fps <= 0:
            self.fps = 1 / 30.

Cuando llegue allí en modo de depuración, verá que el valor de fps es en realidad 30 (y no 1/30).
Este valor se utiliza luego para la programación de actualización de tramas:

self._update_ev = Clock.schedule_interval(self._update, self.fps)

Cambiando esta línea para que sea:

self._update_ev = Clock.schedule_interval(self._update, 1/self.fps)

resuelve el problema. Por supuesto, no es una solución completa, y probablemente otros lugares del código también deberían cambiar.
Espero que esto funcione para ti también

Todos 10 comentarios

Puedo confirmar el problema

También tengo una pantalla blanca con opencv 3.
Lo depuré y vi que los marcos entrantes no están vacíos, pero aún así no se muestran bien en la pantalla

Resuelto. Busque en el archivo .../lib/python3.6/site-packages/kivy/core/camera/camera_opencv.py
línea 121:

        if self.fps <= 0:
            self.fps = 1 / 30.

Cuando llegue allí en modo de depuración, verá que el valor de fps es en realidad 30 (y no 1/30).
Este valor se utiliza luego para la programación de actualización de tramas:

self._update_ev = Clock.schedule_interval(self._update, self.fps)

Cambiando esta línea para que sea:

self._update_ev = Clock.schedule_interval(self._update, 1/self.fps)

resuelve el problema. Por supuesto, no es una solución completa, y probablemente otros lugares del código también deberían cambiar.
Espero que esto funcione para ti también

Ninguna de las 'soluciones' anteriores funciona en Ubuntu 18.04 (versión Beta) con python 2.7.14 y opencv 3.
Webcam funciona con aplicaciones de escritorio como Cheese.
Nosotros, braintrainerplus.nl, realmente necesitamos que la cámara web funcione y estamos preparados para ofrecer una recompensa por este problema si alguien está interesado.

Quería preprocesar los datos de la matriz numpy devueltos por opencv, antes de mostrarlos. Desafortunadamente, la abstracción de la cámara de kivy solo ofrecía datos binarios de textura.

Esta esencia fue útil para acceder a la cámara directamente:

https://gist.github.com/ExpandOcean/de261e66949009f44ad2

Para su información: opencv 2.4.13 funciona con kivy 1.10 en Ubuntu 18.04.
(No estoy seguro de por qué falló mi primer intento, pero después de otra compilación funcionó)

Puede confirmar que la "corrección" de @yoelk funciona en Arch Linux usando Python 3.6.5 y OpenCV 3.3.0 dentro de un entorno virtual.

Parece el mismo problema que https://github.com/kivy/kivy/issues/5146

@yoelk mi línea 121 es
if self.fps <= 0: self.fps = 1 / 30

Y me aparece la pantalla blanca. No puedo descargar opencv2 ni usando pip ni conda en mi intento de degradar

Puedo confirmar que la cámara web, probada con bison y usb logitech integrados, ahora funciona en kivy estable 1.10.1 con la solución de @yoelk .
Sistema: Ubuntu 18.04 / Mint 19, openvc 3.2.0 y kivy 1.10.1 de ppa: kivy-team / kivy.

También tengo que comentar todos los proveedores excepto el opencv en kivy / core / camera / __ init__.py para forzar el uso de opencv ya que el resto simplemente falla y da todo tipo de errores extraños.

@CurtlyCritchlow la solución está en la línea 152: self._update_ev = Clock.schedule_interval (self._update, 1 / self.fps)

¿Fue útil esta página
0 / 5 - 0 calificaciones