Anzeigen und Aufnehmen von Webkamerabildern mit Python Kivy [GUI]

Einführung

Kivy ist eine Bibliothek, mit der Sie GUI-Anwendungen in Python entwickeln können. Es ist mit mehreren Plattformen kompatibel und kann für kommerzielle Zwecke verwendet werden. Dieses Mal werde ich Kivy verwenden, um eine "GUI-Anwendung zu entwickeln, die Webkamerabilder anzeigt und aufnimmt"! Wir implementieren auch Kivy, um Bilder einfach in Schaltflächen umzuwandeln!

** * Detaillierte Verwendung wie Kivy entfällt ** スクリーンショット 2020-07-09 2.56.07.png

Umgebung

pip install

OpenCV


$ pip install opencv-python

Kivy


$ pip install cython pygame pillow
$ pip install Kivy

Trainieren

Kivy Bildschirm Erstellung (Hallo Welt!)

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

Ich habe die Label-Klasse verwendet, um Hello World! In Kivy ist es möglich, Elemente mithilfe einer kv-Datei in einer HTML-ähnlichen Atmosphäre festzulegen. Wenn diesmal Hello World! In der Mitte des schwarzen Bildschirms angezeigt wird, ist dies erfolgreich.

In Zukunft werden wir eine CameraPreview-Klasse erstellen, die das erfasste Bild und eine ImageButton-Klasse für die Aufnahmetaste anzeigt, und sie wie kv als kv-Datei installieren.

Zeigen Sie das Bild der Webkamera an

Verwenden Sie OpenCV, um das Webkamerabild als Frame abzurufen.

Programm und Beschreibung

main.Zu py hinzugefügt


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)
        #Verbindung zur 0. Kamera herstellen
        self.capture = cv2.VideoCapture(0)
        #Zeichnungsintervall einstellen
        Clock.schedule_interval(self.update, 1.0 / 30)

    #Zeichenmethode in Intervallen auszuführen
    def update(self, dt):
        #Rahmen laden
        ret, self.frame = self.capture.read()
        #In Kivy-Textur konvertieren
        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')
        #Ändern Sie die Textur der Instanz
        self.texture = texture

Ich habe eine Unterklasse namens CameraPreview erstellt, die die Image-Klasse erbt. Diese Klasse erfasst und aktualisiert das mit der Funktion opencv-python aufgenommene Webkamerabild. Konvertieren Sie den abgerufenen Frame in das Texturformat, damit er in der Bildklasse von Kivy angezeigt werden kann.

Bearbeiten Sie als Nächstes die kv-Datei und spiegeln Sie sie auf dem Bildschirm wider.

mycamera.kv


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

【Hinweis】 Wenn Sie unter macOS das Programm in einem Terminal in einem Drittanbieter-Editor wie VScode ausführen und versuchen, das Webkamerabild mit opencv-python wie diesem Programm abzurufen, tritt ein Fehler auf!

Implementierung der Aufnahmetaste

Sie können normale Schaltflächen verwenden, dies ist jedoch nicht interessant. Bereiten Sie daher ein Bild wie ein Aufnahmesymbol vor und erstellen Sie ein Programm, das Sie aufnehmen können, wenn Sie darauf klicken. Das Bild hat freies Material entsprechend aufgenommen!

Programm und Beschreibung

main.Zu py hinzugefügt


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

#Aufnahmetaste
class ImageButton(ButtonBehavior, Image):
    preview = ObjectProperty(None)

    #Ausführen, wenn die Taste gedrückt wird
    def on_press(self):
        cv2.namedWindow("CV2 Image")
        cv2.imshow("CV2 Image", self.preview.frame)
        cv2.waitKey(0)
        cv2.destroyAllWindows()

Auf diese Weise wird es möglich, on_press () zu verarbeiten, das ausgeführt wird, wenn die Taste gedrückt wird, indem nicht nur die Image-Klasse, sondern auch die ButtonBehavior-Klasse geerbt wird. Überschreiben Sie on_press () und schreiben Sie es in den gewünschten Prozess um.

【wichtig】 Legen Sie die ObjectProperty so fest, dass in der CameraPreview-Klasse auf sie verwiesen werden kann. Was möchten Sie auf die Variable (Vorschau hier) verweisen, für die ObjectProperty festgelegt ist? Um dies anzugeben, legen Sie in der kv-Datei Folgendes fest.

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

Deklarieren Sie die Variable, für die ObjectProperty in der Python-Datei festgelegt ist, auf dieselbe Weise wie in der kv-Datei, und setzen Sie den Wert auf die ID derjenigen, auf die Sie verweisen möchten. (Vorschau: camera_preview Teil) Dadurch kann Kivy Werte zwischen Klassen referenzieren.

Programm abgeschlossen

Das Programm ist abgeschlossen! Lassen wir Koala, der auch am Anfang der Seite erschien, wieder erscheinen. Wenn Sie diesmal auf die Schaltfläche zum Aufnehmen klicken, wird das Bild von imshow () von OpenCV angezeigt, aber es kann natürlich zum Speichern neu geschrieben werden. スクリーンショット 2020-07-09 2.56.07.png

Ergänzung

Wenn Sie die Meldung erhalten, laden Sie möglicherweise zwei Sätze von Qt-Binärdateien in denselben Prozess. Wenn Sie die Aufnahmetaste drücken, sollte dies das Problem lösen.

$ pip install opencv-python-headless

Referenzseite

Recommended Posts

Anzeigen und Aufnehmen von Webkamerabildern mit Python Kivy [GUI]
GUI-Programmierung mit kivy ~ Teil 3 Video und Suchleiste ~
[GUI in Python] PyQt5-Drag & Drop-
Berechnen Sie das Standardgewicht und zeigen Sie es mit Python an
Fröhliche GUI-Konstruktion mit Elektron und Python
Interaktive Anzeige algebraischer Kurven in Python, Jupyter
[Python] Webkamera-Rahmengröße und FPS-Einstellungen mit OpenCV
Zeigen Sie das Bild der USB-Kamera mit OpenCV von Python mit Raspeye an
Programmieren mit Python und Tkinter
Ver- und Entschlüsselung mit Python
Python und Hardware-Verwenden von RS232C mit Python-
YouTube-Videoverwaltung mit Python 3
[GUI in Python] PyQt5-Layout-Management-
Python mit Pyenv und Venv
[GUI mit Python] PyQt5-Vorbereitung-
Funktioniert mit Python und R.
[GUI mit Python] PyQt5 -Paint-
[Python] Lesen Sie die CSV-Datei und zeigen Sie die Abbildung mit matplotlib an
Konvertieren Sie Videos mit ffmpeg + python + opencv in Schwarzweiß
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Kommunizieren Sie mit FX-5204PS mit Python und PyUSB
Leuchtendes Leben mit Python und OpenCV
Installieren Sie Python 2.7.9 und Python 3.4.x mit pip.
Neuronales Netzwerk mit OpenCV 3 und Python 3
AM-Modulation und Demodulation mit Python
Scraping mit Node, Ruby und Python
[GUI mit Python] PyQt5 -Widget II-
Lassen Sie uns eine GUI mit Python erstellen.
Schließen Sie eine handelsübliche Webkamera an einen PC mit Ubuntu 16.04 an, der über USB installiert ist, und nehmen Sie ein Video mit Python auf
Kratzen mit Python und schöner Suppe
IME On / Off wird in Zusammenarbeit mit Python und Arduino durch LED angezeigt
[GUI mit Python] PyQt5-Der erste Schritt-
Echtzeitanzeige von Videos, die von einer Webkamera auf einem Jupyter-Notebook (Python3) aufgenommen wurden
JSON-Codierung und -Decodierung mit Python
Hadoop-Einführung und MapReduce mit Python
Lesen und Schreiben von NetCDF mit Python
Ich habe mit PyQt5 und Python3 gespielt
Lesen und Schreiben von CSV mit Python
Mehrfachintegration mit Python und Sympy
[GUI mit Python] PyQt5 -Custom Widget-
[GUI in Python] PyQt5-Menü und Symbolleiste-
Koexistenz von Python2 und 3 mit CircleCI (1.0)
Sugoroku-Spiel und Zusatzspiel mit Python
FM-Modulation und Demodulation mit Python
Setzen Sie OpenCV in OS X mit Homebrew ein und geben Sie Video mit Python ein / aus
Erstellen Sie eine Python3-Umgebung mit pyenv auf einem Mac und zeigen Sie NetworkX-Diagramme an
Kommunizieren Sie mit gRPC zwischen Elixir und Python
[Python] Heatmap im Kalenderstil (mit Feiertagsanzeige)
Datenpipeline-Aufbau mit Python und Luigi
Überwachen Sie Mojo-Ausfälle mit Python und Skype
GUI-Programmierung mit kivy ~ Teil 4 Verschiedene Tasten ~
FM-Modulation und Demodulation mit Python Part 3
[Automatisierung] Bearbeiten Sie Maus und Tastatur mit Python
Passwortlose Authentifizierung mit RDS und IAM (Python)
Speichern Sie Videos Frame für Frame mit Python OpenCV
Python-Installation und Paketverwaltung mit pip
Verwenden von Python und MeCab mit Azure Databricks
POST verschieden mit Python und empfange mit Flask
Führen Sie die Google-Übersetzung und die DeepL-Übersetzung mit der GUI aus