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 **
pip install
OpenCV
$ pip install opencv-python
Kivy
$ pip install cython pygame pillow
$ pip install Kivy
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.
Verwenden Sie OpenCV, um das Webkamerabild als Frame abzurufen.
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!
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!
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.
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.
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
Recommended Posts