Ошибка памяти при попытке отобразить видео в окне tkinter с помощью opencv - PullRequest
0 голосов
/ 02 августа 2020

Я пытаюсь написать код для игры и хочу отобразить видео в окне tkinter. У меня проблемы с кодом для загрузки и отображения видео, когда я использую его с кодом для игры. Но он отлично работает, когда я запускаю код для отображения видео отдельно. Это ошибка, которую я получаю

'' '

cv2.error: OpenCV(4.3.0) C:\projects\opencv-python\opencv\modules\core\src\alloc.cpp:73: error: (-4:Insufficient memory) Failed to allocate 2764800 bytes in function 'cv::OutOfMemoryError'

' '' Почему это происходит ?? Как исправить ?? Если кто-нибудь знает, как лучше отобразить видео, это тоже было бы здорово. Вот соответствующая часть моего кода

'' '

def intro(self):
    Game.clear(self)
    vid = cv2.VideoCapture("project_files\\video.mp4")
    width = vid.get(cv2.CAP_PROP_FRAME_WIDTH)
    height = vid.get(cv2.CAP_PROP_FRAME_HEIGHT)
    def get_frame():
        ret,frame = vid.read()
        if ret :
            return(ret,cv2.cvtColor(frame,cv2.COLOR_BGR2RGB))
        else :
            return(ret,None)    
    def update():
        ret,frame = get_frame()
        if ret :
            img = Image.fromarray(frame)
            photo = ImageTk.PhotoImage(image=img)
            photo.image=img
            label = Label(root,image=photo)
            label.place(relx=0.5,rely=0.5,anchor=CENTER)
            label.image=photo
            root.after(delay,update)

    delay = 15
    update()
    Game.qn_call(self,"a",iteration=0)

' '' Я новичок в tkinter и opencv, поэтому, пожалуйста, будьте проще

1 Ответ

0 голосов
/ 02 августа 2020

Спасибо за комментарий. Я решил проблему, вызвав функцию, которая уничтожает все виджеты на экране каждый раз, когда вызывается update (). Соответствующие части рабочего кода приведены ниже. '' '

def clear(self):
    for widget in root.winfo_children():
        widget.destroy()
    
def intro(self):
    Game.clear(self)
    vid = cv2.VideoCapture("project_files\\video.mp4")
    width = vid.get(cv2.CAP_PROP_FRAME_WIDTH)
    height = vid.get(cv2.CAP_PROP_FRAME_HEIGHT)
    def get_frame():
        ret,frame = vid.read()
        if ret :
            return(ret,cv2.cvtColor(frame,cv2.COLOR_BGR2RGB))
        else :
            return(ret,None)
    def update():
        Game.clear(self)    #i added this to delete the labels.
        ret,frame = get_frame()
        print(ret)
        if ret :
            img = Image.fromarray(frame)
            photo = ImageTk.PhotoImage(image=img)
            photo.image=img
            label = Label(root,image=photo)
            label.place(relx=0.5,rely=0.5,anchor=CENTER)
            label.image=photo
        root.after(delay,update)

    delay = 15
    update()
    Game.qn_call(self,"a",iteration=0)

' ''

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...