[PYTHON] Zeigen Sie das Bild der an den PC angeschlossenen Kamera auf der GUI an.

1. Was Sie tun möchten

Das von der Kamera aufgenommene Bild wird auf dem GUI-Bildschirm angezeigt. Es bietet auch die Möglichkeit, einen Schnappschuss zu machen, wenn Sie den Auslöser an der Kamera drücken.

2. Programminhalt

  1. Richten Sie mit VideoCapture () von OpenCV eine Kamerainstanz ein.
  2. Verwenden Sie Tkinter's Canvas als Bildschirm, um das Video (Bild) anzuzeigen.
  3. Verwenden Sie OpenCV read (), um das Standbild (Frame) der Kamera zu erhalten.
  4. Das Standbild (Bild) der in 3. aufgenommenen Kamera wird auf der Leinwand von Tkinter angezeigt.
  5. Verwenden Sie Pythons update () und after (), um 3-4 zu durchlaufen. (= ** Zeigen Sie das Bild auf Leinwand an. Dies geschieht Dutzende Male pro Sekunde, sodass es wie ein Video aussieht. **)

3. Design

3.1. Kamerainstanz

Verwenden Sie VideoCapture (), um eine Kamerainstanz vcap einzurichten. Videoquelle = 0 Eingebaute Kamera video_source = 1 USB-Kamera

Zu diesem Zeitpunkt werden auch die Breite und Höhe des Videobildes erfasst.

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

Verwenden Sie Tkinter, um eine Canvas-Instanz einzurichten.

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 Holen Sie sich das Standbild der Kamera mit read ()

Verwenden Sie OpenCV read (), um das vcap-Image abzurufen. Speichern Sie die erworbene im Rahmen. Konvertieren Sie das, was Sie mit BGR erhalten haben, in RGB und speichern Sie es erneut im Frame.

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

3.4. Zeigen Sie das Standbild der Kamera auf der Leinwand von Tkinter an.

Verwenden Sie Pillow, um den erfassten Rahmen einmal in ein Foto umzuwandeln. Der Grund dafür ist, dass Canvas nur Bilder anzeigen kann, die von Pillow verarbeitet wurden. (Vielleicht) Anschließend wird das Foto auf Leinwand angezeigt.

#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 Verwenden Sie Pythons update () und after (), um 3-4 zu durchlaufen.

Stellen Sie den Aktualisierungszyklus mit Verzögerung ein. Das Gerät ist Millisekunden. Stellen Sie diesmal 15 Millisekunden ein. ** Sehen Sie, wie sich die FPS des Videos ändern, wenn Sie den Wert dieser Verzögerung ändern. ** ** ** Fügen Sie update () in den Hauptteil und after () in den Teil ein, der das Bild auf der Leinwand anzeigt.


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 Schnappschuss

Der Snapshot wird verarbeitet, indem der durch read () von OpenCV gelernte Frame in RGB konvertiert und dann als Datei mit cv2.imwrite gespeichert wird.

    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. Ausführungsergebnis

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

5. Zusammenfassung

  1. Das von der Kamera aufgenommene Bild kann auf dem GUI-Bildschirm angezeigt werden.
  2. Verwenden Sie OpenCV und Tkinter.
  3. Es ist wichtig, Pythons update () und after () zu verwenden.

6. Referenzmaterialien

1.Python OpenCV - show a video in a Tkinter window 2. [Himbeerkuchen] So zeigen Sie das Bild des Kameramoduls auf Tkinter an 3. Video mit Python, OpenCV (Datei- / Kamerabild) laden 4. Geänderte Version: Ich habe mit tkinter of Python einen Block Breaker erstellt.

7. Programmcode


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

Zeigen Sie das Bild der an den PC angeschlossenen Kamera auf der GUI an.
Zeigen Sie das Diagramm von tensorBoard auf jupyter an
Wenn Sie mit der Maus über Matplotlib fahren, wird das entsprechende Bild angezeigt.
Ich habe versucht, die Trapezform des Bildes zu korrigieren
ROS-Kurs 119 Korrigieren Sie die Farbe des Kamerabildes
Ich habe versucht, den Grad der Koronavirusinfektion auf der Seekarten-Wärmekarte anzuzeigen
Versuchen Sie, die Position eines Objekts auf dem Schreibtisch (reales Koordinatensystem) anhand des Kamerabilds mit Python + OpenCV zu messen
Ich habe versucht, Iris aus dem Kamerabild zu erkennen
Versuchen Sie, die Anzahl der Likes auf Twitter zu schätzen
Python Open CV hat versucht, das Bild im Text anzuzeigen.
[Python] Speichern Sie das Ergebnis des Web-Scrapings der Mercari-Produktseite in Google Colab in einer Google-Tabelle und zeigen Sie auch das Produktbild an.
So erhalten Sie die aktuellen Wetterdaten und zeigen sie auf der GUI an, während Sie sie automatisch aktualisieren
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Erleichtern Sie die Anzeige von Python-Modulausnahmen
[Ev3dev] So zeigen Sie ein BMP-Bild mit Python auf dem LCD an
Die Bildanzeigefunktion von iTerm ist praktisch bei der Verarbeitung von Bildern.
Punkt entsprechend dem Bild
Zeigen Sie GUI-Meldungen unter Ubuntu an
Verknüpfte Komponenten des Diagramms
[PyQt x pySerial] Zeigen Sie im Kombinationsfeld eine Liste der mit dem PC verbundenen COM-Ports an
Ich habe versucht, das SD-Boot-Image von LicheePi Nano zu erstellen
Berücksichtigen Sie die Verarbeitungsgeschwindigkeit, um den Bildpuffer mit numpy.ndarray zu verschieben
[Los] Erstellen Sie einen CLI-Befehl, um die Erweiterung des Bildes zu ändern
Ich habe versucht, die GUI auf einem Mac mit X Window System anzuzeigen
Verwendung von Jupyter am Frontend von Spacon ITO
Ein Befehl zum einfachen Überprüfen der Netzwerkgeschwindigkeit auf der Konsole
Ich habe das Bild der Science University auf Twitter mit Word2Vec überprüft.
So aktualisieren Sie die Python-Version von Cloud Shell in GCP
Die Geschichte, dass "calendar.day_abbr" auf dem Admin-Bildschirm von django nicht aktualisiert werden konnte
Zeigen Sie den absoluten Pfad im Finder an
Ergänzung zur Erklärung von vscode
Ich habe versucht, das Gesichtsbild mit sparse_image_warp von TensorFlow Addons zu transformieren
[Python] So legen Sie die Position und Größe der Fensteranzeige von matplotlib fest
Ich habe versucht, die Trefferergebnisse von Hachinai mithilfe der Bildverarbeitung zu erhalten
[EV3 x Python] Streame Kamerabilder mit mjpg-streamer auf deinen PC.
Verstehen, wie Bilder auf Jupyter angezeigt werden (Verwendung von imshow / matplotlib von OpenCV)
Versuchen Sie, die Höhendaten des National Land Research Institute mit Python abzubilden
Ich möchte ein Bild auf Jupyter Notebook mit OpenCV (Mac) anzeigen.
Erzeugt halbautomatisch eine Beschreibung des Pakets, das in PyPI registriert werden soll
[Bilderkennung] Lesen des Ergebnisses der automatischen Annotation mit VoTT
[Android] Zeigen Sie Bilder im Web im infoWindow von Google Map an
Laden Sie gemeinsam die Bilder herunter, die in den Text der Pull-Anfrage auf Github eingefügt wurden
Bereiten Sie eine URL vor, um das von Active Storage hochgeladene Bild selbst anzuzeigen
Über die Hauptaufgaben der Bildverarbeitung (Computer Vision) und die verwendete Architektur
Ich habe versucht, den Höhenwert von DTM in einem Diagramm anzuzeigen
Die Geschichte des Versuchs, SSH_AUTH_SOCK mit LD_PRELOAD auf dem Bildschirm veraltet zu halten
Folding @ Home unter Linux Mint soll zur Analyse des neuen Corona-Virus beitragen
GAE - Drehen Sie mit Python das Bild basierend auf den Rotationsinformationen von EXIF und laden Sie es in den Cloud-Speicher hoch.