如何在Tkinter窗口中添加CV2跟踪栏

时间:2019-01-29 12:00:54

标签: python python-3.x tkinter tkinter-layout

如何在Tkinter窗口中添加cv2跟踪栏?

我有两个队友编写的代码片段,但是很难将它们集成到同一窗口中。 我可以在单独的窗口中使用它们,但我想在同一窗口中使用它们。

在TKINTER中播放视频的代码:

import cv2
import tkinter as tk
from tkinter import *
# from tkinter import ttk
# from ttk import Frame
# import ImageTk

white       = "#ffffff"
lightBlue2  = "#adc5ed"
font        = "Constantia"
fontButtons = (font, 12)
maxWidth    = 800
maxHeight   = 480

#Graphics window
mainWindow = tk.Tk()
mainWindow.configure(bg=lightBlue2)
mainWindow.geometry('%dx%d+%d+%d' % (maxWidth,maxHeight,0,0))
mainWindow.resizable(0,0)
# mainWindow.overrideredirect(1)

mainFrame = Frame(mainWindow)
mainFrame.place(x=20, y=20)                

#Capture video frames
lmain = tk.Label(mainFrame)
lmain.grid(row=0, column=0)

cap = cv2.VideoCapture('test.mp4')

def show_frame():
    ret, frame = cap.read()

    cv2image   = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)

    img   = Image.fromarray(cv2image).resize((760, 400))
    imgtk = ImageTk.PhotoImage(image = img)
    lmain.imgtk = imgtk
    lmain.configure(image=imgtk)
    lmain.after(10, show_frame)

closeButton = Button(mainWindow, text = "CLOSE", font = fontButtons, bg = white, width = 20, height= 1)
closeButton.configure(command= lambda: mainWindow.destroy())              
closeButton.place(x=270,y=430)  

show_frame()  #Display
mainWindow.mainloop() #Starts GUI

第二段代码使用cv2显示轨迹栏并更改视频的位置。

import cv2

CURRENT_FRAME_FLAG = cv2.CAP_PROP_POS_FRAMES
TOTAL_FRAMES_FLAG = cv2.CAP_PROP_FRAME_COUNT
WIN_NAME = "Frame Grabber"
POS_TRACKBAR = "pos_trackbar"

cap = cv2.VideoCapture('C:/Users/ayush/Desktop/test.mp4')

ret, frame = cap.read()


def dummy():
    pass


def save_image():
    filename = "image_%0.5f.png" % t.time()
    cv2.imwrite(filename, frame)


def seek_callback(x):
    global frame
    i = cv2.getTrackbarPos(POS_TRACKBAR, WIN_NAME)
    cap.set(CURRENT_FRAME_FLAG, i-1)
    _, frame = cap.read()
    cv2.imshow(WIN_NAME, frame)


def mouse_callback(event,x,y,flags,param):

    if event == cv2.EVENT_LBUTTONDBLCLK:
        save_image()


def skip_frame_generator(df):

    def skip_frame():
        global frame
        cf = cap.get(CURRENT_FRAME_FLAG) - 1
        cap.set(CURRENT_FRAME_FLAG, cf+df)
        cv2.setTrackbarPos(POS_TRACKBAR, WIN_NAME, int(cap.get(CURRENT_FRAME_FLAG)))
        _, frame = cap.read()

    return skip_frame


cv2.namedWindow(WIN_NAME)
cv2.createTrackbar(POS_TRACKBAR, WIN_NAME, 0, int(cap.get(TOTAL_FRAMES_FLAG)), seek_callback)
cv2.setMouseCallback(WIN_NAME, mouse_callback)

actions = dict()

actions[ord("D")] = skip_frame_generator(10)
actions[ord("d")] = skip_frame_generator(1)
actions[ord("a")] = skip_frame_generator(-1)
actions[ord("A")] = skip_frame_generator(-10)
actions[ord("q")] = lambda: exit(0)
actions[ord("s")] = save_image

while True:

    cv2.imshow(WIN_NAME, frame)
    key = cv2.waitKey(0) & 0xFF
    actions.get(key, dummy)()

我必须将cv2跟踪栏集成到Tkinter窗口中。 我能够集成,但是由于我不知道如何在tkinter中使用工具CV2跟踪栏,所以我无能为力。

请帮助。

1 个答案:

答案 0 :(得分:0)

尝试使用tkinter Scale小部件代替cv2跟踪栏。它们稍有不同,但是应该很容易互换并大致相同。然后,您可以轻松地将它们添加到tkinter窗口/框架中。