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 **
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
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.
Utilisez OpenCV pour obtenir l'image de la caméra Web sous forme de cadre.
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!
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!
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.
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.
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
Recommended Posts