возвращение обработанного фрейма opencv в графический интерфейс tkinter - PullRequest
0 голосов
/ 29 июня 2019

Я пишу программу, которая обрабатывает видео с использованием нескольких методов на основе выбора и имеет графический интерфейс.один из методов называется вычитанием фона, который обрабатывает видео кадр за кадром.и у меня есть метод show frame, который отправляет кадр в GUI после получения кадра от метода, который вызывает методы для запуска на основе выбора пользователя.проблема в том, что, если я вернул обработанный кадр с помощью return, он остановит обработку видео цикла и остановит функцию.

def DayBackgroundSubtraction():
        cap = cv2.VideoCapture ('dataset/video92.mp4')
        while cap.isOpened():
            # do Processing
            return frame
def show_frame():
    lmain = Label(bottomFrame)
    lmain.grid(row=0, column=0)
    (ret, frame) = vid_capture.read()
    # receive frame from selected techniques
    frame = whichOne()
    if ret == True:
        cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
        img = _image.fromarray(cv2image)
        imgtk = ImageTk.PhotoImage(image=img)
        lmain.imgtk = imgtk
        lmain.configure(image=imgtk)
        lmain.after(10, show_frame)
    else:
        lmain.destroy()

1 Ответ

0 голосов
/ 29 июня 2019

Вы создали рекурсивную функцию, которая никогда не завершится при вызове lmain.after(10, show_frame).Это плохо, вы видите, как функция show_frame никогда не выйдет?Я уверен, что это также вызывает странное поведение, которое вы испытываете.Вместо этого вы должны отделить вызов функции от самой функции.

    import cv2
    from PIL import ImageTk, Image
    # get camera 
    cap = cv2.VideoCapture('dataset/video92.mp4')

    def updateGUI(img):
        # convert to PIL
        img_arr = Image.fromarray(img)
        img_pi = ImageTk.PhotoImage(img_arr)
        lmain.configure(image=img_pi)

    # loop forever while camera is open
    while cap.isOpened():
            # Get a frame from the video source
            ret, frame = cap.read()
            if ret:
                    # process frame
                    processed_frame = image_processing_function(frame)
                    # get a new processed frame 
                    updateGUI(processed_frame)
                    # wait 10 ms - change value to change playback speed
            cv2.waitKey(10)

Отказ от ответственности: непроверенный код

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