[PYTHON] Affichez l'image de la caméra connectée à l'ordinateur personnel sur l'interface graphique.

1. Ce que vous voulez faire

L'image prise de l'appareil photo s'affiche sur l'écran GUI. Il ajoute également la possibilité de prendre une photo lorsque vous appuyez sur le déclencheur de l'appareil photo.

2. Contenu du programme

  1. Configurez une instance de caméra avec VideoCapture () d'OpenCV.
  2. Utilisez le canevas de Tkinter comme écran pour afficher la vidéo (image).
  3. Utilisez OpenCV read () pour obtenir l'image fixe (Frame) de la caméra.
  4. L'image fixe (Frame) de la caméra acquise en 3. s'affiche sur le canevas de Tkinter.
  5. Utilisez update () et after () de Python pour boucler 3-4. (= ** Afficher l'image sur Canvas. Cette opération est effectuée des dizaines de fois par seconde, elle ressemble donc à une vidéo. **)

3. Conception

3.1. Instance de caméra

Utilisez VideoCapture () pour configurer un vcap d'instance de caméra. source vidéo = 0 Caméra intégrée video_source = 1 caméra USB

À ce moment-là, la largeur et la hauteur de l'image vidéo sont également acquises.

self.vcap = cv2.VideoCapture( video_source )
self.width = self.vcap.get( cv2.CAP_PROP_FRAME_WIDTH )
self.height = self.vcap.get( cv2.CAP_PROP_FRAME_HEIGHT )

3.2. Tkinter Canvas

Utilisez Tkinter pour configurer une instance Canvas.

self.canvas1 = tk.Canvas(self.frame_cam)
self.canvas1.configure( width= self.width, height=self.height)
self.canvas1.grid(column= 0, row=0,padx = 10, pady=10)

3.3. Obtenez l'image fixe de la caméra avec read ()

Utilisez OpenCV read () pour obtenir l'image vcap. Stockez celui acquis dans le cadre. Convertissez ce que vous avez obtenu avec BGR en RVB et stockez-le à nouveau dans un cadre.

_, frame = self.vcap.read()
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

3.4 Affichez l'image fixe de la caméra sur le canevas de Tkinter.

Utilisez Pillow pour convertir le cadre acquis en photo une fois. La raison en est que Canvas ne peut afficher que les images traitées par Pillow. (Peut-être) Ensuite, la photo est affichée sur Canvas.

#OpenCV frame -> Pillow Photo
self.photo = PIL.ImageTk.PhotoImage(image = PIL.Image.fromarray(frame))

#self.photo -> Canvas
self.canvas1.create_image(0,0, image= self.photo, anchor = tk.NW)

3.5. Utilisez update () et after () de Python pour boucler 3-4.

Réglez le cycle de mise à jour avec un délai. L'unité est la milliseconde. Cette fois, réglez-le sur 15 millisecondes. ** Voyez comment le FPS de la vidéo change lorsque vous modifiez la valeur de ce délai. ** ** Insérez update () dans la partie principale et après () dans la partie qui affiche l'image sur le canevas.


self.delay = 15 #[mili seconds]
self.update()

#...............
def update(self):
    #Get a frame from the video source
     _, frame = self.vcap.read()

    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    self.photo = PIL.ImageTk.PhotoImage(image = PIL.Image.fromarray(frame))

    #self.photo -> Canvas
    self.canvas1.create_image(0,0, image= self.photo, anchor = tk.NW)

    self.master.after(self.delay, self.update)

3.6. Instantané

L'instantané est traité en convertissant l'image apprise par read () d'OpenCV en RVB puis en l'enregistrant sous forme de fichier avec cv2.imwrite.

    def press_snapshot_button(self):
        # Get a frame from the video source
        _, frame = self.vcap.read()
        frame1 = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

        cv2.imwrite( "frame-" + time.strftime( "%Y-%d-%m-%H-%M-%S" ) + ".jpg ",
                     cv2.cvtColor( frame1, cv2.COLOR_BGR2RGB ) )

4. Résultat de l'exécution

bandicam-2020-08-03-15-00-20-115.gif

5. Résumé

  1. L'image prise de l'appareil photo peut être affichée sur l'écran GUI.
  2. Utilisez OpenCV et Tkinter.
  3. Il est important d'utiliser update () et after () de Python.

6. Documents de référence

1.Python OpenCV - show a video in a Tkinter window 2. [Tarte aux framboises] Comment afficher l'image du module caméra sur Tkinter 3. Charger la vidéo avec Python, OpenCV (fichier / image de la caméra) 4. Version modifiée: j'ai fait un disjoncteur de bloc avec tkinter de Python.

7. Code de programme


import tkinter as tk
from tkinter import ttk
import cv2
import PIL.Image, PIL.ImageTk
from tkinter import font
import time


class Application(tk.Frame):
    def __init__(self,master, video_source=0):
        super().__init__(master)

        self.master.geometry("700x700")
        self.master.title("Tkinter with Video Streaming and Capture")

        # ---------------------------------------------------------
        # Font
        # ---------------------------------------------------------
        self.font_frame = font.Font( family="Meiryo UI", size=15, weight="normal" )
        self.font_btn_big = font.Font( family="Meiryo UI", size=20, weight="bold" )
        self.font_btn_small = font.Font( family="Meiryo UI", size=15, weight="bold" )

        self.font_lbl_bigger = font.Font( family="Meiryo UI", size=45, weight="bold" )
        self.font_lbl_big = font.Font( family="Meiryo UI", size=30, weight="bold" )
        self.font_lbl_middle = font.Font( family="Meiryo UI", size=15, weight="bold" )
        self.font_lbl_small = font.Font( family="Meiryo UI", size=12, weight="normal" )

        # ---------------------------------------------------------
        # Open the video source
        # ---------------------------------------------------------

        self.vcap = cv2.VideoCapture( video_source )
        self.width = self.vcap.get( cv2.CAP_PROP_FRAME_WIDTH )
        self.height = self.vcap.get( cv2.CAP_PROP_FRAME_HEIGHT )

        # ---------------------------------------------------------
        # Widget
        # ---------------------------------------------------------

        self.create_widgets()

        # ---------------------------------------------------------
        # Canvas Update
        # ---------------------------------------------------------

        self.delay = 15 #[mili seconds]
        self.update()


    def create_widgets(self):

        #Frame_Camera
        self.frame_cam = tk.LabelFrame(self.master, text = 'Camera', font=self.font_frame)
        self.frame_cam.place(x = 10, y = 10)
        self.frame_cam.configure(width = self.width+30, height = self.height+50)
        self.frame_cam.grid_propagate(0)

        #Canvas
        self.canvas1 = tk.Canvas(self.frame_cam)
        self.canvas1.configure( width= self.width, height=self.height)
        self.canvas1.grid(column= 0, row=0,padx = 10, pady=10)

        # Frame_Button
        self.frame_btn = tk.LabelFrame( self.master, text='Control', font=self.font_frame )
        self.frame_btn.place( x=10, y=550 )
        self.frame_btn.configure( width=self.width + 30, height=120 )
        self.frame_btn.grid_propagate( 0 )

        #Snapshot Button
        self.btn_snapshot = tk.Button( self.frame_btn, text='Snapshot', font=self.font_btn_big)
        self.btn_snapshot.configure(width = 15, height = 1, command=self.press_snapshot_button)
        self.btn_snapshot.grid(column=0, row=0, padx=30, pady= 10)

        # Close
        self.btn_close = tk.Button( self.frame_btn, text='Close', font=self.font_btn_big )
        self.btn_close.configure( width=15, height=1, command=self.press_close_button )
        self.btn_close.grid( column=1, row=0, padx=20, pady=10 )




    def update(self):
        #Get a frame from the video source
        _, frame = self.vcap.read()

        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        self.photo = PIL.ImageTk.PhotoImage(image = PIL.Image.fromarray(frame))

        #self.photo -> Canvas
        self.canvas1.create_image(0,0, image= self.photo, anchor = tk.NW)

        self.master.after(self.delay, self.update)

    def press_snapshot_button(self):
        # Get a frame from the video source
        _, frame = self.vcap.read()

        frame1 = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

        cv2.imwrite( "frame-" + time.strftime( "%Y-%d-%m-%H-%M-%S" ) + ".jpg ",
                     cv2.cvtColor( frame1, cv2.COLOR_BGR2RGB ) )

    def press_close_button(self):
        self.master.destroy()
        self.vcap.release()





def main():
    root = tk.Tk()
    app = Application(master=root)#Inherit
    app.mainloop()

if __name__ == "__main__":
    main()


Recommended Posts

Affichez l'image de la caméra connectée à l'ordinateur personnel sur l'interface graphique.
Afficher le graphique de tensorBoard sur Jupyter
Lorsque vous passez la souris sur Matplotlib, l'image correspondante s'affiche.
J'ai essayé de corriger la forme trapézoïdale de l'image
Cours ROS 119 Corriger la couleur de l'image de la caméra
J'ai essayé d'afficher le degré d'infection par le virus corona sur la carte thermique Seaborn
Essayez de mesurer la position d'un objet sur le bureau (système de coordonnées réel) à partir de l'image de la caméra avec Python + OpenCV
J'ai essayé de détecter l'iris à partir de l'image de la caméra
Essayez d'estimer le nombre de likes sur Twitter
Python Open CV a essayé d'afficher l'image sous forme de texte.
[Python] Enregistrez le résultat du scraping Web de la page produit Mercari sur Google Colab dans une feuille de calcul Google et affichez également l'image du produit.
Comment obtenir les données météorologiques actuelles et les afficher sur l'interface graphique tout en la mettant à jour automatiquement
J'ai essayé de trouver l'entropie de l'image avec python
Facilitez la compréhension de l'affichage des exceptions du module Python
[Ev3dev] Comment afficher une image bmp sur un écran LCD avec python
La fonction d'affichage d'image d'iTerm est pratique lors du traitement d'images.
Point selon l'image
Afficher les messages GUI sur Ubuntu
Composants liés du graphique
[PyQt x pySerial] Afficher une liste des ports COM connectés au PC dans la liste déroulante
J'ai essayé de créer l'image de démarrage SD de LicheePi Nano
Considérez la vitesse de traitement pour déplacer le tampon d'image avec numpy.ndarray
[Go] Créez une commande CLI pour changer l'extension de l'image
J'ai essayé d'afficher l'interface graphique sur Mac avec le système X Window
Comment utiliser Jupyter sur le frontal de Spacon ITO
Une commande pour vérifier facilement la vitesse du réseau sur la console
J'ai vérifié l'image de l'Université des sciences sur Twitter avec Word2Vec.
Comment mettre à jour la version Python de Cloud Shell dans GCP
L'histoire de l'échec de la mise à jour de "calendar.day_abbr" sur l'écran d'administration de django
Afficher le chemin absolu sur le Finder
Supplément à l'explication de vscode
J'ai essayé de transformer l'image du visage en utilisant sparse_image_warp de TensorFlow Addons
[Python] Comment spécifier la position d'affichage de la fenêtre et la taille de matplotlib
J'ai essayé d'obtenir les résultats de Hachinai en utilisant le traitement d'image
[EV3 x Python] Diffusez les images de la caméra sur votre PC en utilisant mjpg-streamer.
Comprendre comment afficher des images sur Jupyter (utilisation de imshow / matplotlib d'OpenCV)
Essayez d'imaginer les données d'élévation du National Land Research Institute avec Python
Je souhaite afficher une image sur Jupyter Notebook à l'aide d'OpenCV (mac)
Générer semi-automatiquement une description du package à enregistrer dans PyPI
[Reconnaissance d'image] Comment lire le résultat de l'annotation automatique avec VoTT
[Android] Afficher des images sur le Web dans la fenêtre info de Google Map
Téléchargez collectivement les images collées dans le corps de la pull request sur Github
Préparez une URL pour afficher vous-même l'image téléchargée par Active Storage
A propos des principales tâches de traitement d'image (vision par ordinateur) et de l'architecture utilisée
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique
L'histoire de la tentative de pousser SSH_AUTH_SOCK obsolète avec LD_PRELOAD à l'écran
Folding @ Home sur Linux Mint pour contribuer à l'analyse du nouveau virus corona
GAE --Avec Python, faites pivoter l'image en fonction des informations de rotation d'EXIF et importez-la dans Cloud Storage.