Kivy: Écran blanc sur OpenCV3, mais fonctionne sur OpenCV2

Créé le 25 sept. 2017  ·  10Commentaires  ·  Source: kivy/kivy

Versions

  • Python : v2.7.12
  • OS : Linux (Gentoo)
  • Kivy : 1.10.0
  • Méthode d'installation de Kivy : pip install kivy==1.10.0

La description

Je souhaite utiliser mon appareil photo dans Kivy en utilisant l'exemple de code officiel d'ici :
https://github.com/kivy/kivy/blob/1.10.0/examples/camera/main.py
Cependant, je n'obtiens qu'un écran blanc lorsque j'utilise cv2. donc à partir de opencv-3.3.0|. If I compile opencv-2.4.13.3` cela fonctionne.
Il est intéressant de noter que dans les deux cas, la caméra semble s'initialiser (la led s'allume), mais avec opencv-2 la vidéo montre, tandis que l'écran reste blanc avec opencv-3.
J'ai aussi essayé avec un exemple plus minimaliste ci-dessous :

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()

Et j'obtiens le même résultat, c'est-à-dire que cela fonctionne avec opencv-2.4.13.3 pas avec opencv-3.3.0 .

J'ai téléchargé les deux versions sur https://github.com/opencv/opencv/releases.
Et ils ont tous les deux été compilés avec des drapeaux par défaut (simplement cmake puis make -j4 ).
Aussi pour les deux, l'exemple OpenCV ci-dessous fonctionne.

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()

Cela ressemble donc vraiment à un problème avec son intégration dans Kivy.

Commentaire le plus utile

Résolu. Regardez dans le fichier .../lib/python3.6/site-packages/kivy/core/camera/camera_opencv.py
ligne 121 :

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

Lorsque vous y arrivez en mode débogage, vous voyez que la valeur fps est en fait de 30 (et non 1/30).
Cette valeur est ensuite utilisée pour la planification de la mise à jour de la trame :

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

Changer cette ligne pour qu'elle soit :

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

résout le problème. Ce n'est bien sûr pas une solution complète, et probablement d'autres endroits dans le code devraient également changer.
J'espère que cela fonctionne pour vous aussi

Tous les 10 commentaires

je peux confirmer le problème

J'ai aussi un écran blanc avec opencv 3.
Je l'ai débogué et j'ai vu que les images entrantes ne sont pas vides, mais elles ne s'affichent toujours pas bien à l'écran

Résolu. Regardez dans le fichier .../lib/python3.6/site-packages/kivy/core/camera/camera_opencv.py
ligne 121 :

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

Lorsque vous y arrivez en mode débogage, vous voyez que la valeur fps est en fait de 30 (et non 1/30).
Cette valeur est ensuite utilisée pour la planification de la mise à jour de la trame :

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

Changer cette ligne pour qu'elle soit :

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

résout le problème. Ce n'est bien sûr pas une solution complète, et probablement d'autres endroits dans le code devraient également changer.
J'espère que cela fonctionne pour vous aussi

Aucune des "solutions" ci-dessus ne fonctionne sur Ubuntu 18.04 (version bêta) avec python 2.7.14 et opencv 3.
La webcam fonctionne avec des applications de bureau comme le fromage.
Nous, braintrainerplus.nl, avons vraiment besoin que la webcam fonctionne et sommes prêts à mettre une prime sur ce problème si quelqu'un est intéressé.

Je voulais prétraiter les données du tableau numpy renvoyées par opencv, avant de les afficher. Malheureusement, l'abstraction de la caméra de Kivy n'offrait que des données binaires de texture.

Cet aperçu a été utile pour accéder directement à la caméra :

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

Pour info : opencv 2.4.13 fonctionne avec kivy 1.10 sur Ubuntu 18.04.
(Je ne sais pas pourquoi ma première tentative a échoué mais après une autre compilation, cela a fonctionné)

Peut confirmer que le "correctif" de @yoelk fonctionne sur Arch Linux en utilisant Python 3.6.5 et OpenCV 3.3.0 dans un environnement virtuel.

Cela ressemble au même problème que https://github.com/kivy/kivy/issues/5146

@yoelk ma ligne 121 est
if self.fps <= 0: self.fps = 1 / 30

Et j'obtiens l'écran blanc. Je ne parviens pas à télécharger opencv2 en utilisant pip ou conda dans ma tentative de rétrogradation

Je peux confirmer que la webcam, testée avec bison intégré et logitech usb, fonctionne maintenant sur Kivy 1.10.1 stable avec le correctif de @yoelk .
Système : Ubuntu 18.04/Mint 19, openvc 3.2.0 et kivy 1.10.1 de ppa:kivy-team/kivy.

Je dois également commenter tous les fournisseurs sauf opencv dans kivy/core/camera/__init__.py pour forcer l'utilisation d'opencv car le reste échoue et donne toutes sortes d'erreurs étranges.

@CurtlyCritchlow le correctif est à la ligne 152 : self._update_ev = Clock.schedule_interval(self._update, 1/self.fps)

Cette page vous a été utile?
0 / 5 - 0 notes