Ich versuche, eine GUI zum Abspielen eines Videos zu erstellen, die den gesamten Bildschirm füllt, während die Schaltfläche für Snapshot immer noch am unteren Rand sichtbar ist. Im Moment, was ich zu tun habe, ist nur das App-Fenster selbst auf Vollbild einzustellen, was zu einem kleinen Video oben und einem riesigen "Schnappschuss" -Knopf am Button führt. Gibt es eine Möglichkeit, das Video den gesamten Bildschirm ausfüllen zu lassen?zeigt Video auf dem gesamten Bildschirm mit OpenCV und Tkiner
danke!
from PIL import Image, ImageTk
import Tkinter as tk
import argparse
import datetime
import cv2
import os
class Application:
def __init__(self, output_path = "./"):
""" Initialize application which uses OpenCV + Tkinter. It displays
a video stream in a Tkinter window and stores current snapshot on disk """
self.vs = cv2.VideoCapture('Cat Walking.mp4') # capture video frames, 0 is your default video camera
self.output_path = output_path # store output path
self.current_image = None # current image from the camera
self.root = tk.Tk() # initialize root window
self.root.title("PyImageSearch PhotoBooth") # set window title
# self.destructor function gets fired when the window is closed
self.root.protocol('WM_DELETE_WINDOW', self.destructor)
self.panel = tk.Label(self.root) # initialize image panel
self.panel.pack(padx=10, pady=10)
# create a button, that when pressed, will take the current frame and save it to file
btn = tk.Button(self.root, text="Snapshot!", command=self.take_snapshot)
btn.pack(fill="both", expand=True, padx=10, pady=10)
# start a self.video_loop that constantly pools the video sensor
# for the most recently read frame
self.video_loop()
def video_loop(self):
""" Get frame from the video stream and show it in Tkinter """
ok, frame = self.vs.read() # read frame from video stream
if ok: # frame captured without any errors
cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA) # convert colors from BGR to RGBA
self.current_image = Image.fromarray(cv2image) # convert image for PIL
imgtk = ImageTk.PhotoImage(image=self.current_image) # convert image for tkinter
self.panel.imgtk = imgtk # anchor imgtk so it does not be deleted by garbage-collector
self.root.attributes("-fullscreen",True)
#self.oot.wm_state('zoomed')
self.panel.config(image=imgtk) # show the image
self.root.after(1, self.video_loop) # call the same function after 30 milliseconds
def take_snapshot(self):
""" Take snapshot and save it to the file """
ts = datetime.datetime.now() # grab the current timestamp
filename = "{}.jpg".format(ts.strftime("%Y-%m-%d_%H-%M-%S")) # construct filename
p = os.path.join(self.output_path, filename) # construct output path
self.current_image.save(p, "JPEG") # save image as jpeg file
print("[INFO] saved {}".format(filename))
def destructor(self):
""" Destroy the root object and release all resources """
print("[INFO] closing...")
self.root.destroy()
self.vs.release() # release web camera
cv2.destroyAllWindows() # it is not mandatory in this application
# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-o", "--output", default="./",
help="path to output directory to store snapshots (default: current folder")
args = vars(ap.parse_args())
# start the app
print("[INFO] starting...")
pba = Application(args["output"])
pba.root.mainloop()
Hey CommonSense, danke für die tolle Antwort. Wenn ich Code versuche, bekomme ich cv2image = cv2.resize (cv2image, self.size, interpolation = cv2.INTER_NEAREST) Fehler: C: \ Benutzer \ David \ Downloads \ opencv-master \ opencv-master \ module \ core \ src \ alloc.cpp: 52: error: (-4) Fehler beim Zuordnen von 9191424 Bytes in der Funktion cv :: OutOfMemoryError, keine Idee warum? (ich verwende 32 Bit Python) – David
Wie viel RAM hast du und was ist deine Fullscreen-Auflösung und Länge eines Clips? Anyway, OpenCV ist sehr empfindlich auf Plattform, also habe ich versucht, Code auf 64-Bit-Win/64-Bit-Python/8 GB RAM und habe keinen Fehler mit 20 Sekunden Clip! Aber was ist mit Größenänderung mit 'Image' Bibliothek? Hast Du es versucht? Kommentieren Sie 'cv2image = cv2.resize (...)' line und rplace 'cv2image = Image.fromarray (cv2image)' mit 'cv2image = Image.fromarray (cv2image) .resize (self.size, resample = Image.NEAREST) '. – CommonSense
CommonSense, mehr oder weniger gleich, wenn ich 17% Prozess erreiche, bekomme ich den Mem-Fehler. Ich bin auf einem ziemlich starken PC, i7 7700k + 32gb Ram auf Win10 64. Ich musste 32-Bit-Python verwenden, weil ich wahrscheinlich die openCV/openCV Contrib-Module in 32bit gebaut.Du denkst das ist mein Problem? Ich kann versuchen, openCV für 64bit – David