簡體   English   中英

將opencv處理的幀返回到tkinter GUI

[英]returning opencv processed frame to tkinter GUI

我正在編寫一個程序,該程序使用基於選擇的多種技術來處理視頻並具有GUI。 其中一種方法稱為背景減法,可以逐幀處理視頻。 並且我有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()

您創建了一個遞歸函數,當您調用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)

免責聲明:未經測試的代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM