Afficher et prendre des images de caméra Web avec Python Kivy [GUI]

introduction

Kivy est une bibliothèque qui vous permet de développer des applications GUI en Python. Il est compatible avec plusieurs plates-formes et peut être utilisé à des fins commerciales. Cette fois, j'utiliserai Kivy pour développer une "application GUI qui affiche et prend des images de caméras Web"! Nous implémentons également Kivy pour convertir facilement des images en boutons!

** * L'utilisation détaillée telle que Kivy est omise ** スクリーンショット 2020-07-09 2.56.07.png

environnement

pip install

OpenCV


$ pip install opencv-python

Kivy


$ pip install cython pygame pillow
$ pip install Kivy

Entraine toi

Création d'écran Kivy (Hello World!)

main.py


from kivy.app import App

class MainScreen(Widget):
    pass

class MyCameraApp(App):
    def build(self):
        return MainScreen()

if __name__ == '__main__':
    MyCameraApp().run()

mycamera.kv


<MainScreen>:
    Label:
        text: 'Hello World!'
        center: root.width * 0.5 , root.height * 0.5

J'ai utilisé la classe Label pour afficher Hello World!. Dans Kivy, il est possible de placer des éléments dans une atmosphère de type HTML en utilisant un fichier kv. Cette fois, si Hello World! Est affiché au milieu de l'écran noir, c'est réussi.

À l'avenir, nous allons créer une classe CameraPreview qui affiche l'image acquise et une classe ImageButton pour le bouton de prise de vue, et les installer en tant que fichier kv de la même manière que Label.

Afficher l'image de la webcam

Utilisez OpenCV pour obtenir l'image de la caméra Web sous forme de cadre.

Programme et description

main.Ajouté à py


from kivy.uix.image import Image
from kivy.graphics.texture import Texture
from kivy.clock import Clock
import cv2

class CameraPreview(Image):
    def __init__(self, **kwargs):
        super(CameraPreview, self).__init__(**kwargs)
        #Connectez-vous à la 0ème caméra
        self.capture = cv2.VideoCapture(0)
        #Définir l'intervalle de dessin
        Clock.schedule_interval(self.update, 1.0 / 30)

    #Méthode de dessin à exécuter à intervalles
    def update(self, dt):
        #Cadre de charge
        ret, self.frame = self.capture.read()
        #Convertir en texture Kivy
        buf = cv2.flip(self.frame, 0).tostring()
        texture = Texture.create(size=(self.frame.shape[1], self.frame.shape[0]), colorfmt='bgr') 
        texture.blit_buffer(buf, colorfmt='bgr', bufferfmt='ubyte')
        #Changer la texture de l'instance
        self.texture = texture

J'ai créé une sous-classe appelée CameraPreview qui hérite de la classe Image. Cette classe acquiert et met à jour l'image de la caméra Web acquise à l'aide de la fonction opencv-python. Convertissez le cadre récupéré au format Texture afin qu'il puisse être affiché dans la classe Image de Kivy.

Ensuite, modifiez le fichier kv et réfléchissez-le à l'écran.

mycamera.kv


<MainScreen>:
    CameraPreview:
        id: camera_preview
        size: root.size

【Mise en garde】 Sous macOS, si vous exécutez le programme dans un terminal dans un éditeur tiers tel que VScode et essayez d'obtenir la vidéo de la webcam en utilisant opencv-python comme ce programme, vous obtiendrez une erreur!

Mise en place du bouton de prise de vue

Vous pouvez utiliser des boutons normaux, mais ce n'est pas intéressant, alors préparez une image comme une icône de prise de vue et créez un programme que vous pouvez prendre en photo lorsque vous cliquez dessus. L'image a capté du matériel gratuit de manière appropriée!

Programme et description

main.Ajouté à py


from kivy.uix.behaviors import ButtonBehavior
from kivy.properties import ObjectProperty

#Bouton de prise de vue
class ImageButton(ButtonBehavior, Image):
    preview = ObjectProperty(None)

    #Exécuter lorsque le bouton est enfoncé
    def on_press(self):
        cv2.namedWindow("CV2 Image")
        cv2.imshow("CV2 Image", self.preview.frame)
        cv2.waitKey(0)
        cv2.destroyAllWindows()

De cette façon, en héritant non seulement de la classe Image mais aussi de la classe ButtonBehavior, il devient possible de gérer on_press () qui est exécuté lorsque le bouton est enfoncé. Remplacez on_press () et réécrivez-le dans le processus que vous souhaitez effectuer.

【important】 Définissez ObjectProperty afin qu'il puisse être référencé dans la classe CameraPreview. Que voulez-vous faire référence à la variable (aperçu ici) pour laquelle ObjectProperty est défini? Pour spécifier, définissez dans le fichier kv comme suit.

mycamera.kv


<MainScreen>:
    CameraPreview:
        id: camera_preview
        size: root.size
        
    ImageButton:
        preview: camera_preview
        source: 'icons/capture.png'
        size: 100, 100
        center: root.width * 0.5, root.height * 0.2

Déclarez la variable pour laquelle ObjectProperty est définie dans le fichier Python de la même manière dans le fichier kv, et définissez la valeur sur l'ID de celui auquel vous souhaitez faire référence. (aperçu: partie camera_preview) Cela permet à Kivy de référencer des valeurs entre les classes.

Programme terminé

Le programme est terminé! Faisons réapparaître Koala, qui est également apparu au début de la page. Cette fois, lorsque vous cliquez sur le bouton de prise de vue, l'image est affichée par imshow () d'OpenCV, mais bien sûr, elle peut être réécrite au processus de sauvegarde. スクリーンショット 2020-07-09 2.56.07.png

Supplément

Si vous obtenez le message Vous chargez peut-être deux ensembles de binaires Qt dans le même processus. Lorsque vous appuyez sur le bouton de prise de vue, cela devrait résoudre le problème.

$ pip install opencv-python-headless

Site de référence

Recommended Posts

Afficher et prendre des images de caméra Web avec Python Kivy [GUI]
Programmation GUI avec kivy ~ Partie 3 Vidéo et barre de recherche ~
[GUI en Python] PyQt5-Glisser-déposer-
Calculer et afficher le poids standard avec python
Construction d'interface graphique heureuse avec électron et python
Afficher de manière interactive des courbes algébriques en Python, Jupyter
[Python] Taille d'image de la caméra Web et paramètres FPS avec OpenCV
Afficher l'image de la caméra USB avec OpenCV de Python avec Raspeye
Programmation avec Python et Tkinter
Chiffrement et déchiffrement avec Python
Python et matériel - Utilisation de RS232C avec Python -
Gestion de vidéos YouTube avec Python 3
[GUI en Python] PyQt5-Layout management-
python avec pyenv et venv
[GUI avec Python] PyQt5-Préparation-
Fonctionne avec Python et R
[GUI avec Python] PyQt5 -Paint-
[Python] Lisez le fichier csv et affichez la figure avec matplotlib
Convertir une vidéo en noir et blanc avec ffmpeg + python + opencv
J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter
Communiquez avec FX-5204PS avec Python et PyUSB
Briller la vie avec Python et OpenCV
Installez Python 2.7.9 et Python 3.4.x avec pip.
Réseau neuronal avec OpenCV 3 et Python 3
Modulation et démodulation AM avec python
Scraping avec Node, Ruby et Python
[GUI avec Python] PyQt5 -Widget II-
Faisons une interface graphique avec python.
Connectez une caméra Web disponible dans le commerce à un PC avec ubuntu 16.04 installé via USB et capturez une vidéo avec python
Grattage avec Python et belle soupe
IME On / Off est affiché par LED en coopération avec Python et Arduino
[GUI avec Python] PyQt5-La première étape-
Affichage en temps réel de la vidéo acquise à partir de la caméra Web sur le notebook Jupyter (Python3)
Encodage et décodage JSON avec python
Introduction à Hadoop et MapReduce avec Python
Lire et écrire NetCDF avec Python
J'ai joué avec PyQt5 et Python3
Lire et écrire du CSV avec Python
Intégration multiple avec Python et Sympy
[GUI avec Python] PyQt5-Widget personnalisé-
[GUI en Python] Menu PyQt5 et barre d'outils-
Coexistence de Python2 et 3 avec CircleCI (1.0)
Jeu Sugoroku et jeu d'addition avec Python
Modulation et démodulation FM avec Python
Mettez OpenCV dans OS X avec Homebrew et vidéo d'entrée / sortie avec python
Créez un environnement Python 3 avec pyenv sur Mac et affichez des graphiques Network X
Communiquez entre Elixir et Python avec gRPC
[Python] Carte thermique de style calendrier (avec affichage des jours fériés)
Construction de pipeline de données avec Python et Luigi
Surveiller les pannes de Mojo avec Python et Skype
Programmation GUI à l'aide de kivy ~ Partie 4 Divers boutons ~
Modulation et démodulation FM avec Python Partie 3
[Automation] Manipulez la souris et le clavier avec Python
Authentification sans mot de passe avec RDS et IAM (Python)
Enregistrer la vidéo image par image avec Python OpenCV
Installation de Python et gestion des packages avec pip
Utilisation de Python et MeCab avec Azure Databricks
POSTER diversement avec Python et recevoir avec Flask
Exécuter la traduction Google et la traduction DeepL avec l'interface graphique