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.
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 )
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)
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)
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)
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)
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 ) )
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.
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