видеоплеер + opencv

взял код tkVideoPlayer и сделал под opencv. Но почему-то с каждым последующим кадром видео прогружается все дольше. В чем причина и как поправить?

import os
import datetime
import tkinter as tk
import numpy as np
import cv2
from PIL import Image, ImageTk

def update_duration():
    """ updates the duration after finding the duration """
    duration = int(tots)-1
    end_time["text"] = str(datetime.timedelta(seconds=duration))
    progress_slider["to"] = duration

def update_scale():
    """ updates the scale value """
    progress_value.set(i)
    start_time.config(text=str(datetime.timedelta(seconds=i)))

def plays():
    global i
    if i == tots - 1:
        i=0
    cap.set(cv2.CAP_PROP_POS_FRAMES, i)

    _, frame = cap.read()
    cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
    img = Image.fromarray(cv2image)
    imgtk = ImageTk.PhotoImage(image=img)
    display.imgtk = imgtk
    display.configure(image=imgtk)
    update_duration()
    update_scale()
    if play_pause_btn["text"] == "Play":
        i += 1
    elif play_pause_btn["text"] == "Pause":
        i = i
    window1.after(0, plays)

def seek(value):
    """ used to seek a specific timeframe """
    global i
    i = int(value)
    progress_value.set(i)
    seek(int(value))

def skip(value: int):
    """ skip seconds """
    global i
    if value == -5:
        i -= 5
    elif value == 5:
        i += 5
    progress_value.set(progress_slider.get() + value)
    seek(int(progress_slider.get()) + value)

def play_pause():
    global i
    """ pauses and plays """
    if play_pause_btn["text"] == "Play":
        play_pause_btn["text"] = "Pause"
    elif play_pause_btn["text"] == "Pause":
        play_pause_btn["text"] = "Play"

window1 = tk.Tk()

display = tk.Label(window1)
display.pack(expand=True, fill="both")

play_pause_btn = tk.Button(window1, text="Play", command=play_pause)
play_pause_btn.pack()

skip_plus_5sec = tk.Button(window1, text="Skip -5 sec", command=lambda: skip(-5))
skip_plus_5sec.pack(side="left")

start_time = tk.Label(window1, text=str(datetime.timedelta(seconds=0)))
start_time.pack(side="left")

progress_value = tk.IntVar(window1)

progress_slider = tk.Scale(window1, variable=progress_value, from_=0, to=0, orient="horizontal", command=seek)
progress_slider.pack(side="left", fill="x", expand=True)

end_time = tk.Label(window1, text=str(datetime.timedelta(seconds=0)))
end_time.pack(side="left")

skip_plus_5sec = tk.Button(window1, text="Skip +5 sec", command=lambda: skip(5))
skip_plus_5sec.pack(side="left")

video_name = 'test.mp4'
cap = cv2.VideoCapture(video_name)
tots = cap.get(cv2.CAP_PROP_FRAME_COUNT)
i = 0
window1.geometry('800x600')
fps = cap.get(cv2.CAP_PROP_FPS)
progress_slider.config(to=0, from_=0)
play_pause_btn["text"] = "Play"
progress_value.set(0)
plays()

window1.mainloop()

Я так понимаю проблема где-то здесь:

cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
img = Image.fromarray(cv2image)
imgtk = ImageTk.PhotoImage(image=img)
display.imgtk = imgtk
display.configure(image=imgtk)

или нет? Что-то хранит обработанные данные из-за чего с каждым кадром нагрузка на процессор растет.

Или может кто подскажет видеоплеер свыводом изображения из opencv библиотеки? Вся проблема в том, что проект основной построен на opencv, а у него конфликт сновыми версиями библиотеки av (которая работает с видео). А так же нужна библиотека кроссплатфоменная, и для windows и для linux


Ответы (0 шт):