Попытка изменить код для захвата изображения каждые 15 минут или около того (промежуток времени) - PullRequest
0 голосов
/ 16 апреля 2020

Ниже код был взят из существующего поста Kieleth, который я использую как подмножество моей большей кодовой базы. Я пытаюсь использовать его для захвата списка кадров, снятых раз в тысячу кадров + в режиме реального времени, а затем воспроизведения в замедленном режиме. Я захватил кадры, но не вижу их при вызове простой функции. Я видел в других постах, что циклы for не рекомендуются для этого типа событий, но не выяснили, как правильно отображать. Любой совет по этому вопросу будет оценен?

from tkinter import ttk
import time
import cv2
from PIL import Image,ImageTk
#import threading

root = Tk()

def video_button1():# this flips between start and stop when video button pressed.
    if root.video_btn1.cget('text') == "Stop Video":
        root.video_btn1.configure(text = "Start Video")
        root.cap.release()
    elif root.video_btn1.cget('text') == "Start Video":
        root.video_btn1.configure(text = "Stop Video")
        root.cap = cv2.VideoCapture(0)
        show_frame()

def show_frame():
#    if video_btn1.cget('text') == "Stop Video":
    global time_lapse_counter
    ret, frame = root.cap.read()
    if ret:
        frame = cv2.flip(frame, 1) #flip image
        cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
        img = Image.fromarray(cv2image)
        imgtk = ImageTk.PhotoImage(image=img) #converts img into tkinter readable format
        root.video_label.imgtk = imgtk
        if time_lapse_counter >= 20: # for Every 20 frames, capture one into time_lapse_list
            time_lapse_list.append(imgtk)
            time_lapse_counter = 0
        root.video_label.configure(image=imgtk)
        if len(time_lapse_list) == 5: # keep only 4 frames in the list *** debug purposes.
            time_lapse_list.pop(0)
        time_lapse_counter += 1
        video_loop = root.after(40, show_frame)
    else:
        root.video_btn1.configure(text = "Start Video")

def time_lapse_play():
    root.cap.release() #stop capturing video.
    for image in time_lapse_list:  
        print (image, "  ", len(time_lapse_list),"  ",time_lapse_list) #
        #*** I see the print of the pyimagexxx but nothing appears on the video***#
        imgtk = image
        root.video_label.imgtk = imgtk
        root.video_label.configure(image=imgtk)
        cv2.waitKey(500)
#    video_loop = root.after(500, time_lapse_play)

def setup_widgets(): #simple label and 2 button widget setup
    #Setup Top Right Window with pictures
    f_width, f_height = 810, 475
    root.rightframe= Frame(root, border=0, width=f_width, height = f_height)
    root.rightframe.grid(row=0, column=0, padx=10, pady=0)
    # Show video in Right Frame
    root.cap = cv2.VideoCapture(0)
    root.cap.set(cv2.CAP_PROP_FRAME_WIDTH, f_width)
    root.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, f_height)
    root.video_label = Label(root.rightframe)
    root.video_label.grid(row=0, column = 0)
    root.video_btn1 = Button(root.rightframe, fg='maroon', bg="yellow", text = "Stop Video", font=("Arial",10),height=0, width = 10, command=video_button1)
    root.video_btn1.grid(row=0, column = 1)
    root.video_btn2 = Button(root.rightframe, fg='maroon', bg="yellow", text="Time Lapse", font=("Arial",10),height=0, width = 10, command=time_lapse_play)
    root.video_btn2.grid(row=1, column = 1)

# Main Code
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
screen_resolution = str(screen_width)+'x'+str(screen_height)
root.geometry(screen_resolution)
time_lapse_counter = 0
time_lapse_list=[]
setup_widgets()
show_frame()
root.mainloop()```
...